如何使用kubectl优雅地更改clusterrole

时间:2019-09-23 08:27:44

标签: kubernetes

默认情况下,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

现在,我想更改簇角色system:node,在pods资源下添加一个- patch,应该这样:

- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch
  - patch

我可以使用kubectl edit对其进行更新,但是我想在bash脚本中对其进行更新,因此kubectl edit不适合,是否还可以使用kubectl来解决其他问题?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

最简单的自动化方法可能是向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对象,但这似乎不容易实现:

  • 如果要使用strategic patch:ClusterRole对象的rules数组似乎使用 replace patch strategy,即提供的补丁只会替换现有数组而不是与之合并。
  • 如果您想使用JSON patch添加一条附加规则:似乎无法在现有数组中添加深度结构化的数组元素。