小编snu*_*ash的帖子

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

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"]
Run Code Online (Sandbox Code Playgroud)

应用此命令,然后将标签(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 以相同的名称推出?

migration deployment downtime kubernetes

9
推荐指数
1
解决办法
2757
查看次数

标签 统计

deployment ×1

downtime ×1

kubernetes ×1

migration ×1