У нас есть экземпляр Дженкинса, который работает рабочие места в контейнерах Docker на своем хосте.
В конце концов, мы столкнулись с проблемой, когда текущий экземпляр AWS EC2 T2.2xLarge (8 процессор, 32 RAM) во время периодов пиковых рабочих нагрузок был слишком перегружен — не хватает времени процессора, недостаточно памяти.
Таким образом, первое решение может быть выполнено с его вертикальным масштабированием, например, до C5.9large и продолжайте выполнять строить на главном хосте или перемещения некоторых рабочих мест для внешних работников.
В это время у нас есть три таких рабочих — Android-сборки бегут на ПК в нашем офисе с Android-студио, в офисе у нас также есть куча MACMINI для iOS Builds, Plus у нас есть дополнительный EC2 в AWS для нашего QA команда, чтобы запустить свои интернет-аутотесты.
Теперь давайте добавим возможность запустить рабочие места на рабочих в кластере Kubernetes.
Мы используем AWS Elastic Cubernetes Service, и в этом посте проверю, как использовать Плагин Kubernetes для Дженкинса.
- Jenkins-master: раскрутить экземпляр
- Установка докера
- Бег Дженкинс с докером
- Дженкинс рабочие в Куберане
- Jenkins ServieCeacount.
- Jenkins ServieCeacount, и KubeConfig
- Дженкинс Кубернаны учетные данные
- Дженкинс Рабы Pod Шаблон
- Дженкинс Работа
- Докер в Докере через Докер в Кубернане
Jenkins-master: раскрутить экземпляр
Для целей тестирования давайте создадим выделенную AWS … SO2 с Ubuntu 20.04, добавьте докер и настроив основной экземпляр Jenkins.
Установка докера
Создайте ЕС2, подключайтесь к SSH, установите Docker:
root@ip-10–0–4–6:/home/ubuntu# apt update && apt -y upgrade root@ip-10–0–4–6:/home/ubuntu# curl [https://get.docker.com/](https://get.docker.com/) | bash
И докер составлял.
Найти Последняя версия . на Github, в момент написания написания это было 1.28.4 , загрузить:
root@ip-10–0–4–6:/home/ubuntu# curl -L "https://github.com/docker/compose/releases/download/1.28.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose] root@ip-10–0–4–6:/home/ubuntu# chmod +x /usr/local/bin/docker-compose root@ip-10–0–4–6:/home/ubuntu# docker-compose --version docker-compose version 1.28.4, build cabd5cfb
Бег Дженкинс с докером
Создайте каталог на хосте для хранения данных Jenkins:
root@ip-10–0–4–6:/home/ubuntu# mkdir jenkins_home
Напишите Docker Compose файл:
version: '3.5' networks: jenkins: name: jenkins services: jenkins: user: root image: jenkins/jenkins:2.249.3 networks: - jenkins ports: - '8080:8080' - '50000:50000' volumes: - /home/ubuntu/jenkins_home/:/var/lib/jenkins - /var/run/docker.sock:/var/run/docker.sock - /usr/bin/docker:/usr/bin/docker - /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 environment: - JENKINS_HOME=/var/lib/jenkins - JAVA_OPTS=-Duser.timezone=Europe/Kiev logging: driver: "journald"
Запустите экземпляр:
root@ip-10–0–4–6:/home/ubuntu# docker-compose -f jenkins-compose.yaml up
Откройте его URL в браузере:
Администратор пароль Можно найти в Docker Compose выходом во время запуска, или вы можете получить его в /var/lib/jenkins/secrets/initialadminpassword
Файл в контейнере:
root@ip-10–0–4–6:/home/ubuntu# docker exec -ti ubuntu_jenkins_1 cat /var/lib/jenkins/secrets/initialAdminPassword 15d***730
Войдите в систему, запустите начальную установку:
Создать пользователя:
Завершите его и перейдите на плагины.
Дженкинс рабочие в Куберане
Найти плагин Kubernetes:
Установите его и перейдите к Управление узлами и облаками > Настроить облака :
Проверьте Kubernetes:
Установите URL URL вашего сервера API кластеров и пространства имен:
Jenkins ServieCeacount.
В кластере создайте пространство имен и ServiceAccount, которые будут использоваться Jenkins для авторизации.
На установке производства лучше настроить доступ через Профиль экземпляра EC2 с прилагаемым IAM-ролью.
На данный момент добавить Kubernetes rembinding сопоставлен на Роль администратора по умолчанию (или создать свой собственный — здесь администратор используется только для простоты, так как это настройка POC) в нашем dev-1-18-devops-jenkins-slaves-ns пространство имен:
-------- apiVersion: v1 kind: Namespace metadata: name: dev-1-18-devops-jenkins-slaves-ns -------- apiVersion: v1 kind: ServiceAccount metadata: name: jenkins-slaves-service-account namespace: dev-1-18-devops-jenkins-slaves-ns -------- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: jenkins-slaves-rolebinding namespace: dev-1-18-devops-jenkins-slaves-ns roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: admin subjects: - kind: ServiceAccount name: jenkins-slaves-service-account namespace: dev-1-18-devops-jenkins-slaves-ns
Развернуть это:
$ kubectl apply -f jenkins-slaves-sa.yaml namespace/dev-1–18-devops-jenkins-slaves-ns created serviceaccount/jenkins-slaves-service-account created rolebinding.rbac.authorization.k8s.io/jenkins-slaves-rolebinding created
Jenkins ServieCeacount, и KubeConfig
Следующее, что нужно сделать, это создать KubeConfig , что будет использовать этот сервисccount.
Для этого нам нужно получить кластер EKS ARN, свой сертификат, адрес сервера API и A JWT токен обслуживания.
Найти секрет, созданный для вашей службы учетной записи:
kubectl -n dev-1-18-devops-jenkins-slaves-ns Получить Sa Jenkins-Slaves-Service-Account —o
jenkins-slaves-service-account-token-jsbb7
Орган сертификата и кластер ARN ARN можно взять в консоли AWS:
Получите токен из секрета, расшифруйте его базой64:
$ kubectl -n dev-1–18-devops-jenkins-slaves-ns get secret jenkins-slaves-service-account-token-jsbb7 -o jsonpath='{.data.token}' | base64 — decode eyJ…s7w
Написать KubeConfig , например, как jenkins-dev-1-18-kubeconfig.yaml
файл:
apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0...LQo= server: [https://676\*\*\*892.gr7.us-east-2.eks.amazonaws.com](https://676***892.gr7.us-east-2.eks.amazonaws.com) name: arn:aws:eks:us-east-2:534***385:cluster/bttrm-eks-dev-1-18 contexts: - context: cluster: arn:aws:eks:us-east-2:534***385:cluster/bttrm-eks-dev-1-18 user: jenkins-slaves-service-account namespace: dev-1-18-devops-jenkins-slaves-ns name: jenkins-slaves-service-account@bttrm-dev-1-18 current-context: jenkins-slaves-service-account@bttrm-dev-1-18 kind: Config users: - name: jenkins-slaves-service-account user: token: ZXl...N3c=
Проверьте, работает ли он:
$ kubectl -n dev --kubeconfig ../jenkins-dev-1–18-kubeconfig.yaml auth can-i get pod yes
Дженкинс Кубернаны учетные данные
Вернитесь к Дженкинам, добавьте новый Учетные данные :
Проверьте его соединение — нажмите на Тестовое соединение , должен увидеть _connected в Kubernetes 1.18+ _message:
Сохраните настройки.
Дженкинс Рабы Pod Шаблон
Перейти к Шаблоны стручка :
Заполните поля POD и его контейнер по умолчанию, установите jenkinsci/jnlp-раб
Как изображение докера:
Дженкинс Работа
Создайте тестовую работу с Трубопровод тип:
Напишите сценарий трубопровода:
podTemplate { node(POD_LABEL) { stage('Run shell') { sh 'echo hello world' } } }
Запустите работу и проверьте журналы Jenkins ‘:
… jenkins_1 | 2021–02–26 08:36:32.226+0000 [id=277] INFO hudson.slaves.NodeProvisioner#lambda$update$6: k8s-1-b5j7g-glscn-v0tfz provisioning successfully completed. We have now 2 computer(s) jenkins_1 | 2021–02–26 08:36:32.522+0000 [id=276] INFO o.c.j.p.k.KubernetesLauncher#launch: Created Pod: dev-1–18-devops-jenkins-slaves-ns/k8s-1-b5j7g-glscn-v0tfz …
И POD создает в кластере Kubernetes:
$ kubectl --kubeconfig ../jenkins-dev-1–18-kubeconfig.yaml get pod NAME READY STATUS RESTARTS AGE k8s-1-b5j7g-glscn-v0tfz 0/1 ContainerCreating 0 12s
Завершение работы:
Докер в Докере через Докер в Кубернане
Наши Jenkins работают как контейнер докеров, и он работает его сборки в докереных контейнерах внутри. Это хороший подход, используемый мной в течение длительного времени, так как он дает нам возможность не устанавливать библиотеки на хост-систему более контролируемым способом для настройки среды сборки, и наши разработчики могут настроить их, как они пожелают.
Итак, теперь нам нужно осознать то же самое — но в Кубернане вылетело.
Установите . Plugin Plugin Pober Дженкинс:
И создать новый трубопровод
Здесь нам нужен еще один документ докера — docker.dind
И для этого нам нужен еще один шаблон POD.
Вы можете создать его через jenkins ui, как мы это сделали ранее, или мы можем описать его в трубопроводе напрямую, используя подтекпные платы
Отказ
Например, давайте построим изображение Nginx:
podTemplate(yaml: ''' apiVersion: v1 kind: Pod spec: containers: - name: docker image: docker:19.03.1-dind securityContext: privileged: true env: - name: DOCKER_TLS_CERTDIR value: "" ''') { node(POD_LABEL) { git 'https://github.com/nginxinc/docker-nginx.git' container('docker') { sh 'docker version && cd stable/alpine/ && docker build -t nginx-example .' } } }
И запустить работу:
Сделанный.
Полезные ссылки
Первоначально опубликовано в RTFM: Linux, DevOps и системное администрирование Отказ
Оригинал: «https://dev.to/setevoy/jenkins-running-workers-in-kubernetes-and-docker-images-build-1lef»