一、Service Account的基本概念
在 Kubernetes 中,所有的 Pod 的运行都是在一个 Namespace 中,不同的 Namespace 中的 Pod 是相互隔离的。为了让 Pod 在 Kubernetes 中安全地运行,Kubernetes 引入了 Service Account 的概念。Service Account 是一个资源对象,它提供了一个安全的方式让 Pod 访问其它 Kubernetes API。
Service Account 可以使用 Kubernetes API 自身进行身份验证,同时还可以分配所需的角色(可以访问那些资源),从而提供 Kubernetes 集群中的访问控制。在 Kubernetes 集群中,每个命名空间都能够包含一个 "default" Service Account。
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-serviceaccount
二、Service Account 的创建、删除及更新
可以使用 kubectl 命令行工具创建 Service Account:
$ kubectl create serviceaccount my-serviceaccount
serviceaccount "my-serviceaccount" created
也可以使用以下 YAML 定义创建:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-serviceaccount
要删除 Service Account:
$ kubectl delete serviceaccount my-serviceaccount
serviceaccount "my-serviceaccount" deleted
更新 Service Account 中的字段(比如 annotations):
$ kubectl patch serviceaccount my-serviceaccount -p '{"metadata": {"annotations":{"description" :"This is my service account"}}}'
三、Service Account 与 RBAC
要访问 Kubernetes API,必须将 Service Account 分配给拥有访问 Kubernetes API 的角色。在授权时,需要区分不同的角色,给予他们适当的访问权限。这就是 RBAC(Role-Based Access Control):通过策略来限制授权访问。
首先,需要确定哪些角色可以访问 Kubernetes API。可以使用 Role 或 ClusterRole 定义需要访问的资源和操作。这些资源和操作通常在单个 Namespace 中可见,对于跨 Namespace 的操作需要 ClusterRole。
然后,需要为需要访问 Kubernetes API 的 Service Account 分配这些角色。这可以使用 RoleBinding 或 ClusterRoleBinding 完成。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: serviceaccount-reader
rules:
- apiGroups: [""]
resources: ["serviceaccounts"]
verbs: ["get", "watch", "list"]
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: serviceaccount-reader-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: serviceaccount-reader
subjects:
- kind: ServiceAccount
name: my-serviceaccount
四、使用 Service Account 的 Pod
在创建 Pod 时,可以指定要使用的 Service Account,也可以使用默认 Service Account。可以使用以下 YAML 定义 Pod:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
serviceAccountName: my-serviceaccount
containers:
- name: my-container
image: nginx
上面的 YAML 定义了一个名为 my-pod 的 Pod,并使用了名为 my-serviceaccount 的 Service Account。Pod 还创建了一个名为 my-container 的容器,使用了 nginx 镜像。
五、总结
Service Account 是 Kubernetes 提供的微服务身份验证的一种方式。通过分配角色,Service Account 可以访问 Kubernetes API,并提供自动化身份验证。每个命名空间均可拥有一个默认 Service Account。RBAC 可以帮助限制不同 Service Account 对 Kubernetes 资源和操作的访问权限。