您的位置:

k8s Service Account详解


一、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 资源和操作的访问权限。