Kubernetes服务账户管理深度解析
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
概述
在Kubernetes集群中,服务账户(ServiceAccount)为运行在Pod中的进程提供身份标识。这些进程可以使用关联的服务账户身份向集群API服务器进行认证。本文将深入探讨服务账户的核心概念、工作机制以及高级管理技巧。
服务账户基础概念
服务账户与用户账户的区别
Kubernetes明确区分了服务账户和用户账户:
-
使用主体不同:
- 用户账户:供人类用户使用
- 服务账户:供应用程序进程使用,这些进程运行在Pod的容器中
-
作用范围不同:
- 用户账户:全局唯一,在整个集群范围内名称必须唯一
- 服务账户:命名空间作用域,不同命名空间可以有同名服务账户
-
创建机制不同:
- 用户账户:通常与企业目录系统集成,创建流程复杂
- 服务账户:创建轻量,可按需创建,遵循最小权限原则
-
审计需求不同:两者审计要求不同,分离设计更易实现
-
可移植性:服务账户名称空间隔离的特性使其配置更易移植
绑定服务账户令牌
Kubernetes支持将服务账户令牌绑定到API对象上,这种机制可以将令牌的有效性与API对象的生命周期关联。
支持的绑定对象类型
- Pod:用于投影卷挂载
- Secret:通过删除Secret来撤销令牌
- Node:节点删除时自动撤销令牌(v1.33+正式支持)
绑定令牌工作原理
当令牌绑定到对象时,对象的metadata.name
和metadata.uid
会作为私有声明存储在JWT中。API服务器在认证时会验证这些声明:
- 如果引用对象或服务账户处于删除状态(超过
.metadata.deletionTimestamp
60秒) - 如果引用对象不存在或UID不匹配 认证将失败
Pod绑定令牌的额外元数据
当服务账户令牌绑定到Pod对象时,JWT中还会包含:
- Pod的
spec.nodeName
值 - 节点UID(如果可用)
注意:API服务器在使用令牌认证时不会验证这些节点信息。
令牌验证与检查
可以使用TokenReview API验证和提取令牌中的私有声明:
-
创建绑定到Pod的令牌:
kubectl create token my-sa --bound-object-kind="Pod" --bound-object-name="test-pod"
-
使用TokenReview提交验证:
apiVersion: authentication.k8s.io/v1 kind: TokenReview spec: token: <your-token>
-
执行验证:
kubectl create -o yaml -f tokenreview.yaml
输出将包含详细的认证信息,包括绑定的Pod和节点信息。
绑定服务账户令牌卷机制
Kubernetes控制平面(特别是服务账户准入控制器)默认会为Pod添加一个投影卷,其中包含访问Kubernetes API的令牌。
投影卷组成
典型的投影卷包含三个来源:
-
serviceAccountToken:
- kubelet从API服务器获取的有时限令牌
- 令牌默认1小时有效期,kubelet会自动刷新
- 令牌绑定到特定Pod,API服务器作为受众
-
configMap:
- 包含CA证书包,用于验证API服务器身份
-
downwardAPI:
- 提供Pod所在命名空间信息
服务账户令牌管理演进
新旧机制对比
-
旧机制(v1.22之前):
- 自动创建Secret存储令牌
- 令牌无过期时间
- 通过Secret挂载到Pod
-
新机制(v1.22+):
- 使用TokenRequest API直接获取令牌
- 令牌有时限,默认1小时
- 使用投影卷挂载
- Pod删除时令牌自动失效
自动生成的遗留令牌清理
从v1.29开始:
- 未使用的自动生成遗留令牌在默认1年后标记为无效
- 继续未使用(默认再1年)后将被清除
- 使用无效令牌会:
- 添加审计注解
- 增加指标计数
- 更新最后使用标签
- 返回错误
控制平面组件
服务账户控制器
- 管理命名空间中的服务账户
- 确保每个活跃命名空间存在"default"服务账户
令牌控制器
作为kube-controller-manager的一部分运行:
- 监视服务账户删除并删除关联的Secret
- 监视Secret添加并确保关联服务账户存在
- 监视Secret删除并更新服务账户引用
服务账户准入控制器
在Pod创建时同步修改Pod:
- 未指定serviceAccountName时设为"default"
- 确保引用的服务账户存在
- 自动挂载API访问令牌卷(除非明确禁用)
最佳实践
- 优先使用TokenRequest获取短期令牌
- 仅必要时手动创建长期令牌Secret
- 定期检查并清理未使用的遗留令牌
- 为不同工作负载创建专用服务账户
- 遵循最小权限原则分配权限
通过深入理解服务账户工作机制,可以更安全高效地管理Kubernetes集群中的身份认证。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考