问题描述
从k8s 1.21 开始启用了serviceaccount的BundServiceAccountTokenVolume 功能,这个功能能够自动将sa 给挂载到pods 里并且生成一个token 用于通信, 但是使用这个功能需要 kubernetes client 的版本高于指定版本开发的软件才能用
这里的版本是kubernetes clinet而不是其他版本,需要注意。
- Go v0.15.7 及更高版本
- Python v12.0.0 及更高版本
- Java v9.0.0 及更高版本
- Javascript v0.10.3 及更高版本
- Ruby master branch
- Haskell v0.3.0.0
这个过期时间默认就是1小时(3600秒)更改不了,可以看到在pods 的yaml中被自动添加如下部分:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-cwbkz
之后根据这个路径的文件cat 一下就可以用这个去jwt.io进行解码,可以看到warn time 是 iat (issue at) 的一小时之后
但是从这个token看不到extend时间,
在官方文档里有几个kubeapi的参数
默认这个最大过期时间是无限,所以能申请无穷大的token
--service-account-max-token-expiration duration
The maximum validity duration of a token created by the service account token issuer. If an otherwise valid TokenRequest with a validity duration larger than this value is requested, a token will be issued with a validity duration of this value.
可以延期的时间,这里eks设置的就是90天,同事忽略上边那个参数,所有的token都是1小时过期之后还能用90天,
--service-account-extend-token-expiration Default: true
Turns on projected service account expiration extension during token generation, which helps safe transition from legacy token to bound service account token feature. If this flag is enabled, admission injected tokens would be extended up to 1 year to prevent unexpected failure during transition, ignoring value of service-account-max-token-expiration.
https://v1-23.docs.kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/
怎么确认是否触发了延长机制
在aws eks平台,想要查看这个问题可以通过开启审计日志来查看
当打开审计日志,同时token超过一小时,就会触发告警,发送到审计日志,具体的查询语句如下
fields @timestamp
| filter @logStream like /kube-apiserver-audit/
| filter @message like /seconds after warning threshold/
| parse @message "subject: *, seconds after warning threshold:*\"" as subject, elapsedtime