Kubernetes Handbook 项目:深入理解 Pod 的 Service Account 配置

Kubernetes Handbook 项目:深入理解 Pod 的 Service Account 配置

kubernetes-handbook Kubernetes中文指南/云原生应用架构实战手册 - https://jimmysong.io/kubernetes-handbook kubernetes-handbook 项目地址: https://gitcode.com/gh_mirrors/ku/kubernetes-handbook

什么是 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 凭证的自动挂载:

  1. 在 Service Account 级别禁用:
apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-robot
automountServiceAccountToken: false
  1. 在 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

  1. 首先创建 ImagePullSecret:
kubectl create secret docker-registry myregistrykey \
  --docker-server=DOCKER_REGISTRY_SERVER \
  --docker-username=DOCKER_USER \
  --docker-password=DOCKER_PASSWORD \
  --docker-email=DOCKER_EMAIL
  1. 将 ImagePullSecret 添加到 Service Account:
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'

这样,该命名空间下所有使用默认 Service Account 的 Pod 都会自动包含这个 ImagePullSecret。

最佳实践

  1. 最小权限原则:为每个工作负载创建专用的 Service Account,并只授予必要的权限
  2. 定期轮换令牌:定期更新 Service Account 的令牌
  3. 禁用不必要的自动挂载:对于不需要访问 API 服务器的 Pod,禁用凭证自动挂载
  4. 使用命名空间隔离:在不同命名空间中创建 Service Account 以实现更好的隔离

通过合理配置 Service Account,您可以实现 Kubernetes 集群中工作负载的精细权限控制,提高集群的安全性。

kubernetes-handbook Kubernetes中文指南/云原生应用架构实战手册 - https://jimmysong.io/kubernetes-handbook kubernetes-handbook 项目地址: https://gitcode.com/gh_mirrors/ku/kubernetes-handbook

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贡秀丽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值