繁体   English   中英

如何在不停机的情况下更改 k8s 部署的 matchLabels?

[英]How do I change a k8s Deployment's matchLabels without downtime?

Kubernetes 类Deployment不允许在spec.selector.matchLabels中进行补丁更改,因此任何想要更改标签的新部署(由 Helm 或其他方式管理)都不能在部署中使用 RollingUpdate 功能。 在不导致停机的情况下实现新部署部署的最佳方法是什么?

最小示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: foo
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: foo
  template:
    metadata:
      labels:
        app: foo
    spec:
      containers:
        - name: foo
          image: ubuntu:latest
          command: ["/bin/bash", "-ec", "sleep infinity"]

应用它,然后将标签(matchLabels 和 metadata.labels)编辑到foo2 如果您尝试应用此新部署,k8s 将抱怨(按设计) Deployment "foo" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"app":"foo2"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable

我现在能想到的唯一方法是使用新的部署名称,这样新部署就不会尝试修补旧部署,然后删除旧部署,而入口/负载均衡器资源会处理转换。 然后我们可以使用旧名称重新部署,并删除新名称,完成迁移。

有没有办法用更少的 k8s CLI 步骤来做到这一点? 也许我可以编辑/删除一些让旧 pod 保持活力的东西,而新 pod 以相同的名称推出?

根据我的经验,当我使用 helm 时

helm upgrade release -f values .

我没有停机时间。 此外,在使用 helm 时,我注意到在 X/X 准备好新部署之前,它不会终止旧部署。 我可以建议使用它。 这样它就可以尽可能地无痛。

同样来自从 Kubernetes 文档更新部署一节中提到,当且仅当部署的 Pod 模板(即 .spec.template)发生更改时,才会触发部署的推出。

因此,您可以使用 label 更改与 helm。

希望我能帮上一点忙。

注意:未尝试过的方法,kubectl 有一个编辑子命令,它使我能够更新 ConfigMaps。 PersistentVolumeClaims 等等。也许你可以用它来更新你的 Deployment: 语法:

kubectl edit [resource] [resource-name]

但在此之前,请选择合适的文本编辑器,因为您将处理 yaml 格式的文件。 通过使用这样做,

export KUBE_EDITOR=/bin/{nano,vim,yourFavEditor}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM