k8s 1_26版本创建serviceaccount不会自动创建secret
背景:
最近上线一个新的业务系统,要求使用单独的k8s集群。原先一直使用k8s 1.22版本,官方已经不再维护,正好这次新的k8s集群就使用1.26版本。
问题描述:
prometheus监控在另一个k8s集群内,对新建集群配置自动发现,使用kubernetes_sd_configs方式,发现在新集群创建serviceaccount之后不会自动常见并绑定secret token。
老规矩,先网上搜一下,找到这篇:https://www.soulchild.cn/post/2945,摘抄记录如下:
k8s官方 1.24 chanagelog. (opens new window)
阿里云 ack k8s 1.26 changelog (opens new window)
在Kubernetes 1.24版本后,基于安全方面的考虑(特性门控LegacyServiceAccountTokenNoAutoGeneration默认启用),Secret API将不会为ServiceAccount自动创建Secret对象存放Token信息,需要使用TokenRequest API来获取ServiceAccount的Token,该Token具备过期时间,更加安全。如果一定需要创建一个永不过期的Token,请参见service-account-token-secrets (opens new window)。
可以使用 TokenRequest API (opens new window) 获取服务帐户令牌,或者如果需要未过期的令牌,请按照本指南 (opens new window)为令牌控制器创建一个 Secret API 对象以填充服务帐户令牌。
pr: https://github.com/kubernetes/kubernetes/pull/108309
方式 1
使用 TokenRequest API
来生成 token,获取方式:
- 使用 client-go 或者其他 api 调用工具来获取某个 serviceaccount 的 token
- 创建 yaml,使用 kubectl apply -f
- 使用
kubectl create token -n xxx <serviceaccount-name>
来获取一个临时的 token, 默认 1 小时
方式 2
创建 secret token,创建后从 secret 的 token 字段拿就可以了
apiVersion: v1
kind: Secret
metadata:
name: secret-sa-sample
annotations:
kubernetes.io/service-account.name: "sa-name" # 这里填写serviceAccountName
type: kubernetes.io/service-account-token
2
3
4
5
6
7