Рубрики
Uncategorized

Дженкинс: Рабочие в Kubernetes и Docker Images Build

У нас есть экземпляр Дженкинса, который работает рабочие места в контейнерах Docker на своем хосте. В конце концов, мы … Tagged с Docker, DevOps, Kubernetes.

У нас есть экземпляр Дженкинса, который работает рабочие места в контейнерах 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: раскрутить экземпляр

Для целей тестирования давайте создадим выделенную 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»