【问题标题】:Whats difference between "kubectl auth reconcile" and "kubectl apply" for working with RBAC?使用 RBAC 时,“kubectl auth reconcile”和“kubectl apply”有什么区别?
【发布时间】:2021-06-22 14:46:58
【问题描述】:

我有一些普通的 yaml 文件定义了一些普通的角色资源,所有的 yaml 都应该反映我的资源的期望状态。

为了让新的平均角色进入集群,我通常运行kubectl apply -f my-new-role.yaml 但现在我看到了这个(推荐!?)替代kubectl auth reconcile -f my-new-role.yaml

好的,可能存在 RBAC 关系,即绑定,但 apply 不应该做同样的事情吗?

是否存在过更新(集群)角色但不想更新其相关(集群)绑定的情况?

【问题讨论】:

    标签: kubernetes roles rbac


    【解决方案1】:

    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 命令将忽略不是RoleRoleBindingClusterRoleClusterRoleBinding 对象的任何资源,因此您可以安全地对完整清单集运行协调(请参阅:@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 更新为新的roleRefkubectl 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
    

    【讨论】:

    • @matt_j 谢谢。这个命令解决了我的问题 :) "kubectl auth reconcile -f filename.yml"
    猜你喜欢
    • 2018-04-24
    • 2019-03-01
    • 2019-12-04
    • 1970-01-01
    • 2018-05-02
    • 2018-06-14
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多