Kubernetes中修改活跃ServiceAccount关联Role权限后,Pod权限未生效的原因?
问题
假设Kubernetes集群(默认命名空间)存在如下RBAC配置:
- 包含ServiceAccount、Role、RoleBinding资源
- 该Role允许对
pods和pods/log资源执行get、list操作 - 有一个Pod使用上述ServiceAccount,循环通过
curl调用API获取default命名空间下的所有Pod列表
所有资源创建完成后,Pod可正常获取Pod列表。但仅修改集群中的Role(例如将权限限制到其他命名空间,或完全移除Pods相关权限)、不修改其他任何资源后,预期Pod会因权限变更无法再获取Pod列表,但实际Pod仍能正常执行操作。已知Bearer Token已挂载在Pod的固定路径中。
请问:这是需要更长超时时间才会生效,还是遗漏了某些核心机制?
回答
这是Kubernetes RBAC与API Server的核心机制导致的,主要有两个关键点:
- API Server的授权决策缓存:kube-apiserver会缓存RBAC的授权判断结果,默认缓存时长为5分钟(可通过API Server启动参数
--authorization-webhook-cache-ttl调整)。在缓存有效期内,即使Role权限已经修改,API Server仍会沿用之前的授权结果,允许Pod继续访问。 - 权限校验依赖API Server实时规则,但缓存延迟生效:Pod挂载的ServiceAccount Token只是身份凭证,权限校验完全由API Server基于当前RBAC规则完成。但由于上述缓存机制,规则变更不会立即生效,必须等缓存过期后,API Server才会重新根据新的Role规则进行授权判断,此时Pod才会无法获取Pod列表。
另外,如果集群使用的是旧版本默认的长期有效ServiceAccount Token,Token本身不会触发权限刷新,但这不是核心原因——核心还是API Server的授权缓存逻辑。
内容的提问来源于stack exchange,提问作者Ilya Ayzenshtok
相关产品推荐
相关产品推荐

