所以我有名称空间
ns1,ns2,ns3和ns4。
我在ns1中有一个服务帐户sa1。我正在将Pod部署到使用sa1的ns2,ns4。当我查看日志时,它告诉我在ns2中找不到sa1。
错误:
创建错误:禁止“ web-test-2-795f5fd489-”广告连播:查找服务帐户ns2 / sa时出错:未找到服务帐户“ sa”
是否有一种方法可以使服务帐户在整个群集范围内?或者,我可以使用相同的机密创建多个服务帐户吗?在不同的命名空间中?
答案 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