为何Docker Desktop下Kubernetes默认服务账号可完全访问API?
问题1:默认SA能访问API Server查询Pod的原因
- 上游标准K8s的默认ServiceAccount确实不会预绑定任何RBAC权限,这是K8s默认的安全规则。
- Docker Desktop内置的K8s为了适配本地开发场景,做了非标准的默认配置:默认给
default命名空间下的defaultServiceAccount绑定了高权限,部分版本甚至直接授予了cluster-admin集群管理员权限,所以用默认SA启动的Pod可以直接调用API接口。 - 另外从你补充的RoleBinding配置来看,如果你启动Pod时显式指定了
serviceAccountName: podviewerserviceaccount,该SA已经被绑定了podviewerrole角色,只要该角色配置了Pod资源的list/get权限,就可以正常查询Pod列表,这是符合RBAC规则的正常现象。
问题2:Pod内SA Token与Secret中存储的Token不一致的原因
- 这个是K8s 1.21及以上版本的默认行为:默认启用了ServiceAccount Token Volume Projection特性,Pod内挂载的
/var/run/secrets/kubernetes.io/serviceaccount/token是API Server动态签发的临时令牌,具备以下特点:- 和Pod生命周期绑定,Pod删除后令牌自动失效
- 有默认过期时间,会自动轮转
- 每个Pod的令牌都是单独签发的,所以不同Pod拿到的令牌值不一样
- 而你通过
kubectl describe secret default-token-cl9ds拿到的是ServiceAccount的静态永久令牌,是K8s为了兼容旧版本逻辑保留的遗留资源,和动态签发的临时令牌本来就不是同一个东西,所以值不一致是正常现象。
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

