Jenkins构建Docker守护进程未在Kubernetes集群上运行

问题描述

我是Dev Ops的新手,并尝试使用Jenkins构建代码并将其上传到IBM云上托管的kubernetes集群。但是,当我在Jenkins脚本中运行Docker run命令时,我总是收到此错误。安装了所有最新的插件和

+ docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.

这是我不知道对与错的詹金斯脚本。我搜索了几篇文章和问题。他们都没有给我积极的结果。 尝试过此Jenkins Docker in Docker on GCP/Kubernetes

podTemplate(
    cloud: "kubernetes",label:"mypod",containers:[
        containerTemplate(
            name:"nodejs",image:"node",ttyEnabled:true,command:'cat',alwaysPullImage: true,resourceRequestCpu: '200m',resourceRequestMemory: '100Mi',),containerTemplate(
            name:"docker",image:"",containerTemplate(
            name:"helm",image:"alpine/helm",)
    ],volumes:[
        hostPathVolume(hostPath: '/var/run/docker.sock',mountPath: '/var/run/docker.sock')
    ]
){
    node("mypod"){
        def commitId
        stage ("Fetch repo"){
            checkout scm
            commitId = sh(script: 'git rev-parse --short HEAD',returnStdout:true).trim()
        }
        stage ("Installing packages"){
            container("nodejs"){
                sh 'npm install'
            }
        }
        stage ("Build"){
            container("nodejs"){
                sh 'npm run build'
            }
        }
        def repository
        stage ("Docker"){
            container('docker'){
                docker.withRegistry("https://us.icr.io/api","ibm-cloud"){
                    sh "docker run hello-world"
                }
            }
        }
        stage ("Deploy"){
            container ("helm"){
                sh 'helm version'
            }
        }
    }
}

这是我的Jenkins吊舱的部署文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-uat
  labels:
    app: jenkins
    chart: jenkins-5.0.18
    release: jenkins-uat
    heritage: Helm
spec:
  selector:
    matchLabels:
      app: jenkins
      release: jenkins-uat
  template:
    metadata:
      labels:
        app: jenkins
        chart: jenkins-5.0.18
        release: jenkins-uat
        heritage: Helm
    spec:      
      securityContext:
        fsGroup: 1001
      containers:
        - name: jenkins
          image: docker.io/bitnami/jenkins:2.235.1-debian-10-r7
          imagePullPolicy: "IfNotPresent"
          securityContext:
            runAsUser: 1001
          env:
            - name: JENKINS_USERNAME
              value: "hlpjenkin"
            - name: JENKINS_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: jenkins-uat
                  key: jenkins-password
            - name: JENKINS_HOME
              value: "/opt/bitnami/jenkins/jenkins_home"
            - name: DISABLE_JENKINS_INITIALIZATION
              value: "no"
          ports:
            - name: http
              containerPort: 8080
            - name: https
              containerPort: 8443
          livenessProbe:
            httpGet:
              path: /login
              port: http
            initialDelaySeconds: 180
            periodSeconds: 10
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 6
          readinessProbe:
            httpGet:
              path: /login
              port: http
            initialDelaySeconds: 30
            periodSeconds: 5
            timeoutSeconds: 3
            successThreshold: 1
            failureThreshold: 3
          resources:
            limits: {}
            requests:
              cpu: 300m
              memory: 512Mi
          volumeMounts:
            - name: jenkins-data
              mountPath: /bitnami/jenkins
      volumes:
        - name: jenkins-data
          persistentVolumeClaim:
            claimName: jenkins-uat

解决方法

我遇到了类似的问题,并通过使用户成为docker组的一部分并执行docker来解决此问题。当您的用户无法找到docker时,就会发生这种情况。

在安装docker之后,您需要按照安装后的步骤进行操作。

  1. 创建docker组 ValueError: Expected n_neighbors <= n_samples,but n_samples = 1,n_neighbors = 2

  2. 将您的用户添加到docker组。 sudo groupadd docker

  3. 重新启动docker服务 sudo usermod -aG docker $USERsudo service docker stop

  4. 从当前用户退出/注销并重新登录以验证

,

因此,我已将Jenkins作为容器安装在我的k8s集群中:),并设法再现相同的错误:

docker run --rm hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.

如何修复

为了进行修复,您肯定需要访问K8s节点上的Docker。 jpetazzo给出了很好的解释。

从技术上讲,您不需要“ Docker in Docker”(即Docker中的“完整Docker设置”)。您只希望能够从CI系统中运行Docker,而此CI系统本身位于容器中。这样您的CI系统(如Jenkins)就可以启动容器。

因此,当您启动CI容器(Jenkins或其他)时,不要与Docker-in-Docker一起入侵某些东西,而应通过访问主主机上的/var/run/docker.sock来启动它。

在下面,您可以看到我的Yamls中对此负责的部分。
这样我的CI容器就可以访问Docker套接字,因此CI容器将能够启动容器。

除了不是启动“子”容器,而是启动“兄弟”容器,但这在我们的上下文中是完全可以的。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
...
spec:
  template:
    spec:
      containers:
      - env:
        volumeMounts:
        - mountPath: /var/run/docker.sock
          name: docker-sock
      ...
      volumes:
      - hostPath:
          path: /var/run/docker.sock
          type: File
        name: docker-sock

因此,就我而言,我创建的管道会生成以下日志:

####pipeline

pipeline {
    agent any

    stages     {
        stage('second_stage'){
            steps{
                sh 'docker run --rm hello-world'
            }
        }
    }
}

####logs

+ docker run --rm hello-world

Hello from Docker!
,

所以我在您的podtemplate中看到了几个问题。

首先,对于docker容器,您未指定任何图像。您应该在此容器中使用docker映像。使用安装了docker的容器创建您自己的容器,或者您可以使用https://hub.docker.com/r/volaka/ibm-cloud-cli此映像。它包括用于IBM Cloud上的kubernetes自动化的ibmcloud cli,kubectl,helm和docker。

第二件事是,我认为它与Jenkins Kubernetes有关。在管道中创建podTemplate之后,即使您编辑模板,有时更改也不会在最新的pod中显示。我遇到了此类错误,因此我使用编辑的podTemplate删除并重新创建了管道。我说这是因为,即使您在podTemplate中声明了卷绑定,在创建的pod的Yaml中也看不到它。因此,我建议您使用最终的podTemplate重新创建管道。

我创建了详细的演练,内容涉及如何在IBM Kubernetes Service上安装,配置和自动化Jenkins管道。随时检查。 https://volaka.gitbook.io/jenkins-on-k8s/

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...