kubernetes 升级helm模板后规格选择器无效

nwlqm0z1  于 2023-04-20  发布在  Kubernetes
关注(0)|答案(3)|浏览(110)

我已经升级了 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
yhxst69z

yhxst69z1#

如果更改选择器标签,则需要在部署之前首先清除版本。

yyyllmsg

yyyllmsg2#

虽然@TigerBear的答案是正确的,但我认为我需要更详细地解释它。这个问题是由一个简单的原因引起的-选择器的不变性。您不能更新选择器(我不确定这是完整的列表,请随时纠正我):
1.副本集
1.部署
1.守护程序集
换句话说,例如,如果你有一个选择器中带有标签'my-app: ABC'的Deployment,那么在此之后,你已经将选择器中的标签更新为:'my-app: XYZ',然后简单地应用此更改,例如像这样:

kubectl apply -f deployment-file-name.yml

它将不起作用-您必须重新创建展开。
Related github k8s问题,在Deployment文档中也有一个关于它的小注解

x3naxklr

x3naxklr3#

其他答案都是正确的,但我不明白,因为我正在处理一个舵图。在我的情况下,我改变了舵图名称,并得到了类似的错误。
我在helm/Chart.yaml中所做的更改是

apiVersion: v2
name: my-app  ==> was changed to ==> my-new-app
description: A Helm chart for Kubernetes

我没有意识到这个变化是用来命名模板中的其他东西的。特别是,部署也发生了变化。例如,

# Source: my-app/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: my-app       <<< THIS became my-new-app
      app.kubernetes.io/instance: my-app   <<< THIS became my-new-app

所以这个错误实际上与我没有直接编辑的东西有关,这就是为什么(对我来说)错误消息令人困惑的原因。
通过改变Chart Nameselector被改变了,这在运行helm upgrade时是不允许的。我也意识到helm upgrade失败的根本原因是因为kubernetes不支持这个。

相关问题