自Kubernetes 1.24版本起,服务账户(ServiceAccount)的令牌管理机制发生重大变更,传统自动生成Secret的方式已被废弃。本文手把手教你破解新版本令牌获取难题,并演示三种权限验证姿势。
一、版本变更核心影响
🚨 关键变化:
停止自动创建Legacy Token Secret 强制使用TokenRequest API 令牌绑定生命周期(默认1小时)
新旧版本对比:
功能项 | 1.23及之前 | 1.24+ |
---|---|---|
令牌生成方式 | 自动创建Secret | 需手动创建Token Secret |
令牌有效期 | 永久有效 | 可配置时效(默认1h) |
安全特性 | 存在泄露风险 | 支持受众绑定验证 |
二、令牌获取实战演练
2.1 创建Token Secret模板
# sa-token.yaml
apiVersion:v1
kind:Secret
metadata:
name:prom-sa-secret
namespace:kube-system
annotations:
kubernetes.io/service-account.name:"prometheus"# 关键锚定SA
type:kubernetes.io/service-account-token# 指定令牌类型
2.2 应用配置并提取令牌
# 创建Secret
kubectl apply -f sa-token.yaml
# 提取Base64编码令牌
TOKEN=$(kubectl -n kube-system get secret prom-sa-secret -ojsonpath='{.data.token}')
三、权限校验三大姿势
3.1 命令行快速验证
# --as值,所涉及的身份伪装功能
echo $TOKEN | base64 -d | awk -F. '{printf $2}' | base64 -d | python -m json.tool | grep sub
"sub": "system:serviceaccount:kube-system:prometheus"
# 校验节点读取权限
kubectl auth can-i get nodes \
--as=system:serviceaccount:kube-system:prometheus
# 检查Ingress操作权限(需对应RBAC配置)
kubectl auth can-i create ingress \
--as=system:serviceaccount:kube-system:prometheus
3.2 模拟API请求验证
# 使用curl测试API访问
curl -k -H "Authorization: Bearer $(echo $TOKEN | base64 -d)" \
https://${API_SERVER}/api/v1/namespaces/kube-system/pods
# 典型响应分析:
# 200 OK - 有读取权限
# 403 Forbidden - 权限不足
3.3 RBAC规则逆向追溯
# 查看绑定到SA的ClusterRole
kubectl get clusterrolebindings -o json | jq '.items[] | select(.subjects[0].name=="prometheus")'
# 可视化权限关系
kubectl describe clusterrole prometheus
四、常见故障排查
❌ 问题1:创建Secret后未生成令牌
✅ 解决步骤:
-
检查SA是否存在
-
验证annotation格式是否正确
-
查看kube-controller-manager日志
❌ 问题2:令牌报"Unauthorized"错误
✅ 诊断流程:
# 检查令牌有效期
kubectl get secret prom-sa-secret -o jsonpath='{.metadata.annotations.expiration-timestamp}'
# 验证RBAC绑定
kubectl get rolebinding,clusterrolebinding -A | grep prometheus
五、结语
Kubernetes 1.24以后服务账户(ServiceAccount)的令牌管理机制不再生成Secret。本文手把手教你破解新版本令牌获取难题