Дженкинс создает демон 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/
У меня была аналогичная проблема, и я исправил ее, разрешив моему пользователю быть частью группы докеров и выполнить докер. Это происходит, когда ваш пользователь не может найти докер.
После установки докера вам необходимо выполнить шаги после установки.
Создайте группу докеров
sudo groupadd docker
Добавьте своего пользователя в группу докеров.
sudo usermod -aG docker $USER
Перезапустить службу докеров
sudo service docker stop
а такжеsudo service docker start
Выйти / выйти из системы текущего пользователя и снова войти в систему, чтобы проверить