解决serviceaccount用户认证挂载密文token文件失败导致pod使用anonymous用户问题
解决serviceaccount用户认证挂载密文token文件失败导致pod使用anonymous用户问题
1.背景描述
我在kubernetes集群中部署的jenkins是自己制作的docker容器,底层系统是centos7,由于jenkins是yum安装的,因此需要systemctl命令启动的,也就同时开启了特权模式,但是一切都准备就绪后,在配置kubernetes集群信息模板后,进行了连接测试然后报错
报错信息如下:
Error testing connection https://kubernetes.default: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
大概就是说证书认证失败
当我勾选了禁止http证书检查后产生了新的报错
Error testing connection https://kubernetes.default: Failure executing: GET at: https://kubernetes.default/api/v1/namespaces/jenkins/pods. Message: pods is forbidden: User "system:anonymous" cannot list resource "pods" in API group "" in the namespace "jenkins". Received status: Status(apiVersion=v1, code=403, details=StatusDetails(causes=[], group=null, kind=pods, name=null, retryAfterSeconds=null, uid=null, additionalProperties={}), kind=Status, message=pods is forbidden: User "system:anonymous" cannot list resource "pods" in API group "" in the namespace "jenkins", metadata=ListMeta(_continue=null, remainingItemCount=null, resourceVersion=null, selfLink=null, additionalProperties={}), reason=Forbidden, status=Failure, additionalProperties={}).
2.排查思路
2.1.分析报错
下图报错的大致意思为sa用户system:anonymous没有权限对jenkins命名空间下的pod进行操作,奇怪的是我yaml中明明已经指定了sa用户jenkins-sa,并且jenkins-sa是绑定的cluster-admin角色,按理说不可能对某个命名空间下的pod资源无操作权限,而且使用anonymous用户表示的是rbac资源认证失败,只有失败的情况下才会使用anonymous用户。
sa用户为什么没有通过认证呢?我们再看下资源的详细属性
当pod指定需要使用哪个serviceaccount后,会把sa用户的token密文文件挂载到pod对应的路径里,即使不指定sa也会把default sa的token挂载进去
2.2.进入容器验证问题
我们进入pod容器查看token密文是否挂载,如果没有挂载那么八成就是这个问题导致的,token密文文件包括了ca证书、namespace文件
的确没有挂载密文文件
2.3.分析排查密文文件挂载失败问题
为什么会导致密文文件挂载呢?期初我以为是centos系统的问题,因为我换成了Ubuntu系统就没有出现这个问题,官网也没有明确说明sa token文件的说明,只好一点点排查,我经历了如下几步的排查:
- 手动挂载token密文文件到容器的/var/run目录
- 根本无法挂载到/var/run下,只能挂载到其他路径,结果失败
- 去掉pvc存储
- 结果失败,和存储没啥关系
- 在容器里创建/run/secrets/kubernetes.io/serviceaccount这个路径,再次挂载token文件
- 结果依然是什么都挂载不上去,还是失败
- 当我快要放弃centos底层系统时,我突然想到我centos系统和Ubuntu的唯一区别就在于,我centos是开启特权模式,启动了init进程,然后以systemctl命令启动的jenkins啊,这可能就是问题所在的关键点
- 当我把特权模式关掉之后,发现token文件自动就挂载成功了,问题得到解决
3.结论
结论:很有可能是打开特权模式之后,任何文件都将无法挂载到/var/run路径下,毕竟是系统路径,因此就会导致token文件无法挂载,从而sa用户认证失败,导致pod使用没有权限的anonymous用户
不过这一点只是我一点点找出来的,官方并没有明确说明
连接成功,问题解决
目录 返回
首页