在 Kubernetes (K8s) 中,ServiceAccount
是一种专门用于控制 Pod 与 Kubernetes API 之间交互的资源。它提供身份验证的凭据,通常用于向 Pod 授予访问 Kubernetes API 的权限。
1. ServiceAccount 的概念
默认情况下,Kubernetes 集群会自动为每个 Pod 分配一个默认的 default
ServiceAccount。ServiceAccount
本质上是 K8s 内部的一种身份标识,用于关联 Pod 与相关的权限。
2. ServiceAccount 的用途
- 授予 Pod 访问 Kubernetes API 的权限。
- 结合 RBAC (Role-Based Access Control) 实现细粒度的权限控制。
- 配合 Kubernetes 中的身份认证、访问控制和审计功能。
- 用于在 Kubernetes 中运行需要访问 K8s API 的应用程序(如 Operators、Controllers)。
3. 创建和使用 ServiceAccount
3.1 创建 ServiceAccount
需要定义一个 ServiceAccount 的 YAML 文件 service-account.yaml
:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
namespace: default
执行以下命令来创建:
kubectl apply -f service-account.yaml
3.2 将 ServiceAccount 绑定到 Pod
需要在 Pod 的 YAML 文件中指定 serviceAccountName
,例如 my-pod.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: default
spec:
serviceAccountName: my-service-account
containers:
- name: my-container
image: nginx
执行以下命令来创建 Pod:
kubectl apply -f my-pod.yaml
3.3 查看 ServiceAccount
使用以下命令查看集群中的 ServiceAccount:
kubectl get serviceaccounts
4. 查询 ServiceAccount
可以使用多种方式来查询 ServiceAccount 的详细信息:
4.1 列出所有 ServiceAccount
列出当前命名空间中的所有 ServiceAccount:
kubectl get serviceaccounts
如果需要查看其他命名空间的 ServiceAccount,可以使用 -n
选项:
kubectl get serviceaccounts -n <namespace-name>
4.2 查看特定 ServiceAccount 的详细信息
可以使用 kubectl describe
命令查看 ServiceAccount 的详细信息:
kubectl describe serviceaccount my-service-account
4.3 查看 ServiceAccount 关联的 Secret
执行以下命令列出所有关联的 Secret:
kubectl get secrets
并通过以下命令查看 Secret 的详细信息:
kubectl describe secret <secret-name>
5. RBAC 与 ServiceAccount
可以为 ServiceAccount 配置 RBAC 权限,例如赋予 my-service-account
读取 Pod 列表的权限。
5.1 创建 Role
定义一个 role.yaml
文件,包含如下内容:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
执行以下命令来创建 Role:
kubectl apply -f role.yaml
5.2 创建 RoleBinding
定义一个 rolebinding.yaml
文件,绑定 my-service-account
到 pod-reader
角色:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: default
subjects:
- kind: ServiceAccount
name: my-service-account
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
执行以下命令来创建 RoleBinding:
kubectl apply -f rolebinding.yaml
6. ServiceAccount 的 Token
每个 ServiceAccount
都会自动创建一个 Secret,包含访问 Kubernetes API 所需的 token。可以通过以下命令查看:
kubectl get secrets
也可以通过描述 ServiceAccount
看到关联的 Secret:
kubectl describe serviceaccount my-service-account
7. 使用场景
- 授权某个 Pod 访问集群中的资源。
- 安全运行需要 Kubernetes API 交互的自定义控制器。
- 与 GitOps 或 CI/CD 相关的工作负载集成。
通过正确地创建和配置 ServiceAccount
,可以在 Kubernetes 集群中实现更安全、灵活的权限管理。如需更多细化配置或有其他问题,欢迎继续交流!