• DevOps
  • K8s CRI 改用 Containerd 后,Devops 构建镜像时报错

configmap:jenkins-casc-config

里面 的 image 部分,加下 -podman 后缀,比如:“kubesphere/builder-maven:v3.2.0-podman”,

然后 等70s 自动生效后,同时 把 jenkinsfile 中 docker 改成 podman 命令,再运行流水线试试。

    chilianyi

    大佬,我现在环境里的 jenkins-casc-config CM 里就是带有 podman 的标签,jenkisfile 里面也把 docker 改为 podman 了,但是提示 podman 的命令不存在。。。。

    该怎么办呢

      koalawangyang 我用这种环境试了下,可以操作,有什么不同吗?

      pipeline {
        agent {
          node {
            label 'maven'
          }
      
        }
        stages {
          stage('stage-rbzgp') {
            agent none
            steps {
              container('maven') {
                sh '''
                  alias docker=podman
                  docker ps
                  podman ps
                  '''
              }
      
            }
          }
      
        }
      }

        chilianyi

        感谢大佬回复,我昨天做了一些测试,发现了更多信息,我在此列出,可能需要 KS 官方来修复。

        1. 检查了 CM  jenkins-casc-config 中的 jenkins.yaml 文件,其中 maven 标签的 image url 的确含有 podman,但是在往下看到这个 CM 中的 另外一个文件:jenkins_user.yaml ,该文件中的 maven 标签里的 image url 是不含 podman 的。猜测可这个有关。
        2. 在 node 上通过 crictl image ls 查看已有镜像,发现只有这么一个镜像:docker.io/kubesphere/builder-maven:v3.2.0,并不是用的含有 podman 的镜像。
        3. 在 node 上通过 crictl rmi docker.io/kubesphere/builder-maven:v3.2.0 来删除镜像,然后重新运行流水线,看是否会拉取含有 podman 的镜像。
        4. 重新运行流水线后,现象依旧,在 node 上查看删除的 builder-maven:v3.2.0 镜像又被拉下来了。
        5. 尝试修改 jenkins_user.yaml 文件中的 maven 标签里的 image url,修改为含有 podman 的镜像。
        6. 重新运行流水线后,现象依旧,node 上仍然使用的是不含 podman 的镜像。
        7. 检查 kubesphere-devops-system 名称空间中的 devops-jenkins Deployment,进入 /var/jenkins_home/cascconfigs/ 目录,确认存在 jenkins.yamljenkins_user.yaml 文件,并且jenkins_user.yaml是我修改后的CM 内容。
        8. 想到可能是没有重启该 Pod,重启 devops-jenkins Pod。
        9. 重新运行流水线后,报错变为下面这个,看提示是和权限有关,检查 node 上的镜像,发现拉取了带有 podman 的镜像,说明步骤 5 中的修改终于生效了。Error: mount /var/lib/containers/storage/overlay:/var/lib/containers/storage/overlay, flags: 0x1000: operation not permitted
        10. 仔细对比 CM 中的 jenkins.yamljenkins_user.yaml 文件,发现 jenkins.yaml 文件中的 maven 标签对应的privileged: true ,而 jenkins_user.yaml 文件中的 maven 标签对应的 privileged: false ,猜测和这个有关。
        11. 将其修改为 true 后,再次重启devops-jenkins Pod。
        12. 重新运行流水线后,镜像可以正常 build 了,最终流水线运行成功。

        上面的步骤是我排查的过程,大概的意思就是我升级了 k8s 到 v1.24,改用 containerd 作为 CRI ,同时升级了 Kubesphere 版本到 v3.3.1,之前的流水线运行失败,提示无法连接 docker daemon,问题根源是 devops jenkins 没有加载到正确的配置文件,从而没有使用含有 podman 标签的镜像,最终导致 docker 命令异常。

        而现在官网上的文档中使用的示例均以 docker 为例,而未来大家都升级 k8s 版本后,可能陆续会遇到我的这个问题,因此建议 KS 官方看看是否可以尽快修复该问题,谢谢。

          21 天 后

          chilianyi 大佬,jenkinsfile改成podman后连接harbor的443拒绝这个怎么解决呢

          chilianyi 大佬 我的解决了,我用腾讯云颁发的证书解决的,还有个问题想请教一下您,我在配置应用路由的时候项目获取不到网关地址,为啥呢如下图

          网关启用了

          应用路由网关地址获取不到

            lijq 您好,我看您这个是在 qingcloud 上部署的 QKE 吧。 可以提工单试一下。

            2 个月 后
            1 个月 后
            12 天 后