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

创建部署问题时,请参考下面模板,你提供的信息越多,越容易及时获得解答。
发帖前请点击 发表主题 右边的 预览(👀) 按钮,确保帖子格式正确。
你只花一分钟创建的问题,不能指望别人花上半个小时给你解答。

Kubernetes版本信息
例如:v1.24

容器运行时
例如,使用 containerd

KubeSphere版本信息
例如:v3.3.1。已有K8s安装.

问题是什么
春节期间将 K8s 升级为了使用 Containerd 的 CRI,今天运行之前可以正常运行的流水线时,提示如下错误:

docker build --build-arg APP_DIR=xxl-job-admin -t docker.io/br***003/xxl-job-admin:copied_from_master_for_cicd-3-2023-02-05-04-37 .
time="2023-02-05T04:43:51Z" level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix /var/run/docker.sock: connect: connection refused"
context canceled
script returned exit code 1

查询了一些资料,看起来应该是因为改用 Containerd 的 CRI 后,docker daemon 就停掉了。

但是如何在 containerd 的 CRI 环境下继续使用 docker hub 的image repository 以及如何 build image 呢?

请大神们指教,谢谢

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 天 后