目录

k8s的业务pod组件的invalid token问题

invalid token问题定位分析,以及排查方法

问题现象

环境中出现了某插件业务pod的k8s client访问apiserver时认证失败,错误原因:unauthorized

查看apiserver日志,报错信息如下:

1
invalid bearer token, token has been invalidated 

检查token有效性测试

  1. 找到问题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服务

用命令行总是很麻烦,因为要自定义一些证书的位置。。。。。。。

  • master节点上访问服务
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

  • node节点上访问服务
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