Kubernetes helm或K8S是否使用spec.selector.matchLabels覆盖spec.template.metadata.labels?

Kubernetes helm或K8S是否使用spec.selector.matchLabels覆盖spec.template.metadata.labels?,kubernetes,kubernetes-helm,Kubernetes,Kubernetes Helm,我有一个图表,我正在应用头盔v3,当我在本地渲染它时,它看起来像这样 apiVersion: apps/v1 kind: Deployment metadata: name: RELEASE-NAME-generic labels: app: generic chart: generic-1.1.2 release: RELEASE-NAME heritage: Helm app.kubernetes.io/name: generic ap

我有一个图表,我正在应用头盔v3,当我在本地渲染它时,它看起来像这样

apiVersion: apps/v1
kind: Deployment
metadata:
  name: RELEASE-NAME-generic
  labels:
    app: generic
    chart: generic-1.1.2
    release: RELEASE-NAME
    heritage: Helm
    app.kubernetes.io/name: generic
    app.kubernetes.io/instance: RELEASE-NAME
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/version:
spec:
  replicas: 1
  selector:
    matchLabels:
      app: generic
      release: RELEASE-NAME
  template:
    metadata:
      labels:
        app.kubernetes.io/name: generic
        app.kubernetes.io/instance: RELEASE-NAME
    spec:
      imagePullSecrets:
      - name: ""
      containers:
        - name: generic
          image: ":"
          imagePullPolicy: IfNotPresent
          ports:
          resources:
            {}
请注意,
spec.selector.matchLabels
spec.template.metadata.labels
在此处不匹配。这可能是一个问题,但这只是一个测试

当我将它应用到集群(GKE,最新版本)并检查那里的yaml时,它看起来是这样的(大致)

spec.template.metadata.labels
已被
spec.selector.matchLabels
中的标签覆盖


现在,从工作部署的角度来看,这是有意义的,但我在K8S或Helm的任何地方都找不到记录这种行为的文档,我想知道这是否真的应该发生,或者我是否在这里发疯……

这些标签是为了查找Helm管理的资源而添加的。下面,您可以从文档中找到一些信息:

可能有助于理解标签和选择器的工作原理:

中定义的spec.selector.matchLabels 部署/statefulset/DaemonSets>=v1/beta2不能包含 helm.sh/chart标签或包含图表版本的任何标签, 因为选择器是不可变的。图表标签字符串包含 版本,因此如果指定了,则每当Chart.yaml版本 改变,赫尔姆试图改变这个不可变字段会导致 升级失败

更多信息见:

元数据项应该是一个标签 在下列情况下:

Kubernetes使用它来识别这个有用的资源 向操作员公开以查询系统。对于 例如,我们建议使用helm.sh/chart:NAME-VERSION作为标签 运算符可以方便地找到 要使用的特定图表

如果元数据项不用于查询,则应将其设置为 而是一个注释


添加这些标签是为了查找由Helm管理的资源。下面,您可以从文档中找到一些信息:

可能有助于理解标签和选择器的工作原理:

中定义的spec.selector.matchLabels 部署/statefulset/DaemonSets>=v1/beta2不能包含 helm.sh/chart标签或包含图表版本的任何标签, 因为选择器是不可变的。图表标签字符串包含 版本,因此如果指定了,则每当Chart.yaml版本 改变,赫尔姆试图改变这个不可变字段会导致 升级失败

更多信息见:

元数据项应该是一个标签 在下列情况下:

Kubernetes使用它来识别这个有用的资源 向操作员公开以查询系统。对于 例如,我们建议使用helm.sh/chart:NAME-VERSION作为标签 运算符可以方便地找到 要使用的特定图表

如果元数据项不用于查询,则应将其设置为 而是一个注释

apiVersion: apps/v1
kind: Deployment
metadata:
  name: RELEASE-NAME-generic
  labels:
    app: generic
    chart: generic-1.1.2
    release: RELEASE-NAME
    heritage: Helm
    app.kubernetes.io/name: generic
    app.kubernetes.io/instance: RELEASE-NAME
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/version:
spec:
  replicas: 1
  selector:
    matchLabels:
      app: generic
      release: RELEASE-NAME
  template:
    metadata:
      labels:
        app: generic
        release: RELEASE-NAME
    spec:
      imagePullSecrets:
      - name: ""
      containers:
        - name: generic
          image: ":"
          imagePullPolicy: IfNotPresent
          ports:
          resources:
            {}