首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不停机的情况下更改k8s部署的matchLabels?

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

Stack Overflow用户
提问于 2021-03-19 02:43:56
回答 1查看 324关注 0票数 2

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

最小示例:

代码语言:javascript
运行
复制
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命令行界面步骤来实现?也许我可以编辑/删除一些东西,以保持旧的pod存活,而新的pod以相同的名称推出?

EN

回答 1

Stack Overflow用户

发布于 2021-03-19 04:29:49

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

代码语言:javascript
运行
复制
helm upgrade release -f values .

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

另外,从Kubernetes文档的Updating Deployment部分可以看出,如果且仅当部署的Pod模板(即.spec.template)更改时,才会触发部署的推出。

因此,您可以将标签更改与helm一起使用。

希望我能帮上点忙。

当心!没有尝试过的方法: kubectl有一个编辑子命令,可以让我更新ConfigMaps、PersistentVolumeClaims等。也许你可以用它来更新你的部署。语法:

代码语言:javascript
运行
复制
kubectl edit [resource] [resource-name]

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

代码语言:javascript
运行
复制
export KUBE_EDITOR=/bin/{nano,vim,yourFavEditor}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66697247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档