kubectl auth reconcile 命令行实用程序已添加到 Kubernetes v1.8。
正确应用 RBAC 权限是一项复杂的任务,因为您需要计算规则集之间的逻辑覆盖操作。
正如您在CHANGELOG-1.8.md 中看到的:
添加了带有 kubectl auth reconcile -f FILE 的 RBAC 协调命令。当传递包含 RBAC 角色、角色绑定、集群角色或集群角色绑定的文件时,此命令会计算覆盖并添加缺失的规则。正确应用 RBAC 权限所需的逻辑比 JSON 合并更复杂,因为您必须计算规则集之间的逻辑覆盖操作。这意味着我们不能使用 kubectl apply 更新 RBAC 角色,而不会有破坏旧客户端(例如控制器)的风险。
kubectl auth reconcile 命令将忽略不是Role、RoleBinding、ClusterRole 和ClusterRoleBinding 对象的任何资源,因此您可以安全地对完整清单集运行协调(请参阅:@987654322 @)
我创建了一个示例来演示 kubectl auth reconcile 命令的实用性。
我有一个简单的secret-readerRoleBinding,我想更改绑定的roleRef(我想更改此绑定所指的Role):
注意: 绑定到不同角色是根本不同的绑定(请参阅:A binding to a different role is a fundamentally different binding)。
# BEFORE
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: secret-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: secret-reader
subjects:
- kind: ServiceAccount
name: service-account-1
namespace: default
# AFTER
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: secret-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: secret-creator
subjects:
- kind: ServiceAccount
name: service-account-1
namespace: default
众所周知,roleRef 是不可变的,因此无法使用 kubectl apply 更新此 secret-admin RoleBinding:
$ kubectl apply -f secret-admin.yml
The RoleBinding "secret-admin" is invalid: roleRef: Invalid value: rbac.RoleRef{APIGroup:"rbac.authorization.k8s.io", Kind:"Role", Name:"secret-creator"}: cannot change roleRef
相反,我们可以使用kubectl auth reconcile。如果RoleBinding 更新为新的roleRef,kubectl auth reconcile 命令会为我们处理删除/重新创建相关对象。
$ kubectl auth reconcile -f secret-admin.yml
rolebinding.rbac.authorization.k8s.io/secret-admin reconciled
reconciliation required recreate
此外,您可以使用--remove-extra-permissions 和--remove-extra-subjects 选项。
最后,我们可以检查一下是否一切都更新成功了:
$ kubectl describe rolebinding secret-admin
Name: secret-admin
Labels: <none>
Annotations: <none>
Role:
Kind: Role
Name: secret-creator
Subjects:
Kind Name Namespace
---- ---- ---------
ServiceAccount service-account-1 default