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

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

          yudong 请问,在kubesphere的流水线中创建的容器,比如:“nodejs”(image: “kubesphere/builder-nodejs:v3.2.0-podman”),怎么修改这个容器的registries.conf 配置以增加镜像加速的url?

            5 天 后

            yudong 你好,我遇到了与上面类似的问题,就是在使用KubeSphere流水线进行镜像构建时,需要依赖基础镜像 FROM openjdk:8-jdk ,实际运行时,会有一定概率 20%~30% 基础镜像拉取失败,查看日志发现是由于从docker官方镜像仓库拉取镜像超时导致的。因此我想是否可以修改podman的配置,使用国内的镜像加速服务。但是我发现podman是运行在Jenkins的agent / maven 的容器内的,而这个maven容器是动态创建的容器组中的实例,也就是说我进入maven的容器内修改了podman的配置,可以暂时使得修改后的配置生效,但是一旦容器销毁重建,修改后的配置就失效了,后续的构建还是会从docker官方仓库拉取镜像。不知道我的理解是否正确呢?

            如果我的理解正确,那么是否可以有什么办法在KubeSphere平台中通过修改devops-system或者devops-worker中的某个配置的方式,比如类似于修改 kubesphere-devops-worker的ConfigMap:ks-devops-agent 来修改maven的配置,添加国内的mirror的方式。 是否可以通过类似的方式永久的修改podman的配置呢?比如将podman的配置挂载到某个configmap,比如 configmap/ks-devops-agent 中呢?

              leixing1012

              我这边自己修改了一下,

              1 在项目 kubesphere-devops-worker 中修改 configmap/ks-devops-agent 添加数据

              键:PodmanSetting

              值:pomand配置文件,例如:

              unqualified-search-registries = ["docker.io"]
              
              [[registry]]
              prefix = "docker.io"
              location = "xxx.mirror.aliyuncs.com"
              insecure = true

              注意:xxx.mirror.aliyuncs.com要替换成自己的阿里云镜像加速地址

              2 在项目 kubesphere-devops-system 中修改 configmap/jenkins-casc-config,在要使用的agent的容器配置中修改数据挂载:

              		    containers:
                                  - name: "maven"
                                    resources:
                                      requests:
                                        ephemeral-storage: "1Gi"
                                      limits:
                                        ephemeral-storage: "10Gi"
                                    volumeMounts:
                                    - name: config-volume
                                      mountPath: /opt/apache-maven-3.5.3/conf/settings.xml
                                      subPath: settings.xml
                                  volumes:
                                    - name: config-volume
                                      configMap:
                                        name: ks-devops-agent
                                        items:
                                        - key: MavenSetting
                                          path: settings.xml
                                  securityContext:
                                    fsGroup: 1000

              修改为:

                                  containers:
                                  - name: "maven"
                                    resources:
                                      requests:
                                        ephemeral-storage: "1Gi"
                                      limits:
                                        ephemeral-storage: "10Gi"
                                    volumeMounts:
                                    - name: config-volume
                                      mountPath: /opt/apache-maven-3.5.3/conf/settings.xml
                                      subPath: settings.xml
                                    - name: podman-config-volume
                                      mountPath: /etc/containers/registries.conf
                                      subPath: registries.conf                     
                                  volumes:
                                    - name: config-volume
                                      configMap:
                                        name: ks-devops-agent
                                        items:
                                        - key: MavenSetting
                                          path: settings.xml
                                    - name: podman-config-volume
                                      configMap:
                                        name: ks-devops-agent
                                        items:
                                        - key: PodmanSetting
                                          path: registries.conf
                                  securityContext:
                                    fsGroup: 1000

              也就是增加了

              volumeMounts:
              - name: podman-config-volume
                mountPath: /etc/containers/registries.conf
                subPath: registries.conf 

              volumes:
              - name: podman-config-volume
                configMap:
                  name: ks-devops-agent
                  items:
                  - key: PodmanSetting
                    path: registries.conf

              jenkins-casc-config内有2个配置文件,我都进行了同样的修改,只改了maven,其他的agent根据需要可以做类似的改动,实测有效,挂载到configmap中的podman的配置确实生效了。