Отказано в доступе при подключении к демону docker для образа jenkinsci / blueocean, развернутого в kubernetes - PullRequest
0 голосов
/ 23 мая 2019

Сводка

Сбой запуска декларативного конвейерного задания в jenkins, которое было развернуто в кластере kubernetes, при использовании агента Docker со следующей ошибкой:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/images/create?fromImage=node&tag=10.15.1: dial unix /var/run/docker.sock: connect: permission denied

Как решить это разрешениеошибка в объявлении kubernetes?

Справочная информация

У нас есть сервер jenkins, который был развернут в кластер kubernetes с использованием образа jenkinsci/blueocean.Объявление kubernetes выполняется следующим образом:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jenkins-master
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: jenkins-master
    spec:
      terminationGracePeriodSeconds: 10
      serviceAccountName: jenkins
      containers:
        - name: jenkins-master
          image: jenkinsci/blueocean
          imagePullPolicy: Always
          ports:
            - name: http-port
              containerPort: 8080
            - name: jnlp-port
              containerPort: 50000
          env:
            - name: "JAVA_OPTS"
              value: "-Dorg.jenkinsci.plugins.durabletask.BourneShellScript.HEARTBEAT_CHECK_INTERVAL=3600"
          volumeMounts:
            - name: jenkins-home
              mountPath: /var/jenkins_home
            - name: docker-socket
              mountPath: /var/run/docker.sock
      volumes:
        - name: jenkins-home
          persistentVolumeClaim:
            claimName: jenkins
        - name: docker-socket
          hostPath:
            path: /var/run/docker.sock
            type: File

Затем мы объявляем декларативное конвейерное задание jenkins следующим образом:

pipeline {
  agent {
    docker {
      image 'node:10.15.1'
      label 'master'
    }
  }
  stages {
    stage('Checkout source code') {
      steps {
          checkout scm
      }
    }
    stage('Build project') {
      steps {
        sh 'npm install'
        sh 'npm run compile'
      }
    }
    stage('Run quality assurance') {
      steps {
        sh 'npm run style:check'
        sh 'npm run test:coverage'
      }
    }
  }
}

Это задание не выполняется с вышеупомянутой ошибкой.Я подозреваю, что док-сокет был смонтирован в системе, но пользователь, выполняющий задание, не имеет разрешения на выполнение сокета.Однако я не могу добавить пользователя в группу в созданном модуле, используя sudo usermod -a -G docker $USER, поскольку модуль будет воссоздан при каждом повторном развертывании.

Вопросы

  1. Можно ли подключитьтом докера, использующий правильного пользователя в объявлении kubernetes?
  2. Могу ли я объявить конвейер иначе, если невозможно установить разрешение в объявлении kubernetes?
  3. Есть ли какие-то другиеРешение, о котором я не задумывался?

Спасибо.

1 Ответ

0 голосов
/ 06 июня 2019

Однако я не могу добавить пользователя в группу в созданном модуле с помощью sudo usermod -a -G docker $ USER, поскольку модуль будет создаваться заново при каждом повторном развертывании.

На самом деле вы можете.

Определить команду usermod для вашего контейнера в yaml развертывания, например,

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jenkins-master
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: jenkins-master
    spec:
      terminationGracePeriodSeconds: 10
      serviceAccountName: jenkins
      containers:
        - name: jenkins-master
          image: jenkinsci/blueocean
          imagePullPolicy: Always
          ports:
            - name: http-port
              containerPort: 8080
            - name: jnlp-port
              containerPort: 50000
          env:
            - name: "JAVA_OPTS"
              value: "-Dorg.jenkinsci.plugins.durabletask.BourneShellScript.HEARTBEAT_CHECK_INTERVAL=3600"
            - name: "USER"
              value: "Awemo"
          volumeMounts:
            - name: jenkins-home
              mountPath: /var/jenkins_home
            - name: docker-socket
              mountPath: /var/run/docker.sock
          command: ["/bin/sh"]
          args: ["-c", "usermod -aG docker $USER"]
      volumes:
        - name: jenkins-home
          persistentVolumeClaim:
            claimName: jenkins
        - name: docker-socket
          hostPath:
            path: /var/run/docker.sock
            type: File

Таким образом, всякий раз, когда создается новый модуль, пользователь добавляется в docker группа пользователей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...