如何为kubernetes集群中的所有名称空间创建服务帐户?

时间:2020-08-06 12:16:41

标签: kubernetes

所以我有名称空间

ns1,ns2,ns3和ns4。

我在ns1中有一个服务帐户sa1。我正在将Pod部署到使用sa1的ns2,ns4。当我查看日志时,它告诉我在ns2中找不到sa1。

错误:

创建错误:禁止“ web-test-2-795f5fd489-”广告连播:查找服务帐户ns2 / sa时出错:未找到服务帐户“ sa”

是否有一种方法可以使服务帐户在整个群集范围内?或者,我可以使用相同的机密创建多个服务帐户吗?在不同的命名空间中?

3 个答案:

答案 0 :(得分:1)

您可以使用

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kubernetes-enforce
rules:
- apiGroups: ["apps"]
  resources: ["deployments","pods","daemonsets"]
  verbs: ["get", "list", "watch", "patch"]
- apiGroups: ["*"]
  resources: ["namespaces"]
  verbs: ["get", "list", "watch"]
    
--- 
apiVersion: v1
kind: ServiceAccount

metadata:
  name: kubernetes-enforce
  namespace: kube-system
---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-enforce-logging
  namespace: cattle-logging
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubernetes-enforce
subjects:
- kind: ServiceAccount
  name: kubernetes-enforce
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-enforce-prome
  namespace: cattle-prometheus
roleRef: 
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubernetes-enforce
subjects:
- kind: ServiceAccount
  name: kubernetes-enforce
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-enforce-system
  namespace: cattle-system
roleRef: 
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubernetes-enforce
subjects:
- kind: ServiceAccount
  name: kubernetes-enforce
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-enforce-default
  namespace: default
roleRef: 
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubernetes-enforce
subjects:
- kind: ServiceAccount
  name: kubernetes-enforce
  namespace: kube-system



答案 1 :(得分:0)

由于服务帐户是命名空间范围内的资源,因此无法创建群集范围的服务帐户。这遵循最小特权原则。

您可以通过应用针对这些名称空间的服务帐户yaml,在所有必需的名称空间中创建一个具有相同名称(例如default)的服务帐户,从而轻松地将pod部署到这些名称空间。

然后,您可以使用yaml部署pod。这样,您不需要在pod中进行任何更改,因为服务帐户名称相同,尽管它具有不同的机密,并且只要您通过角色和角色绑定定义了RBAC并跨这些名称空间的所有服务帐户定义就没有关系

虽然服务帐户无法进行群集作用域限定,但是您可以使用clusterrole和clusterrolebinding进行群集作用域限定。

答案 2 :(得分:0)

例如,如果您的 namespaces 位于 values.yaml 中(即它们在某种程度上是动态的),您可以这样做:

apiVersion: v1
kind: List
items:
  {{- range $namespace := .Values.namespaces }}
  - kind: ServiceAccount
    apiVersion: v1
    metadata:
      name: <YourAccountName>
      namespace: {{ $namespace }}
  {{- end }}

您在 values.yaml 中的位置:

namespaces:
  - namespace-a
  - namespace-b
  - default