【问题标题】:Why must I explicitly set a namespace for the ServiceAccount of ClusterRoleBinding.rbac.authorization.k8s.io resource?为什么必须为 ClusterRoleBinding.rbac.authorization.k8s.io 资源的 ServiceAccount 显式设置命名空间?
【发布时间】:2021-05-31 16:59:43
【问题描述】:

我正在像这样使用 helm 部署我的图表:

helm upgrade --install --namespace newnamespace --create-namespace testing mychart

我的理解是一切都应该部署到newnamespace

我的图表中有这个:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: {{ include "mychart.serviceAccountName" . }}

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: {{ include "mychart.serviceAccountName" . }}
rules:
- apiGroups: [""]
  resources: ["services","endpoints","pods"]
  verbs: ["get","watch","list"]
- apiGroups: ["extensions","networking.k8s.io"]
  resources: ["ingresses"] 
  verbs: ["get","watch","list"]
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "watch", "list"]

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: {{ include "mychart.serviceAccountName" . }}
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: {{ include "mychart.serviceAccountName" . }}
subjects:
- kind: ServiceAccount
  name: {{ include "mychart.serviceAccountName" . }}

部署时出现此错误:

Error: ClusterRoleBinding.rbac.authorization.k8s.io "my-service-account" is invalid: subjects[0].namespace: Required value

然后我添加这个并且部署工作:

...
    subjects:
    - kind: ServiceAccount
      name: {{ include "mychart.serviceAccountName" . }}
      namespace: {{ .Release.Namespace }}

这是为什么? ClusterRoleBinding 的这个要求是什么?我看不到它正在部署的命名空间吗?

是不是因为 ClusterRoleBinding 是集群范围的,它必须在其定义中定义了命名空间? ClusterRoleBinding 资源不是在任何命名空间中创建的吗?如果是的话,他们住在哪里 kube-system?

这是否意味着如果我在卸载 helm 之前删除了包含我的 helm 版本的命名空间,ClusterRoleBinding 将被留下?

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    ClusterRoleBindingClusterRole 与您的服务帐户绑定。 ClusterRoleBinding 提供集群范围内的访问权限。在集群角色中,您基本上会告诉您的服务帐户可以执行哪些操作。 ClusterRole 是一组权限,可以分配给给定集群内的资源。

    现在通过ClusterRoleBinding,您只是将ClusterRole 与您的服务帐户绑定,因为服务帐户是一个命名空间范围的对象,因此您必须像在第二部分中那样在您的主题中提供命名空间名称。

    顺便说一句,ClusterRole 是一个非命名空间资源。就 k8s 文档而言,您可以使用 ClusterRole 来:

    • 定义命名空间资源的权限并在单个命名空间内授予
    • 定义命名空间资源的权限并在所有命名空间中授予权限
    • 定义集群范围资源的权限

    另一件事也可以添加apiGroup,如 apiGroup: rbac.authorization.k8s.io

    当你创建 service account 时,你基本上是在 default 命名空间中创建的,因为它是默认的,在这里:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: {{ include "mychart.serviceAccountName" . }}
    

    作为您的最后一个问题,ClusterRole 是集群范围的,但 ClusterRoleBindingservice account 是命名空间范围的,并且就规则而言,如果您删除命名空间,那么该命名空间的所有对象都将与命名空间一起消失.

    您可以查看 k8s doc 以获得更清晰的想法。

    我又找到了一个不错的tuto

    【讨论】:

      猜你喜欢
      • 2014-12-19
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2012-09-19
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多