在 Kubernetes 里,ServiceAccount(服务账号) 是一种“身份凭证”,专门给 Pod(以及在 Pod 中运行的应用)用的。
它的作用有点像一个系统用户账号,但它不是给人用的,而是给 程序 / 服务 用的。
1. 为什么需要 ServiceAccount
-
在 K8s 中,Pod 里的程序可能需要访问 API Server(比如读取 ConfigMap、创建 Pod、列出节点等)。
-
K8s 不会让所有 Pod 都用管理员权限访问 API Server(安全风险太大)。
-
ServiceAccount 就是用来:
-
识别 Pod 的身份(Pod 是谁)
-
授予访问 API 的权限(配合 RBAC)
-
2. 它包含什么
一个 ServiceAccount 对象主要包含:
-
名字(
metadata.name) -
一个或多个 Secret(里面有 token、CA 证书等,用于 API 认证)
-
自动挂载到 Pod 的 token 文件(默认挂载在
/var/run/secrets/kubernetes.io/serviceaccount)
3. 默认行为
-
如果你创建 Pod 时没指定
serviceAccountName,K8s 会自动用default这个 ServiceAccount。 -
这个
defaultServiceAccount 默认没什么权限(只是能访问 API Server 基础信息)。 -
如果你要让某个 Pod 有更高权限,就要:
-
创建一个新的 ServiceAccount
-
用 RBAC 绑定权限
-
在 Pod 里指定它
-
4. 工作流程
-
创建 ServiceAccount
apiVersion: v1 kind: ServiceAccount metadata: name: my-sa -
创建 Role(或 ClusterRole)定义权限
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"] -
绑定 ServiceAccount 和 Role
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-pods-binding subjects: - kind: ServiceAccount name: my-sa namespace: default roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io -
Pod 使用这个 ServiceAccount
apiVersion: v1 kind: Pod metadata: name: test-pod spec: serviceAccountName: my-sa containers: - name: test image: busybox command: ["sh", "-c", "sleep 3600"]
5.实战小技巧
调试 token 权限:
@#kubectl auth can-i list pods --as=system:serviceaccount:default:prometheus
yes
[16:55:12root@k8s-edge-master /root]
@#kubectl auth can-i list pods --as=system:serviceaccount:default:my-sa
no
配合 kubeconfig 使用(让本地程序模拟 Pod 身份访问 API)
TOKEN=$(kubectl get secret $(kubectl get sa my-sa -o jsonpath='{.secrets[0].name}') \
-o jsonpath='{.data.token}' | base64 --decode)
# 将 TOKEN 写入 kubeconfig 进行测试
429




被折叠的 条评论
为什么被折叠?



