clusterrole system:node默认数据如下:
$ kubectl get clusterrole system:node -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
name: system:node
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- pods
verbs:
- create
- delete
- apiGroups:
- ""
resources:
- pods/status
verbs:
- patch
- update
字符串
现在,我想更改clusterrole system:node
,并在pods资源下添加了一个- patch
,应该是这样的:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
- patch
型
我可以用kubectl edit
更新,但我想在bash脚本中更新,所以kubectl edit
不适合,有没有其他使用kubectl的解决方案?
4条答案
按热度按时间ddhy6vgd1#
您可以使用
kubectl apply -f node-role.yaml
,其中node-role.yaml
包含ClusterRole
的yaml定义,并包含您的更改。kubectl apply
将更新角色(如果它已经存在)(否则创建它)。q0qdq0h22#
chages.yaml
字符串
使用以下bash命令更新
ClusterRole
型
更多详情,请访问k8s official documentations
i34xakig3#
如果您不介意存储整个清单,那么我推荐使用Blokje 5的答案
kubectl apply
。但是,如果您正在寻找一个不需要存储整个清单的最小命令,那么使用kubectl patch --type 'json'
有两种选择:1 -使用'add'操作
字符串
这将在数组的开头插入新规则。由于权限是附加的,因此角色将获得所需的附加权限。
2 -使用“替换”操作
型
这将替换
rules
数组中第一个元素的verbs
数组。以下是为什么这些是您唯一的选择的解释:
kubectl patch
可以使用3种不同的补丁策略。它默认使用“战略”补丁。Deployment
对象的containers
数组中的元素具有唯一的name
字段,因此在执行“战略”补丁时,它将替换与该字段的唯一值匹配的元素。型
但是,
ClusterRole
对象的rules
数组中的元素没有需要唯一值的字段。因此,“战略”补丁无法知道您想要替换哪个元素。因此,它只是将整个数组替换为您给予的任何补丁。由于“strategic”补丁对你来说不是一个可行的选择(除非你可以替换整个rules数组),你必须求助于使用“json”补丁,它允许你显式定义数组插入和替换。
这里的缺点是,在选项1中,您可以添加权限,但不能删除它们,因为Kubernetes RBAC是纯添加性的。而在选项2中,您必须知道要替换的元素的索引。
以下是一些有用的链接:
http://jsonpatch.com/
https://kubernetes.io/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/的
nxowjjhe4#
最简单的自动化方法可能是向ClusterRole添加新规则。
创建一个名为
append.yaml
的文件,包含以下内容:字符串
然后,将此规则附加到ClusterRole的现有YAML清单中,并使用以下命令重新应用:
型
新规则将与
pods
的其他权限合并,您可以使用以下方法进行验证:型
最好的命令式解决方案是使用
kubectl patch
来对对象进行patch,但这似乎并不容易实现:rules
数组似乎使用了 replace 补丁策略,也就是说,提供的补丁将只替换现有数组,而不是与之合并。