invalid token问题定位分析,以及排查方法
问题现象
环境中出现了某插件业务pod的k8s client访问apiserver时认证失败,错误原因:unauthorized
查看apiserver日志,报错信息如下:
1
| invalid bearer token, token has been invalidated
|
检查token有效性测试
- 找到问题pod使用的token,有两种方式途径获取
- 进入pod中,/var/run/secrets/kubernetes.io/serviceaccount/token
- 在节点上,访问pod的数据目录获取
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 方式1:在pod内部获取
TOKEN=`cat /var/run/secrets/kubernetes.io/serviceaccount/token`
CAFILE=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
# 方式2:在master节点上,从k8s和pod数据目录内获取
#TOKEN=`cat /var/lib/kubelet/pods/podid/volumes/kubernetes.io~secret/podname/token`
#CAFILE=/etc/kubernetes/pki/ca.crt
# 接口正常访问前提:该token有获取pods权限
#podlist=https://100.7.36.176:6443/api/v1/namespaces/default/pods
podlist=https://100.7.36.176:6443/api/v1/namespaces/aistation/pods
# curl apiserver
curl --cacert $CAFILE --header "Authorization: Bearer $TOKEN" $podlist
|
如果上面接口访问正常,则说明token有效。
如果出现token无效导致失败,则进行下面分析。
分析流程
1. 查看k8s系统保存的某组件的secret信息
1
2
| keyword=deviceplugin
kubectl get secrect |grep $keyword
|
2. 查看token信息
1
| kubectl describe secrect xxx
|
3. 查看某组件pod的挂载注入信息
pod的token是在pod创建时注入的。所以查看pod信息能够看到pod mount信息
检查是否从系统保存的secret信息获取的token
1
2
| # pod 内部
cat /var/run/secrets/kubernetes.io/serviceaccount/token
|
或者 查看挂载信息
1
| mount |grep kubernetes.io~secret
|
/var/run/secrets/kubernetes.io/serviceaccount/ 目录
1
2
3
4
5
| [root@node131 coredns-token-hgchg]#ll /var/run/secrets/kubernetes.io/serviceaccount/
lrwxrwxrwx. 1 root root 13 2月 4 15:11 ca.crt -> ..data/ca.crt
lrwxrwxrwx. 1 root root 16 2月 4 15:11 namespace -> ..data/namespace
lrwxrwxrwx. 1 root root 12 2月 4 15:11 token -> ..data/token
|
检查是否从系统获取的最新token
说明:如果不一致,说明此时pod持有的token无效,就会导致pod访问aiserver认证失败
原因
暂时分析如下,后续总结更新
- 集群中的pod的serviceaccount有更新,包括secret,但是pod由于某原因没有及时同步更新,导致token无效,api接口无法认证通过
解决
删除pod,pod重建时重新获取token,访问apiserver正常
参考
附录
token脚本
k8s_token_test.sh
1
2
3
4
5
6
| #!/bin/bash
token=$(echo $1|base64 -d)
echo $token
curl -XGET -H "Authorization:Bearer $token" -k https://127.0.0.1:10248/healthz
|
配置命令
带证书文件进行k8s apiserver的https服务
用命令行总是很麻烦,因为要自定义一些证书的位置。。。。。。。
1
2
3
4
5
6
7
8
|
# master节点上
curl https://10.151.11.61:6443/api/v1/nodes \
--cacert /etc/kubernetes/pki/ca.crt \
--cert /etc/kubernetes/pki/apiserver-kubelet-client.crt \
--key /etc/kubernetes/pki/apiserver-kubelet-client.key
|
1
2
3
4
5
6
| # node节点上
curl https://10.151.11.61:6443/api/v1/nodes \
--cacert /home/wangb/ssl/ca.crt \
--cert /home/wangb/ssl/apiserver-kubelet-client.crt \
--key /home/wangb/ssl/apiserver-kubelet-client.key
|