kubernetes 如何使用kubectl优雅地更改clusterrole

lokaqttq  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(4)|浏览(109)

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的解决方案?

ddhy6vgd

ddhy6vgd1#

您可以使用kubectl apply -f node-role.yaml,其中node-role.yaml包含ClusterRole的yaml定义,并包含您的更改。kubectl apply将更新角色(如果它已经存在)(否则创建它)。

q0qdq0h2

q0qdq0h22#

chages.yaml

rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch
  - patch #added
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - create
  - delete
- apiGroups:
  - ""
  resources:
  - pods/status
  verbs:
  - patch
  - update

字符串
使用以下bash命令更新ClusterRole

kubectl patch clusterrole system:node  --patch "$(cat changes.yaml)"


更多详情,请访问k8s official documentations

i34xakig

i34xakig3#

如果您不介意存储整个清单,那么我推荐使用Blokje 5的答案kubectl apply。但是,如果您正在寻找一个不需要存储整个清单的最小命令,那么使用kubectl patch --type 'json'有两种选择:

1 -使用'add'操作

kubectl patch clusterrole system:node --type='json' -p='[{"op": "add", "path": "/rules/0", "value":{ "apiGroups": [""], "resources": ["pods"], "verbs": ["get","list","watch","patch"]}}]'

字符串
这将在数组的开头插入新规则。由于权限是附加的,因此角色将获得所需的附加权限。

2 -使用“替换”操作

kubectl patch clusterrole system:node --type='json' -p='[{"op": "replace", "path": "/rules/0/verbs", "value":["get","list","watch","patch"]}]'


这将替换rules数组中第一个元素的verbs数组。
以下是为什么这些是您唯一的选择的解释:
kubectl patch可以使用3种不同的补丁策略。它默认使用“战略”补丁。
Deployment对象的containers数组中的元素具有唯一的name字段,因此在执行“战略”补丁时,它将替换与该字段的唯一值匹配的元素。

containers:
- name: this-is-unique-and-a-match-will-replace-this
  image: nginx


但是,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/

nxowjjhe

nxowjjhe4#

最简单的自动化方法可能是向ClusterRole添加新规则。
创建一个名为append.yaml的文件,包含以下内容:

- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - patch

字符串
然后,将此规则附加到ClusterRole的现有YAML清单中,并使用以下命令重新应用:

kubectl apply -f <(cat <(kubectl get clusterrole system:node -o yaml) append.yaml)


新规则将与pods的其他权限合并,您可以使用以下方法进行验证:

kubectl describe clusterrole system:node


最好的命令式解决方案是使用kubectl patch来对对象进行patch,但这似乎并不容易实现:

  • 如果您想使用战略补丁:ClusterRole对象的rules数组似乎使用了 replace 补丁策略,也就是说,提供的补丁将只替换现有数组,而不是与之合并。
  • 如果要使用JSON patch添加其他规则,请执行以下操作:似乎不可能向现有数组中添加深度结构化数组元素。

相关问题