启动 systemd 服务时如何传递标志?

启动 systemd 服务时如何传递标志?

请注意,有人问过类似的问题:
如何在启动“服务”时传递标志?
但是我之前读到过 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

这里可以这样做:

  1. 创建一个参数文件/etc/.argconf

    ARG1=-o
    ARG2=--verbose
    
  2. 您的 .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>.servicesystemd 时,实际上执行 /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以便在必要时将其添加回来。

相关内容