在 Kubernetes(K8s)中,Service Account(服务账户) 是一种用于 为 Pod 中的进程提供身份认证 的机制。它允许 Pod 内的应用安全地访问 Kubernetes API 或外部服务,是实现集群内服务间认证和授权的核心组件。
一、Service Account 的核心作用
- 身份标识
- 为 Pod 提供唯一的身份标识,类似于操作系统中的用户账户,但专门用于服务和进程。
- API 访问凭证
- 自动生成并挂载 令牌(Token) 到 Pod 中,使 Pod 内的应用可以安全地调用 Kubernetes API。
- 权限控制
- 通过 RoleBinding 和 ClusterRoleBinding 与 RBAC(基于角色的访问控制) 结合,精确控制 Pod 的权限范围。
二、Service Account 的关键概念
1. 默认 Service Account
每个命名空间都会自动创建一个名为 default
的 Service Account。如果 Pod 未显式指定 Service Account,将自动使用该默认账户:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx # 未指定 serviceAccountName,默认使用 default
2. 自定义 Service Account
可创建自定义 Service Account 并分配特定权限:
apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account # 自定义名称 namespace: default
3. Token 自动挂载
当 Pod 使用 Service Account 时,Kubernetes 会自动将 Token 挂载到 Pod 内的 /var/run/secrets/kubernetes.io/serviceaccount
路径下:
/var/run/secrets/kubernetes.io/serviceaccount/ ├── ca.crt # API服务器的CA证书 ├── namespace # 当前命名空间名称 └── token # 用于身份验证的令牌
三、Service Account 与 RBAC 的结合
通过 Role 和 ClusterRole 定义权限,再通过 RoleBinding 和 ClusterRoleBinding 将权限绑定到 Service Account:
示例:授予 Service Account 读取 Pod 的权限
# 1. 定义 Role(命名空间级别权限) apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] # 2. 将 Role 绑定到 Service Account apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods subjects: - kind: ServiceAccount name: my-service-account namespace: default roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
四、Service Account 的使用场景
- Pod 访问 Kubernetes API
- 例如,监控系统的 Pod 需要查询集群中的其他 Pod 状态。
- 外部服务认证
- Pod 内的应用需要调用外部服务(如 AWS S3、GCP Storage),使用 Service Account 令牌进行认证。
- CI/CD 流水线
- 自动化工具(如 Jenkins、GitLab Runner)在集群内运行时,使用 Service Account 执行部署操作。
- 多租户隔离
- 不同租户的应用使用独立的 Service Account,通过 RBAC 限制访问范围。
五、Service Account 的配置与管理
1. 创建自定义 Service Account
kubectl create serviceaccount my-service-account
2. 为 Pod 指定 Service Account
apiVersion: v1 kind: Pod metadata: name: my-pod spec: serviceAccountName: my-service-account # 指定使用的 Service Account containers: - name: my-container image: nginx
3. 查看 Service Account 详情
kubectl describe serviceaccount my-service-account
六、最佳实践
- 最小权限原则
- 为每个应用创建专用的 Service Account,并仅授予必要的权限。
- 避免使用默认 Service Account
- 默认账户权限可能过大,建议为每个 Pod 显式指定 Service Account。
- 使用 Token 卷投影
- 对于 K8s 1.22+,优先使用
projected
卷挂载短期令牌,提高安全性。
- 对于 K8s 1.22+,优先使用
- 定期轮换 Token
- 为 Service Account 配置自动轮换机制,避免长期使用固定令牌。
- 监控异常访问
- 通过审计日志监控 Service Account 的 API 访问行为,及时发现异常。
七、Service Account vs User Account
特性 | Service Account | User Account |
---|---|---|
用途 | 为 Pod 中的进程提供身份 | 供人类用户(如管理员)使用 |
管理方式 | K8s API 自动管理 | 外部身份系统(如 LDAP、OIDC)管理 |
作用范围 | 命名空间级别(默认)或集群级别 | 集群全局 |
令牌生命周期 | 自动生成,可配置短期有效期 | 通常长期有效,需手动轮换 |
使用场景 | 服务间认证、自动化工具 | 集群管理、人工操作 |
八、总结
Service Account 是 Kubernetes 中实现服务间认证和授权的核心机制,通过为 Pod 提供身份标识和 API 访问权限,确保集群内服务的安全通信。合理配置 Service Account 并结合 RBAC 策略,是构建安全、可扩展的云原生应用的关键。