使用“kubectl 补丁”更新部署标签在 v1.18 中不起作用

Update deployment labels using “kubectl patch” does not work in v1.18

我正在尝试使用 kubectl v1.18 更新标签。

我尝试了 kubectl patch deployment my-deployment --patch "$(cat patch1.yaml)";它 returns 一个错误

部署“my-deployment”无效:spec.selector:无效值:v1.LabelSelector{MatchLabels:map[string]string{"app":"nginx"}, MatchExpressions :[]v1.LabelSelector要求(nil)}:字段不可变

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    client: user
  name:  my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: revproxy
  strategy:
     type: RollingUpdate
     rollingUpdate:
       maxUnavailable: 1
       maxSurge: 2
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: revproxy
    spec:
      containers:
      - image: nginx:1.7.9
        name: nginx
        resources: {}
      dnsPolicy: ClusterFirst
      restartPolicy: Always

补丁 yaml 是

spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx

来自文档 here

Note: In API version apps/v1, a Deployment's label selector is immutable after it gets created.

使标签选择器不可变的动机是

  1. 更改选择器会导致未定义的行为 - 用户不应更改选择器
  2. 让选择器不可变可确保它们始终匹配已创建的子级,从而防止意外批量孤立等事件发生

如果您想修改标签选择器,您必须删除现有部署并重新创建它。

修改为 metadata.labels 应该可以。