如何将kubernetes守护程序集缩放为0?

lit*_*hua 7 kubernetes

当由daemonset控制的Pod时,该Pod中发生一些错误,其状态为CrashLoopBackOff,我想删除这些Pod,但不删除DaemonSet。

因此,我想将daemonset缩放为0,据我所知,DaemonSet Spec不支持pod的副本。

我要怎么去那儿?

小智 9

仅作为 Alex Vorona 对于扩展到 0 个以上节点的答案的补充:

扩展到单个节点:

kubectl -n <namespace> patch daemonset <name-of-daemon-set> -p '{"spec": {"template": {"spec": {"nodeSelector": {"kubernetes.io/hostname": "<hostname>"}}}}}'
Run Code Online (Sandbox Code Playgroud)

缩放到具有某些标签的任意数量的节点:

kubectl -n <namespace> label nodes <name-of-node> someLabel=true
kubectl -n <namespace> patch daemonset <name-of-daemon-set> -p '{"spec": {"template": {"spec": {"nodeSelector": {"someLabel": "true"}}}}}'
Run Code Online (Sandbox Code Playgroud)


Ale*_*ona 8

万一您不想删除该守护程序集,一种可能的解决方法是对任何不存在的标签使用临时的nodeSelector,例如:

kubectl -n <namespace> patch daemonset <name-of-daemon-set> -p '{"spec": {"template": {"spec": {"nodeSelector": {"non-existing": "true"}}}}}'
Run Code Online (Sandbox Code Playgroud)

这将缩小守护程序集。

这是删除临时文件的补丁nodeSelector

kubectl -n <namespace> patch daemonset <name-of-daemon-set> --type json -p='[{"op": "remove", "path": "/spec/template/spec/nodeSelector/non-existing"}]'
Run Code Online (Sandbox Code Playgroud)

这将再次扩展守护程序。

  • 谢谢,这个解决方法应该是公认的答案。 (3认同)

Han*_*ena 7

DaemonSet 确保每个节点都运行一个 Pod 的副本。所以你不能像部署一样缩小它。DaemonSet 使用 DaemonSet Controller 和 Deployment 使用 Replication Controller 进行复制。所以你可以简单地删除 DaemonSet。

如果您想备份确切的 Daemonset 部署,您可以使用以下命令并将其保存在某处并再次使用以供以后部署。

kubectl get daemonset <name-of-daemon-set> -n <namespace> -o yaml
Run Code Online (Sandbox Code Playgroud)

  • Kubernetes 作业只有退避限制。Kubernetes 的主要目标是提高应用程序的可用性并实现零停机。所以 Kubernetes 期望你的软件是好的,错误更少,我认为这就是他们没有引入这样的原因。不建议在 Kubernetes 集群中运行崩溃的应用程序。但是,如果您无法控制该软件,则此答案 /sf/ask/2579184471/ 显示了一种增加最大回退时间的方法。 (2认同)