我想知道是否有办法强制 Kubernetes 在部署期间使用集群中的每个节点。 这个问题是由于我所做的一些尝试引起的,我注意到这样的情况:
3 个节点的集群
我使用如下命令更新部署:
kubectl set image deployment/deployment_name my_repo:v2.1.2
Kubernetes 更新集群
最后我执行kubectl get pod
我注意到同一个节点中部署了 2 个 Pod。
所以更新后集群有这样的配置:
- 一个节点有 2 个 Pod
- 一个节点有 1 个 Pod
- 一个节点,没有任何 Pod(完全没有任何工作负载)
最佳答案
调度程序将尝试找出给定时间点最合理的调度方式,该方式稍后可能会发生变化并导致您所描述的情况。以一种或另一种方式管理此问题的两种简单方法是:
- 使用 DaemonSet 而不是 Deployment:将确保每个节点只有一个 pod(匹配 nodeSelector/tolerations 等)
使用 PodAntiAffinity :可以确保同一版本同一部署的两个 Pod 永远不会部署在同一节点上。这是我个人更喜欢的许多应用程序(除非我希望每个节点调度多个应用程序)。请注意,如果您决定将部署扩展到比节点更多的副本,则会遇到一些麻烦。 我使用的版本化 PodAntiAffinity 示例:
metadata: labels: app: {{ template "fullname" . }} version: {{ .Values.image.tag }} spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: ["{{ template "fullname" . }}"] - key: version operator: In values: ["{{ .Values.image.tag }}"] topologyKey: kubernetes.io/hostname
考虑摆弄Descheduler这就像 Kubes Scheduler 组件的邪恶双胞胎,会导致删除它们的 pod,并以不同的方式重新安排
关于deployment - 如何强制 Kubernetes 在每个节点中使用 pod 更新部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47631878/