虚拟化容器,大数据,DBA,中间件,监控。

解决serviceaccount用户认证挂载密文token文件失败导致pod使用anonymous用户问题

16 11月
作者:admin|分类:容器虚拟化

解决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用户

不过这一点只是我一点点找出来的,官方并没有明确说明

连接成功,问题解决
在这里插入图片描述

浏览641 评论0
返回
目录
返回
首页
Kubernetes apiserver更换证书 K8S dashboard UI登陆时间超时设置