Kubernetes

Kubernetes(k8s) Service Accounts 介绍

在 Kubernetes(K8s)中,Service Account(服务账户) 是一种用于 为 Pod 中的进程提供身份认证 的机制。它允许 Pod 内的应用安全地访问 Kubernetes API 或外部服务,是实现集群内服务间认证和授权的核心组件。

一、Service Account 的核心作用


  1. 身份标识
    • 为 Pod 提供唯一的身份标识,类似于操作系统中的用户账户,但专门用于服务和进程。
  2. API 访问凭证
    • 自动生成并挂载 令牌(Token) 到 Pod 中,使 Pod 内的应用可以安全地调用 Kubernetes API。
  3. 权限控制
    • 通过 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 的使用场景


  1. Pod 访问 Kubernetes API
    • 例如,监控系统的 Pod 需要查询集群中的其他 Pod 状态。
  2. 外部服务认证
    • Pod 内的应用需要调用外部服务(如 AWS S3、GCP Storage),使用 Service Account 令牌进行认证。
  3. CI/CD 流水线
    • 自动化工具(如 Jenkins、GitLab Runner)在集群内运行时,使用 Service Account 执行部署操作。
  4. 多租户隔离
    • 不同租户的应用使用独立的 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

六、最佳实践


  1. 最小权限原则
    • 为每个应用创建专用的 Service Account,并仅授予必要的权限。
  2. 避免使用默认 Service Account
    • 默认账户权限可能过大,建议为每个 Pod 显式指定 Service Account。
  3. 使用 Token 卷投影
    • 对于 K8s 1.22+,优先使用 projected 卷挂载短期令牌,提高安全性。
  4. 定期轮换 Token
    • 为 Service Account 配置自动轮换机制,避免长期使用固定令牌。
  5. 监控异常访问
    • 通过审计日志监控 Service Account 的 API 访问行为,及时发现异常。

七、Service Account vs User Account


特性Service AccountUser Account
用途为 Pod 中的进程提供身份供人类用户(如管理员)使用
管理方式K8s API 自动管理外部身份系统(如 LDAP、OIDC)管理
作用范围命名空间级别(默认)或集群级别集群全局
令牌生命周期自动生成,可配置短期有效期通常长期有效,需手动轮换
使用场景服务间认证、自动化工具集群管理、人工操作

八、总结


Service Account 是 Kubernetes 中实现服务间认证和授权的核心机制,通过为 Pod 提供身份标识和 API 访问权限,确保集群内服务的安全通信。合理配置 Service Account 并结合 RBAC 策略,是构建安全、可扩展的云原生应用的关键。