在 Kubernetes (K8s) 中,ServiceAccount
是一种特殊类型的 账户对象,用于为 Pod 中的容器提供身份标识。它的核心作用是为 Pod 内的进程(如应用程序)授予对集群内资源的访问权限。以下是详细说明及查看方法:
一、什么是 ServiceAccount?
核心功能:
-
身份标识
每个ServiceAccount
都有一个唯一的名称和一个关联的加密签名密钥对(存放在 Secret 中),用于证明请求来自该账户。 -
权限控制
通过与 Role/ClusterRole + RoleBinding/ClusterRoleBinding 的组合,定义此账户能执行的操作(如读写 ConfigMap、调用外部 API 等)。 -
自动挂载凭证
当 Pod 使用了某个ServiceAccount
,Kubernetes 会自动将其凭证(包含CA证书
、命名空间
、Token
)注入到 Pod 的特定挂载点:/var/run/secrets/kubernetes.io/serviceaccount/
- 包括三个文件:
ca.crt
,namespace
,token
。
关键特点:
特性 | 说明 |
---|---|
作用域 | 可作用于单个命名空间(默认)或整个集群(需配合 ClusterRole ) |
默认行为 | 新创建的 Pod 若未显式指定 SA,则使用命名空间下的 default SA |
安全性 | 推荐遵循最小权限原则,仅授予必要权限 |
二、如何查看 ServiceAccount 对象? 以下是常用查看方式及命令示例:
- 查看当前命名空间的所有 ServiceAccount
# 查看当前命名空间的所有 SA(含简要信息)
kubectl get serviceaccounts# 显示完整详细信息(JSON/YAML格式)
kubectl get serviceaccounts -o wide # 表格+额外字段
kubectl get serviceaccounts -o json # JSON格式
kubectl get serviceaccounts -o yaml # YAML格式
- 查看指定命名空间的 ServiceAccount
# 查看名为 "my-namespace" 命名空间下的所有 SA
kubectl get serviceaccounts --namespace=my-namespace# 查看特定 SA 的详细信息(如名为 "my-sa")
kubectl describe serviceaccount my-sa --namespace=my-namespace
- 跨命名空间搜索 ServiceAccount
# 查看所有命名空间下的 SA 列表
kubectl get serviceaccounts --all-namespaces
- 导出 ServiceAccount 的配置为文件
# 将名为 "my-sa" 的 SA 配置导出为 YAML 文件
kubectl get serviceaccount my-sa -n my-namespace -o yaml > my-sa.yaml
三、典型使用场景示例
假设你有一个名为 app-pod
的 Pod,它使用了自定义的 app-sa
ServiceAccount,并绑定了一个允许读取 ConfigMap 的角色:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: app-deployment
spec:replicas: 1template:metadata: {}spec:serviceAccountName: app-sa # 指定使用的 ServiceAccountcontainers:- name: app-containerimage: my-image
此时,app-sa
就是该 Pod 的身份标识,其权限由对应的 RoleBinding 决定。
四、注意事项
-
不要混淆 IAM 账号
Kubernetes 的ServiceAccount
≠ 云厂商的 IAM 账号,它是集群内部的虚拟身份。 -
避免裸奔权限
默认的default
SA 通常没有绑定任何角色,但如果你手动绑定了高权限角色(如edit
),可能导致安全风险。 -
多租户环境隔离
在共享集群中,建议为不同团队/应用创建独立的ServiceAccount
并严格限制权限。
五、相关概念扩展
对象类型 | 描述 |
---|---|
Role / ClusterRole |
定义一组权限规则 |
RoleBinding / ClusterRoleBinding |
将角色绑定到 ServiceAccount |
Pod |
使用 ServiceAccount 的主体 |
Secret |
存储 ServiceAccount 的私钥和令牌 |
总结
ServiceAccount
是 Pod 的身份卡,用于控制容器对集群资源的访问。- 查看命令:
kubectl get serviceaccounts
(基础)、kubectl describe serviceaccount <name>
(详情)。 - 最佳实践:为每个应用创建专用 SA,并按需绑定最小权限角色。