Kubernetes的Deployment
不允许在spec.selector.matchLabels
中进行补丁更改,因此任何想要更改标签的新部署(由Helm或其他方式管理)都不能使用Deployment内的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的同时保持活动状态?