如何强制Kubernetes在每个节点中使用pod更新部署

时间:2017-12-04 11:02:45

标签: deployment kubernetes google-cloud-platform

我想知道在部署期间是否有办法强制Kubernetes使用群集中的每个节点。 问题是由于我做了一些尝试,我注意到这样的情况:

  • 3个节点的集群

  • 我使用如下命令更新部署:kubectl set image deployment/deployment_name my_repo:v2.1.2

  • Kubernetes更新群集

最后我执行kubectl get pod,我注意到在同一节点中部署了2个pod。 因此,在更新之后,群集具有以下配置:

  • 一个包含2个广告连播的节点
  • 一个节点,包含1个pod
  • 一个没有任何pod的节点(完全没有任何工作量)

2 个答案:

答案 0 :(得分:2)

调度程序将尝试在给定的时间点找出最合理的调度方式,这可以在以后更改并导致您描述的情况。以这种或那种方式管理这两种方式的两种简单方法是:

  • 使用DaemonSet而不是部署:将确保每个节点只有一个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,让他们以不同的方式重新安排

答案 1 :(得分:0)

我尝试了一些解决方案,目前正在进行的工作只是基于对我在 DaemonSet 控制器上的deployment.yaml 中的版本进行更改。

我的意思是:

1)我必须基于带有一些容器的pod来部署我的应用程序。这些pod应该部署在每个集群节点上(我有3个节点)。 我在yaml文件中设置了部署设置,选项replicas等于3:

apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    app: webpod  
spec:
  replicas: 3
....

<击>

我在yaml文件中设置了守护进程(或ds),其中 updateStrategy 选项等于 RollingUpdate

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: my-daemonset

spec:
  updateStrategy:
    type: RollingUpdate
...

我的一个容器使用的版本是2.1例如

2)我使用以下命令执行部署:kubectl apply -f my-deployment.yaml

我使用以下命令执行部署:kubectl apply -f my-daemonset.yaml

3)我为每个节点都没有问题

4)现在我想更新部署,更改我用于其中一个容器的映像版本。 所以我只需用2.2更改yaml文件编辑2.1。然后我重新启动命令:kubectl apply -f my-deployment.yaml

所以我可以使用以下命令更改图像的版本(2.1 - > 2.2):

kubectl set image ds/my-daemonset my-container=my-repository:v2.2

5)再次,我为每个节点获得一个pod而没有问题

如果我使用命令,行为会有很大差异:

kubectl set image deployment/my-deployment my-container=xxxx:v2.2

在这种情况下,我得到一个错误的结果,其中一个节点有2个pod,一个节点1 pod和最后一个没有任何pod的节点......

要了解部署如何发展,我可以启动命令:

kubectl rollout status ds/my-daemonset

获得类似的东西

Waiting for rollout to finish: 0 out of 3 new pods have been updated...
Waiting for rollout to finish: 0 out of 3 new pods have been updated...
Waiting for rollout to finish: 1 out of 3 new pods have been updated...
Waiting for rollout to finish: 1 out of 3 new pods have been updated...
Waiting for rollout to finish: 1 out of 3 new pods have been updated...
Waiting for rollout to finish: 2 out of 3 new pods have been updated...
Waiting for rollout to finish: 2 out of 3 new pods have been updated...
Waiting for rollout to finish: 2 out of 3 new pods have been updated...
Waiting for rollout to finish: 2 of 3 updated pods are available...
daemon set "my-daemonset" successfully rolled out