Kubernetes Handbook 项目:深入理解 Pod 的 Service Account 配置
什么是 Service Account
在 Kubernetes 集群中,Service Account 为 Pod 中的进程提供身份认证信息。与普通用户账号不同,Service Account 是专门为运行在 Pod 中的进程设计的,用于控制这些进程如何与 Kubernetes API 服务器交互。
默认 Service Account 工作机制
当您创建一个 Pod 时,如果没有显式指定 Service Account,Kubernetes 会自动为 Pod 分配所在命名空间下的 default
Service Account。这一行为可以通过检查 Pod 的 YAML 配置确认:
spec:
serviceAccountName: default
默认情况下,Kubernetes 会自动将 Service Account 的凭证挂载到 Pod 的 /var/run/secrets/kubernetes.io/serviceaccount
目录下,包含以下文件:
ca.crt
: 集群的 CA 证书namespace
: Pod 所在的命名空间token
: 用于认证的 JWT 令牌
高级配置选项
禁用自动挂载凭证
在 Kubernetes 1.6 及以上版本中,您可以选择禁用 Service Account 凭证的自动挂载:
- 在 Service Account 级别禁用:
apiVersion: v1
kind: ServiceAccount
metadata:
name: build-robot
automountServiceAccountToken: false
- 在 Pod 级别禁用:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
serviceAccountName: build-robot
automountServiceAccountToken: false
注意:如果同时在 Pod 和 Service Account 中设置了此选项,Pod 级别的设置优先级更高。
使用 Service Account 进行权限管理
创建 Service Account
kubectl create serviceaccount sample-sc
创建后会生成一个关联的 Secret,其中包含访问令牌:
apiVersion: v1
kind: Secret
metadata:
name: sample-sc-token-9x7nk
type: kubernetes.io/service-account-token
data:
token: <base64编码的JWT令牌>
ca.crt: <集群CA证书>
namespace: <命名空间>
定义角色权限
创建 ClusterRole 定义访问权限:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: viewer-role
rules:
- apiGroups: [""]
resources: ["pods", "services", "deployments"]
verbs: ["get", "list", "watch"]
绑定角色到 Service Account
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: sample-role-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: viewer-role
subjects:
- kind: ServiceAccount
name: sample-sc
namespace: default
配置 kubeconfig
使用 Service Account 的令牌配置 kubeconfig:
users:
- name: cluster-viewer
user:
token: <从Secret中获取的解码后的JWT令牌>
多 Service Account 管理
每个命名空间都有一个默认的 default
Service Account。您可以创建额外的 Service Account 来满足不同 Pod 的安全需求。
创建新 Service Account:
kubectl create serviceaccount build-robot
在 Pod 中指定使用的 Service Account:
spec:
serviceAccountName: build-robot
手动管理 Service Account 令牌
您可以手动创建 Secret 并关联到 Service Account:
apiVersion: v1
kind: Secret
metadata:
name: build-robot-secret
annotations:
kubernetes.io/service-account.name: build-robot
type: kubernetes.io/service-account-token
为 Service Account 添加 ImagePullSecret
- 首先创建 ImagePullSecret:
kubectl create secret docker-registry myregistrykey \
--docker-server=DOCKER_REGISTRY_SERVER \
--docker-username=DOCKER_USER \
--docker-password=DOCKER_PASSWORD \
--docker-email=DOCKER_EMAIL
- 将 ImagePullSecret 添加到 Service Account:
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'
这样,该命名空间下所有使用默认 Service Account 的 Pod 都会自动包含这个 ImagePullSecret。
最佳实践
- 最小权限原则:为每个工作负载创建专用的 Service Account,并只授予必要的权限
- 定期轮换令牌:定期更新 Service Account 的令牌
- 禁用不必要的自动挂载:对于不需要访问 API 服务器的 Pod,禁用凭证自动挂载
- 使用命名空间隔离:在不同命名空间中创建 Service Account 以实现更好的隔离
通过合理配置 Service Account,您可以实现 Kubernetes 集群中工作负载的精细权限控制,提高集群的安全性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考