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 以相同的名称推出?