首页 > 解决方案 > 使用“kubectl patch”更新部署标签在 v1.18 中不起作用

问题描述

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

我试过 kubectl 补丁部署 my-deployment --patch "$(cat patch1.yaml)"; 它返回一个错误

部署“my-deployment”无效:spec.selector:无效值:v1.LabelSelector{MatchLabels:map[string]string{"app":"nginx"},MatchExpressions:[]v1.LabelSelectorRequirement(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

标签: kuberneteskubectl

解决方案


这里的文档

注意:在 API 版本 apps/v1 中,Deployment 的标签选择器在创建后是不可变的。

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

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

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

修改为 onlymetadata.labels应该可以工作。


推荐阅读