升级 helm 模板后规格选择器无效
Invalid spec selector after upgrading helm template
我已经升级了 helm 模板(手动)
前一个 depoloyment.yaml
的片段:
apiVersion: apps/v1beta2 kind: Deployment metadata: name: {{ template "measurement-collector.fullname" . }} labels:
app: {{ template "measurement-collector.name" . }}
chart: {{ template "measurement-collector.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} selector:
matchLabels:
app: {{ template "measurement-collector.name" . }}
release: {{ .Release.Name }}
新的:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: {{ include "measurement-collector.fullname" . }}
labels:
app.kubernetes.io/name: {{ include "measurement-collector.name" . }}
helm.sh/chart: {{ include "measurement-collector.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ include "measurement-collector.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
新 service.yaml
:
name: {{ include "measurement-collector.fullname" . }}
labels:
app.kubernetes.io/name: {{ include "measurement-collector.name" . }}
helm.sh/chart: {{ include "measurement-collector.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
type: {{ .Values.service.type }}
ports:
protocol: TCP
name: http
selector:
app.kubernetes.io/name: {{ include "measurement-collector.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
然后在 运行 之后:helm upgrade -i measurement-collector chart/measurement-collector --namespace prod --wait
我得到:
Error: UPGRADE FAILED: Deployment.apps "measurement-collector" is invalid: spec.selector: Invalid value:
v1.LabelSelector{MatchLabels:map[string]string{"app.kubernetes.io/name":"measurement-collector", "app.kubernetes.io/instance":"measurement-collector"},
MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable
如果更改选择器标签,则需要在部署前先清除发布。
虽然@TigerBear的回答是正确的,但我想我需要更详细地解释一下。这个问题是由一个简单的原因引起的——选择器的不变性。您不能更新选择器(我不确定这是完整列表,请随时纠正我):
- 副本集
- 部署
- DaemonSets
换句话说,例如,如果您在选择器中有一个带有标签 'my-app: ABC'
的部署,之后您将选择器中的标签更新到此:'my-app: XYZ'
,然后简单地应用此更改,例如像这样:
kubectl apply -f deployment-file-name.yml
它不会工作 - 您必须重新创建部署。
Related github k8s issue, also there is a little note about it in the Deployment doc
我已经升级了 helm 模板(手动)
前一个 depoloyment.yaml
的片段:
apiVersion: apps/v1beta2 kind: Deployment metadata: name: {{ template "measurement-collector.fullname" . }} labels:
app: {{ template "measurement-collector.name" . }}
chart: {{ template "measurement-collector.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} selector:
matchLabels:
app: {{ template "measurement-collector.name" . }}
release: {{ .Release.Name }}
新的:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: {{ include "measurement-collector.fullname" . }}
labels:
app.kubernetes.io/name: {{ include "measurement-collector.name" . }}
helm.sh/chart: {{ include "measurement-collector.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ include "measurement-collector.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
新 service.yaml
:
name: {{ include "measurement-collector.fullname" . }}
labels:
app.kubernetes.io/name: {{ include "measurement-collector.name" . }}
helm.sh/chart: {{ include "measurement-collector.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
type: {{ .Values.service.type }}
ports:
protocol: TCP
name: http
selector:
app.kubernetes.io/name: {{ include "measurement-collector.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
然后在 运行 之后:helm upgrade -i measurement-collector chart/measurement-collector --namespace prod --wait
我得到:
Error: UPGRADE FAILED: Deployment.apps "measurement-collector" is invalid: spec.selector: Invalid value:
v1.LabelSelector{MatchLabels:map[string]string{"app.kubernetes.io/name":"measurement-collector", "app.kubernetes.io/instance":"measurement-collector"},
MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable
如果更改选择器标签,则需要在部署前先清除发布。
虽然@TigerBear的回答是正确的,但我想我需要更详细地解释一下。这个问题是由一个简单的原因引起的——选择器的不变性。您不能更新选择器(我不确定这是完整列表,请随时纠正我):
- 副本集
- 部署
- DaemonSets
换句话说,例如,如果您在选择器中有一个带有标签 'my-app: ABC'
的部署,之后您将选择器中的标签更新到此:'my-app: XYZ'
,然后简单地应用此更改,例如像这样:
kubectl apply -f deployment-file-name.yml
它不会工作 - 您必须重新创建部署。
Related github k8s issue, also there is a little note about it in the Deployment doc