问题详情
k8s版本是1.24.16,创建sa时没有自动创建对应的secret,使用automountServiceAccountToken: true
参数也没有自动生成。
解决
1.24版本的新特性:https://www.padok.fr/en/blog/new-kubernetes-changes#No_Secret_by_default_for_service_account_tokens
查看官方文档:https://kubernetes.io/zh-cn/docs/concepts/security/service-accounts/
LegacyServiceAccountTokenNoAutoGeneration
参数在1.24中进入Beta,默认启用,在1.26中进入GA。
所以secret需要手动创建并绑定sa。yaml如下:
apiVersion: v1
kind: Secret
metadata:
name: cluster-sa-secret
annotations:
kubernetes.io/service-account.name: "cluster-sa"
type: kubernetes.io/service-account-token
sa和secret已经绑定。查看secret的token:
这个token是k8s自动生成的,是永不过期的。把token解密后访问https://jwt.io/查看过期时间:
创建pod引用这个sa。
apiVersion: v1
kind: Pod
metadata:
name: sapod
spec:
serviceAccountName: cluster-sa
containers:
- name: centos
image: centos:latest
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- "sleep 3600"
创建完成后查看pod的volume:
pod创建了一个卷名字为kube-api-access-mpltx
,挂载到了容器内/var/run/secrets/kubernetes.io/serviceaccount
目录。但是卷的数据来源并不是Secret,其中token是由kubelet到tokenRequest api去申请的token,且token的有效期为1小时;ca.crt来自kube-root-ca.crt这个configmap;namespace是通过downwardAPI插件获取Pod自身的字段值。
查看pod内的token:
k exec -it sapod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token
查看这个token的过期时间:
可以看到这个token过期时间为1年。每1小时更新一次。(expirationSeconds: 3607)
删除sa,secret会自动删除。
要是想token永不过期,可以使用useraccount,但是配置很麻烦,参考:https://kubernetes.io/docs/reference/access-authn-authz/authentication%E3%80%82。
简单的方法就是手动创建secret, 绑定serviceaccount, 让k8s自动生成永不过期的token,再用这个token来访问apiserver。