kubernetes - 使用“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
解决方案
注意:在 API 版本 apps/v1 中,Deployment 的标签选择器在创建后是不可变的。
使标签选择器不可变的动机是
- 更改选择器会导致未定义的行为 - 用户不应该更改选择器
- 让选择器不可变可确保它们始终匹配创建的子代,防止意外批量孤儿等事件
如果要修改标签选择器,则必须删除现有部署并重新创建它。
修改为 onlymetadata.labels
应该可以工作。
推荐阅读
- d3.js - 当 y 值为 0 时,dc.js 中的折线图问题
- java - Base 64 编码问题。(意外的加号)
- ios - Swift 线程 1:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)
- node.js - 似乎无法在“连接”之外的命名空间中的 socketio 中接收来自客户端的事件
- git - 我可以将更改的文件添加到已合并的 gerrit 中吗?
- mysql - 在 MySQL 中同时插入的行的插入触发器出错之前?
- pandas - 获取某些熊猫数据框会导致循环语句
- sql - Presto 按常用名称划分行对
- mysql - 为什么会发生插入错误 1062,虽然它不应该发生?
- freeradius - FreeRADIUS 错误由于配置不安全而拒绝启动