Как передать флаги при запуске службы systemd?
Обратите внимание, что аналогичный вопрос был задан:
Как передать флаги при запуске "сервиса"?
Но я прочитал некоторое время назад, что Linux переключился с init.d на systemd, и с тех пор, как этому Q&A исполнилось 6 лет, я подумал, что это может относиться к init.d
Мой вопрос:
Как вы передаете флаги / аргументы при запуске службы systemd? Допустим, я перезагружаю systemctl Kubelet, это означает, что у меня запущена служба Kubelet, ну как я могу увидеть и изменить флаги / аргументы, передаваемые этой службе? (Например, --anonymous-auth=false)
Также вот немного контекста:
Я близок к планированию моего сертификационного экзамена CNCF Kubernetes, экзамен основан на производительности и охватывает некоторые мелочи, которые обычно отвлекаются от администратора кластера.
Что я узнал, так это то, что есть 7 основных двоичных файлов, которые составляют Kubernetes: [docker, etcd, kube-apiserver, kube-controller-manager, kube-планировщик, kube-proxy и kubelet]
Некоторые из этих двоичных файлов плоскости управления Kubernetes "размещаются самостоятельно"/ выполняются как модули в Kubernetes, и вы передаете аргументы / флаги, например --service-cluster-ip-range=10.0.0.0/16
Следующий URL-адрес содержит пример некоторых основных двоичных файлов, выполняемых как контейнеры Docker в Kubernetes, и флаги, передаваемые как аргументы в спецификации YAML. https://kubernetes.io/docs/setup/scratch/
Другие основные бинарные файлы Kubernetes, такие как Kubelet и Docker, не очень подходят для самостоятельного хостинга и вместо этого работают как демоны системы Linux, и они работают с использованием systemd и управляются с помощью systemctl и journalctl. В любом случае мне приходилось входить в систему узла и выполнять systemctl restart docker.service и systemctl restart kubelet.service раньше, но я не знаю, как посмотреть или изменить какие флаги / аргументы им передаются.
4 ответа
Отсюда это можно сделать так:
Создайте файл аргументов, скажем
/etc/.argconf
ARG1=-o ARG2=--verbose
И ваш файл.service:
EnvironmentFile=/etc/.progconf ExecStart = /usr/bin/prog $ARG1 $ARG2
Другой метод из того же поста, как показано ниже:
[Unit]
Description=Test passing multiple arguments
[Service]
Environment="SCRIPT_ARGS=%I"
ExecStart=/tmp/test.py $SCRIPT_ARGS
И имя файла должно быть myseervice@.service
принять к сведению @
поскольку это требуется при передаче аргументов таким способом в службу. Затем вы запускаете этот сервис так:
sudo systemctl start myseervic@"arg1 arg2 arg3".service
TL;DR
Когда мы бежим
systemctl start <name>.service
systemd действительно выполняет/lib/systemd/system/<name>.service
Это может быть полезно для других новичков вроде меня.
Запустим сервис и проверим статус (неудачно или успешно):
systemctl start <name>.service
systemctl status <name>.service
Вы найдете эту строку на выходе для статуса:
/lib/systemd/system/<name>.service
Это файловая система, которую выполняет. Если вы пойдете по этому пути и откроете с помощью Vim, это будет структура, показанная принятым ответом.
Что касается того, где разместить файлы, я не могу высказать своего мнения, но, по крайней мере, мы знаем, какую файловую систему читает.
Точно так же, как каждая реализация / вкус / распространение Linux немного отличается.
Я узнал, что каждая реализация Kuberntes немного отличается.
И что есть разные способы реализации systemd.
При всей этой изменчивости я считаю, что лучший способ сделать это, по-видимому:
Чтобы использовать команду find, чтобы найти, где находится *.service
WorkerNodeBash# find / -name "*.service" | grep -i "кубе"
WorkerNodeBash # nano /etc/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/kubernetes/kubernetes
After=containerd.service
Requires=containerd.service
[Service]
ExecStart=/usr/local/bin/kubelet \
--config=/var/lib/kubelet/kubelet-config.yaml \
--container-runtime=remote \
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
--image-pull-progress-deadline=2m \
--kubeconfig=/var/lib/kubelet/kubeconfig \
--network-plugin=cni \
--register-node=true \
--pod-manifest-path=/etc/kubernetes/manifests \
--v=2
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
(Вышеизложенное исходит от Kubernetes для реализации сложного способа, я также выполнил kubeadm, посмотрел в этом же файле и не увидел аргументов, но благодаря изучению использования команды find я смог выполнить поиск:
WorkerNodeBash # find / -type f -name "*.yaml" | греп "кубе"
И я нашел файл конфигурации, в котором упоминалось KUBELET_EXTRA_ARGS=, и передал их туда.
В то время как systemd выполняет файл, найденный в:
/lib/systemd/system/<name>.service
если вы посмотрите, вы найдете файл
<name>.service
это ссылка на файл в формате .
Это значит, что вы можете удалить файл из
/etc/systemd/system
но все еще есть файл в
/lib/systemd/system
чтобы позволить вам добавить его обратно, если или когда это необходимо.