Дженкинс создает демон Docker, который не работает в кластере кубернетов

Я новичок в Dev Ops и пытаюсь создать свой код с помощью Jenkins и загрузить его в кластер kubernetes, который размещен в облаке IBM. Но когда я запускаю команду запуска Docker в сценарии Jenkins, я продолжаю получать эту ошибку. Установлены все последние плагины и

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

Вот сценарий Дженкинса, который я не знаю, правильный или неправильный. Я искал пару статей и вопрос. Все они не давали мне положительного результата. Пробовал этот Jenkins Docker в Docker на 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:"",
            ttyEnabled:true,
            command:'cat',
            alwaysPullImage: true,
            resourceRequestCpu: '200m',
            resourceRequestMemory: '100Mi',
        ),
        containerTemplate(
            name:"helm",
            image:"alpine/helm",
            ttyEnabled:true,
            command:'cat',
            alwaysPullImage: true,
            resourceRequestCpu: '200m',
            resourceRequestMemory: '100Mi',
        )
    ],
    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

2 ответа

Итак, я установил 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'.

Как это исправить.

Чтобы исправить это, вам обязательно нужен доступ к Docker на вашем K8s Node. Очень хорошее объяснение того, как это работает, дал jpetazzo.

Технически вам не нужен "Докер в Докере" (это "полная установка Докера" в Докере). Вы просто хотите иметь возможность запускать Docker из своей системы CI, в то время как сама эта система CI находится в контейнере. Чтобы ваша CI-система, такая как Jenkins, могла запускать контейнеры.

Поэтому, когда вы запускаете свой контейнер CI (Jenkins или другой), вместо того, чтобы что-то взламывать вместе с Docker-in-Docker, запустите его с доступом к /var/run/docker.sock на основном хосте.

Ниже вы можете увидеть ту часть моих ямлов, которая за это отвечает.
Это позволяет моему контейнеру 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!

Итак, я вижу пару проблем в вашем подэлементе.

Прежде всего, для контейнера докеров вы не указали изображение. Вы должны использовать образ докера в этом контейнере. Создайте свой собственный контейнер с установленным в нем докером или используйте https://hub.docker.com/r/volaka/ibm-cloud-cli этот образ. Он включает в себя ibmcloud cli, kubectl, helm и docker для автоматизации кубернетов в IBM Cloud.

Во-вторых, я думаю, что это связано с Jenkins Kubernetes. После создания podTemplate в конвейере, даже если вы редактируете шаблон, иногда изменения не видны в последнем модуле. У меня была такая ошибка, поэтому я удалил и воссоздал конвейер с отредактированным podTemplate. Я говорю это потому, что даже если вы объявили привязку тома в podTemplate, я не вижу этого в yaml созданного модуля. Поэтому я рекомендую вам воссоздать конвейер с помощью последнего шаблона podTemplate.

Я создал подробное пошаговое руководство о том, как установить, настроить и автоматизировать конвейеры Jenkins в IBM Kubernetes Service. Не стесняйтесь проверить это. https://volaka.gitbook.io/jenkins-on-k8s/

У меня была аналогичная проблема, и я исправил ее, разрешив моему пользователю быть частью группы докеров и выполнить докер. Это происходит, когда ваш пользователь не может найти докер.

После установки докера вам необходимо выполнить шаги после установки.

  1. Создайте группу докеровsudo groupadd docker

  2. Добавьте своего пользователя в группу докеров.sudo usermod -aG docker $USER

  3. Перезапустить службу докеровsudo service docker stop а также sudo service docker start

  4. Выйти / выйти из системы текущего пользователя и снова войти в систему, чтобы проверить

Другие вопросы по тегам