Вызов докерского стека, развернутого на докерном хосте из контейнера Jenkins - PullRequest
0 голосов
/ 22 октября 2018

На моем хосте OS X я использую Docker CE (18.06.1-ce-mac73 (26764)) с включенным Kubernetes и использую оркестровку Kubernetes.С этого хоста я могу запустить развертывание стека для развертывания контейнера в Kubernetes с помощью этого простого файла docker-compose (kube-compose.yml):

version: '3.3'
services:
  web:
    image: dockerdemos/lab-web
    volumes:
      - "./web/static:/static"
    ports:
      - "9999:80"

, и эта командная строка запускается из каталога, содержащегофайл compose:

docker stack deploy --compose-file ./kube-compose.yml simple_test

Однако, когда я пытаюсь запустить ту же команду из моего контейнера Jenkins, Jenkins возвращает:

этот узел не является администратором роя.Используйте «docker swarm init» или «docker swarm join» для подключения этого узла к рою и повторите попытку

Я не хочу, чтобы docker-клиент в контейнере Jenkins был инициализирован для роя, так как я 'Я не использую Docker Swarm на хосте.

Контейнер Jenkins определен в docker-compose для включения монтирования тома в конечную точку сокета хоста докера:

version: '3.3'
services:
  jenkins:
    # contains embedded docker client & blueocean plugin
    image: jenkinsci/blueocean:latest
    user: root
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - ./jenkins_home:/var/jenkins_home
      # run Docker from the host system when the container calls it.
      - /var/run/docker.sock:/var/run/docker.sock
      # root of simple project
      - .:/home/project
    container_name: jenkins

Я также следовал этому руководству для запросов прокси к хосту докерас socat: https://github.com/docker/for-mac/issues/770 и здесь: Docker-compose: развертывание службы на нескольких хостах .

Наконец, я использую следующее определение Jenkins (Jenkinsfile) для вызова стека для развертывания на моем хосте.В Jenkins установлен подключаемый модуль док-станции Jenkins:

node {
    checkout scm

    stage ('Deploy To Kube') {
        docker.withServer('tcp://docker.for.mac.localhost:1234') {
            sh 'docker stack deploy app --compose-file /home/project/kube-compose.yml'
        }
    }      
}

Я также попытался изменить подпись withServer на:

docker.withServer('unix:///var/run/docker.sock')

, и я получил такой же ответ об ошибке.Тем не менее, я могу подключиться к хосту докера из контейнера Jenkins, поэтому я знаю, что он доступен.Кроме того, как я упоминал ранее, я знаю, что в сообщении говорится, что нужно запустить swarm init, но я не развертываю для роения.

Я проверил версию Docker-клиента в контейнере Jenkins, и это та же версия (однако вариант Linux), которую я использую на своем хосте:

Версия Docker18.06.1-ce, сборка d72f525745

Вот код, который я описал: https://github.com/ewilansky/localstackdeploy.git

Пожалуйста, дайте мне знать, если возможно сделать то, что я надеюсь сделатьиз контейнера Дженкинс.Цель всего этого - предоставить простую портативную демонстрацию конвейера, и развертывание в Kubernetes - последний шаг.Я понимаю, что это не тот подход, который использовался бы вне локальной среды разработки.

1 Ответ

0 голосов
/ 25 октября 2018

Вот подход, который хорошо работает для меня, пока плагин Jenkins Docker или команда Kubernetes Docker Stack Deploy не смогут поддержать сценарий удаленного развертывания, который я описал.

Сейчас я использую kubectl клиента Kubernetes из контейнера Jenkins.Чтобы минимизировать увеличение размера контейнера Jenkins, я добавил только клиент Kubernetes к образу jenkinsci / blueocean, который был построен на Alpine Linux.Этот DockerFile показывает дополнение:

FROM jenkinsci/blueocean
USER root
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin/kubectl
RUN mkdir /root/.kube
COPY kube-config /root/.kube/config

Я выбрал этот подход, который добавил ~ 100 МБ к размеру изображения, а не получил пакет Alpine Linux Kubernetes, который почти удвоил размер изображения в моем тестировании.Конечно, пакет Kubernetes содержит все компоненты Kubernetes, но все, что мне было нужно, это клиент Kubernetes.Это аналогично требованию, чтобы клиент Docker был резидентом контейнера Jenkins для запуска команд Docker на хосте.

Обратите внимание, что в DockerFile есть ссылка на файл конфигурации Kuberenetes:

kube-config /root/.kube/config

Я начал с файла конфигурации Kubernetes на моем хост-компьютере (компьютере, на котором установлен Docker для Mac).Я считаю, что если вы включите Kubernetes в Docker для Mac, конфигурация клиента Kubernetes будет присутствовать в ~ / .kube / config.Если нет, установите клиентские инструменты Kubernetes отдельно.В файле конфигурации Kubernetes, который вы скопируете в контейнер Jenkins через DockerFile, просто измените значение сервера, чтобы контейнер Jenkins указывал на хост Docker для Mac:

    server: https://docker.for.mac.localhost:6443

Если вы используетеWindows-машина, я думаю, вы можете использовать docker.for.win.localhost.Здесь обсуждается это: https://github.com/docker/for-mac/issues/2705 и другие подходы, описанные здесь: https://github.com/docker/for-linux/issues/264.

После перекомпоновки контейнера Jenkins я смог использовать kubectl для создания развертывания и службы для моего приложения.теперь он работает на хосте Kubernetes Docker для Mac.В моем случае вот две команды, которые я добавил в свой файл Jenkins:

 stage ('Deploy To Kube') {
    sh 'kubectl create -f /kube/deploy/app_set/sb-demo-deployment.yaml'
}
stage('Configure Kube Load Balancer') {
    sh 'kubectl create -f /kube/deploy/app_set/sb-demo-service.yaml'
}

Существует множество вариантов развертывания контейнеров в Kubernetes.В моем случае мне просто нужно было развернуть свое веб-приложение (с репликами) за балансировщиком нагрузки.Все это определено в двух файлах yaml, вызываемых kubectl.Это немного сложнее, чем развертывание док-стека, но дает тот же конечный результат.

...