ServiceAccount

Service account 是为了方便 Pod 里面的进程调用 Kubernetes API 或其他外部服务而设计的。它与 User account 不同

  • User account 是为人设计的,而 service account 则是为 Pod 中的进程调用 Kubernetes API 而设计;

  • User account 是跨 namespace 的,而 service account 则是仅局限它所在的 namespace;

  • 每个 namespace 都会自动创建一个 default service account

  • Token controller 检测 service account 的创建,并为它们创建 secret

  • 开启 ServiceAccount Admission Controller 后

    • 每个 Pod 在创建后都会自动设置 spec.serviceAccountName 为 default(除非指定了其他 ServiceAccout)

    • 验证 Pod 引用的 service account 已经存在,否则拒绝创建

    • 如果 Pod 没有指定 ImagePullSecrets,则把 service account 的 ImagePullSecrets 加到 Pod 中

    • 每个 container 启动后都会挂载该 service account 的 token 和 ca.crt/var/run/secrets/kubernetes.io/serviceaccount/

注意: 从 v1.24.0 开始,ServiceAccount 不再自动生成 Secret。如果你还想要自动生成 Secret,那么可以给 kube-controller-manager 配置特性 LegacyServiceAccountTokenNoAutoGeneration=false

$ kubectl exec nginx-3137573019-md1u2 ls /var/run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token

注:你可以使用 https://jwt.io/ 来查看 token 的详细信息(如 PAYLOAD、SIGNATURE 等)。

创建 Service Account

自动创建的 secret:

绑定服务账户令牌安全改进 (v1.33.0 Stable)

从 Kubernetes v1.33.0 开始,绑定服务账户令牌获得了安全改进,包括以下特性:

唯一令牌标识符

每个令牌现在都有一个唯一的标识符,用于跟踪和审计:

节点特定令牌限制

支持将令牌绑定到特定节点,增强安全性:

令牌生命周期管理

改进的令牌生命周期管理,支持更精细的控制:

安全最佳实践

  • 最小权限原则:只授予必要的权限

  • 短期令牌:使用较短的过期时间减少风险

  • 节点绑定:在多租户环境中使用节点绑定

  • 审计日志:监控令牌的使用和访问模式

添加 ImagePullSecrets

授权

Service Account 为服务提供了一种方便的认证机制,但它不关心授权的问题。可以配合 RBAC 来为 Service Account 鉴权:

  • 配置 --authorization-mode=RBAC--runtime-config=rbac.authorization.k8s.io/v1alpha1

  • 配置 --authorization-rbac-super-user=admin

  • 定义 Role、ClusterRole、RoleBinding 或 ClusterRoleBinding

比如

最后更新于