请注意,有人问过类似的问题:
如何在启动“服务”时传递标志?
但是我之前读到过 Linux 从 init.d 切换到 systemd,而且由于那篇问答已经有 6 年了,所以我想它可能指的是 init.d
我的问题是:
启动 systemd 服务时如何传递标志/参数?假设我执行 systemctl restart Kubelet,这意味着我已经运行了 Kubelet 服务,那么我如何查看和修改传递给该服务的标志/参数?(例如 --anonymous-auth=false)
这里还有一些背景信息:
我即将安排 CNCF Kubernetes 认证考试,该考试以表现为基础,涵盖一些通常从集群管理员那里抽象出来的细节内容。
我了解到,Kubernetes 由 7 个核心二进制文件组成:[docker、etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy 和 kubelet] 其中一些
Kubernetes 控制平面二进制文件是“自托管”/作为 Kubernetes 上的 pod 运行,并且您传递参数/标志,例如 --service-cluster-ip-range=10.0.0.0/16
以下 URL 包含一些核心二进制文件作为 Kubernetes 上的 Docker 容器运行的示例,以及作为 YAML 规范中的参数传入的标志。
https://kubernetes.io/docs/setup/scratch/#scheduler-pod-template
其他核心 Kubernetes 二进制文件(如 Kubelet 和 Docker)不太适合自托管,而是作为 Linux 系统守护进程运行,它们使用 systemd 运行,并通过 systemctl 和 journalctl 进行管理。无论如何,我之前必须登录到节点并执行 systemctl restart docker.service 和 systemctl restart kubelet.service,但我实际上不知道如何查看或修改传递给它们的标志/参数。
答案1
从这里可以这样做:
创建一个参数文件
/etc/.argconf
ARG1=-o ARG2=--verbose
您的 .service 文件:
EnvironmentFile=/etc/.argconf ExecStart=/usr/bin/prog $ARG1 $ARG2
同一篇文章中的另一种方法如下所示:
[Unit]
Description=Test passing multiple arguments
[Service]
Environment="SCRIPT_ARGS=%I"
ExecStart=/tmp/test.py $SCRIPT_ARGS
并且必须[email protected]
记下文件的名称@
,因为以这种方式将参数传递给服务时需要这样做。然后,您可以像这样运行该服务:
sudo systemctl start myservice@"arg1 arg2 arg3".service
答案2
总结
当我们运行
systemctl start <name>.service
systemd 时,实际上执行/lib/systemd/system/<name>.service
这可能对我这样的其他新手有帮助。
让我们运行一项服务并检查状态(失败或成功):
systemctl start <name>.service
systemctl status <name>.service
您将在状态输出中找到此行:
/lib/systemd/system/<name>.service
这是 systemd 执行的文件。如果你按照该路径并使用 Vim 打开,它就是所接受的答案所显示的结构。
至于文件放在哪里,我无法给出意见,但至少我们知道什么文件systemd 正在读取。
答案3
就像 Linux 的每个实现/风格/发行版都略有不同一样。
我了解到 Kuberntes 的每个实现都略有不同。
并且有多种实现 systemd 的方法。
考虑到所有这些变化,我认为最好的方法似乎是:
使用 find 命令查找 *.service 所在的位置
WorkerNodeBash# find / -name "*.service" | grep -i "kube"
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" | grep "kube"
我找到了一个提到 KUBELET_EXTRA_ARGS= 的配置文件,并将它们传递到那里。
答案4
虽然 systemd 确实执行了在以下位置找到的文件:
/lib/systemd/system/<name>.service
如果你查看,/etc/systemd/system
你会发现一个文件<name>.service
,它是指向 中的文件的链接/lib/systemd/system
。
这样您就可以删除该文件/etc/systemd/system
但仍保留该文件/lib/systemd/system
以便在必要时将其添加回来。