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

标签 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 个 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/

相关文章:

azure - 如何访问Azure中的数据-从GCP拉取数据

deployment - 如何使用 Deployment Manager (Google Cloud Platform) 创建文件夹和项目

javascript - Firebase制定安全规则以仅允许获取查询的大小

deployment - 将大型 *.war 部署到 tomcat 的最佳方法

sql-server - SSIS -- 未能部署项目。错误 27203

kubernetes - 如何使用 kubeadm 创建 kubernetes 集群?

kubernetes - 我可以在 K8s DNS 中添加服务名称别名,就像在 Docker 中链接可以具有别名一样吗?

Qt部署;程序入口点...无法定位

azure - 使用 Azure DevOps 将 Umbraco v8 应用程序部署到 Azure

kubernetes - 使用kubectl创建Daemonset?