1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/linuxsuren-kubernetes-plugin

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Команда — команда, которую будет выполнять контейнер.

  • Аргументы — аргументы, передаваемые команде.
  • ttyEnabled — флаг, указывающий на то, что tty должен быть включён.
  • livenessProbe — параметры, которые будут добавлены в исполняемый зонд живучести в контейнере (не поддерживает зонды httpGet живучести).
  • Порты — открывают порты в контейнере.

Указание другого значения времени ожидания подключения агента по умолчанию

По умолчанию время ожидания подключения агента установлено равным 100 секундам. В некоторых случаях вы можете захотеть установить другое значение, если это так, вы можете установить системное свойство org.csanchez.jenkins.plugins.kubernetes.PodTemplate.connectionTimeout равным другому значению. Пожалуйста, ознакомьтесь со страницей Функции, управляемые системными свойствами, чтобы узнать, как настроить системные свойства в Jenkins.

Использование yaml для определения шаблонов Pod

Чтобы поддерживать любое возможное значение в объекте Kubernetes Pod, мы можем передать фрагмент yaml, который будет использоваться в качестве основы для шаблона. Если какие-либо другие свойства установлены вне yaml, они будут иметь приоритет.

podTemplate(yaml: """
apiVersion: v1
kind: Pod
metadata:
  labels:
    some-label: some-label-value
spec:
  containers:
  - name: busybox
    image: busybox
    command:
    - cat
    tty: true
"""
) {
    node(POD_LABEL) {
      container('busybox') {
        sh "hostname"
      }
    }
}

Вы можете использовать шаги readFile или readTrusted, чтобы загрузить yaml из файла. Он также доступен на панели конфигурации этого плагина в консоли Jenkins.

Использование зонда живучести

containerTemplate(name: 'busybox', image: 'busybox', ttyEnabled: true, command: 'cat', livenessProbe: containerLivenessProbe( execArgs: 'some --command', initialDelaySeconds: 30, timeoutSeconds: 1, failureThreshold: 3, periodSeconds: 10, successThreshold: 1))

Подробнее см. в разделе Определение команды живучести.

Наследование шаблона Pod

Шаблон Pod может наследовать от существующего шаблона, а может и не наследовать. Это означает, что шаблон Pod унаследует селектор узла, служебную учётную запись, секреты извлечения образов контейнеров, шаблоны контейнеров и тома от шаблона, от которого он наследует.

yaml никогда не объединяется, если он определён в дочернем шаблоне Pod, будет использован он, а не родительский.

Служебная учётная запись и селектор узлов, когда они переопределены, полностью заменяют любое возможное значение, найденное в «родительском».

Шаблоны контейнеров, которые добавляются в шаблон Pod, имеющий соответствующий шаблон контейнера (шаблон контейнера с тем же именем) в «родительском» шаблоне, унаследуют конфигурацию родительского шаблона контейнера. Если соответствующий шаблон контейнера не найден, шаблон добавляется как есть.

Наследование томов работает точно так же, как и наследование шаблонов контейнеров.

Секреты извлечения образов объединяются (используются все секреты, определённые как в «родительском», так и в текущем шаблонах).

В приведённом ниже примере мы унаследуем созданный ранее шаблон Pod и просто переопределим версию «maven», чтобы она использовала jdk-7 вместо неё:

podTemplate(label: 'anotherpod', inheritFrom: 'mypod'  containers: [
    containerTemplate(name: 'maven', image: 'maven:3.3.9-jdk-7-alpine')
  ]) {

      //Let's not repeat ourselves and ommit this part
}

Обратите внимание, что нам нужно указать только те вещи, которые отличаются. Таким образом, ttyEnabled и command не указаны, поскольку они унаследованы. Также контейнер golang будет добавлен, как определено в «родительском» шаблоне.

Множественное наследование шаблонов Pod

Поле inheritFrom может ссылаться на один шаблон Pod или несколько, разделённых пробелом. В последнем случае каждый шаблон будет обрабатываться в порядке их появления в списке (более поздние элементы переопределяют более ранние). В любом случае, если Конфигурация При настройке контейнера в модуле конвейера podTemplate доступны следующие опции:

podTemplate(cloud: 'kubernetes', containers: [
    containerTemplate(
        name: 'mariadb',
        image: 'mariadb:10.1',
        ttyEnabled: true,
        privileged: false,
        alwaysPullImage: false,
        workingDir: '/home/jenkins',
        resourceRequestCpu: '50m',
        resourceLimitCpu: '100m',
        resourceRequestMemory: '100Mi',
        resourceLimitMemory: '200Mi',
        envVars: [
            envVar(key: 'MYSQL_ALLOW_EMPTY_PASSWORD', value: 'true'),
            secretEnvVar(key: 'MYSQL_PASSWORD', secretName: 'mysql-secret', secretKey: 'password'),
            ...
        ],
        ports: [portMapping(name: 'mysql', containerPort: 3306, hostPort: 3306)]
    ),
    ...
],
volumes: [
    emptyDirVolume(mountPath: '/etc/mount1', memory: false),
    secretVolume(mountPath: '/etc/mount2', secretName: 'my-secret'),
    configMapVolume(mountPath: '/etc/mount3', configMapName: 'my-config'),
    hostPathVolume(mountPath: '/etc/mount4', hostPath: '/mnt/my-mount'),
    nfsVolume(mountPath: '/etc/mount5', serverAddress: '127.0.0.1', serverPath: '/', readOnly: true),
    persistentVolumeClaim(mountPath: '/etc/mount6', claimName: 'myClaim', readOnly: true)
],
imagePullSecrets: [ 'pull-secret' ],
annotations: [
    podAnnotation(key: "my-key", value: "my-value")
    ...
]) {
   ...
}

## Declarative Pipeline

Declarative Pipeline support требует Jenkins 2.66+.

Декларативные агенты могут быть определены из yaml.

```groovy
pipeline {
  agent {
    kubernetes {
      defaultContainer 'jnlp'
      yaml """
apiVersion: v1
kind: Pod
metadata:
  labels:
    some-label: some-label-value
spec:
  containers:
  - name: maven
    image: maven:alpine
    command:
    - cat
    tty: true
  - name: busybox
    image: busybox
    command:
    - cat
    tty: true
"""
    }
  }
  stages {
    stage('Run maven') {
      steps {
        container('maven') {
          sh 'mvn -version'
        }
        container('busybox') {
          sh '/bin/busybox'
        }
      }
    }
  }
}

или с использованием yamlFile для сохранения шаблона модуля в отдельном файле KubernetesPod.yaml.

pipeline {
  agent {
    kubernetes {
      defaultContainer 'jnlp'
      yamlFile 'KubernetesPod.yaml'
    }
  }
  stages { ... }
}

Обратите внимание, что ранее было возможно определить containerTemplate, но это было устарело в пользу формата yaml.

pipeline {
  agent {
    kubernetes {
      //cloud 'kubernetes'
      containerTemplate {
        name 'maven'
        image 'maven:3.3.9-jdk-8-alpine'
        ttyEnabled true
        command 'cat'
      }
    }
  }
  stages { ... }
}

Запустите конвейер или отдельный этап в пользовательском рабочем пространстве — не требуется, если явно не указано.

pipeline {
  agent {
    kubernetes {
      customWorkspace 'some/other/path'
      defaultContainer 'maven'
      yamlFile 'KubernetesPod.yaml'
    }
  }

  stages {
    stage('Run maven') {
      steps {
        sh 'mvn -version'
        sh "echo Workspace dir is ${pwd()}"
      }
    }
  }
}

Наследование по умолчанию

В отличие от шаблонных k8s шаблонов, декларативные шаблоны не наследуются от родительского шаблона. Вам необходимо явно объявить наследование, если это необходимо. В следующем примере nested-pod будет содержать только контейнер maven.

pipeline {
  agent {
    kubernetes {
      label 'parent-pod'
      yaml """
spec:
  containers:
  - name: golang
    image: golang:1.6.3-alpine
    command:
    - cat
    tty: true
"""
    }
  }
  stages {
    stage('Run maven') {
        agent {
            kubernetes {
                label 'nested-pod'
                yaml """
spec:
  containers:
  - name: maven
    image: maven:3.3.9-jdk-8-alpine
    command:
    - cat
    tty: true
"""
            }
        }
      steps {
        ...
      }
    }
  }
}

Доступ к журналам контейнеров из конвейера

Если вы используете containerTemplate для запуска какой-либо службы в фоновом режиме (например, базы данных для вашего приложения), вы можете получить доступ к её журналам через kubectl logs. Настройка сервера API Kubernetes

Вы можете настроить новый регистратор журналов Jenkins для okhttp3 на уровне DEBUG.

Удаление подов в плохом состоянии

kubectl get pods -o name --selector=jenkins=slave --all-namespaces  | xargs -I {} kubectl delete {}

Сборка и тестирование

Интеграционные тесты будут использовать контекст, автоматически обнаруженный из файла конфигурации kube или учетной записи службы.

Ручное тестирование

Запустите mvn clean install и скопируйте target/kubernetes.hpi в папку плагинов Jenkins.

Запуск интеграционных тестов Kubernetes

Обратите внимание, что система, на которой вы запускаете mvn, должна быть доступна из кластера. Если вы видите, что агенты подключаются не к тому хосту, вы можете использовать jenkins.host.address, как указано выше.

Интеграционные тесты с Minikube

Для интеграционных тестов установите и запустите minikube. Тесты обнаружат его и запустят набор интеграционных тестов в новом пространстве имен.

Некоторые интеграционные тесты запускают локальный Jenkins, поэтому хост, на котором они выполняются, должен быть доступен из кластера Kubernetes. По умолчанию Jenkins будет прослушивать только интерфейс 192.168.64.1 по соображениям безопасности. Если ваш minikube работает не в этой сети, передайте connectorHost maven, например:

mvn clean install -DconnectorHost=$(minikube ip | sed -e 's/\([0-9]*\.[0-9]*\.[0-9]*\).*/\1.1/')

Если вы не против того, чтобы другие пользователи вашей сети могли использовать ваш тестовый Jenkins, вы можете просто использовать это:

mvn clean install -DconnectorHost=0.0.0.0

Тогда ваш тестовый Jenkins будет слушать все IP-адреса, так что сборочные поды смогут подключаться из подов вашего minikube VM к вашему хосту.

Если ваш minikube запущен на виртуальной машине (например, virtualbox), а хост, выполняющий mvn, не имеет общедоступного имени хоста для доступа виртуальной машины, вы можете установить системное свойство jenkins.host.address на IP-адрес вашего хоста (только для хоста или NAT):

mvn clean install -Djenkins.host.address=192.168.99.1

Интеграционные тесты с Microk8s

Если Microk8s запущен и является контекстом по умолчанию в вашем ~/.kube/config, просто запустите:

mvn clean install -Pmicrok8s

Интеграционные тесты в другом кластере

Убедитесь, что вы создали пространства имен и роли с помощью следующих команд, затем запустите тесты в пространстве имен kubernetes-plugin с сервисной учетной записью jenkins (отредактируйте src/test/kubernetes/service-account.yml, чтобы использовать другую учетную запись службы):

kubectl create namespace kubernetes-plugin-test
kubectl create namespace kubernetes-plugin-test-overridden-namespace
kubectl create namespace kubernetes-plugin-test-overridden-namespace2
kubectl apply -n kubernetes-plugin-test -f src/main/kubernetes/service-account.yml
kubectl apply -n kubernetes-plugin-test-overridden-namespace -f src/main/kubernetes/service-account.yml
kubectl apply -n kubernetes-plugin-text-overridden-namespace2 -f src/main/kubernetes/service-account.yml
kubectl apply -n kubernetes-plugin-test -f src/test/kubernetes/service-account.yml
kubectl apply -n kubernetes-plugin-test-overridden-namespace -f src/test/kubernetes/service-account.yml
kubectl apply -n kubernetes-plugin-test-overridden-namespace2 -f src/test/kubernetes/service-account.yml

Образ Docker

Образ Docker для Jenkins с установленным плагином. Основан на официальном образе.

Запуск образа Docker

docker run --rm --name jenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home csanchez/jenkins-kubernetes

Запуск в Kubernetes

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

Локальное тестирование с minikube

Локальный тестовый кластер с одним узлом можно создать с помощью minikube:

minikube start

Возможно, вам потребуется установить правильные разрешения для подключенных томов хоста:

minikube ssh
sudo chown 1000:1000 /tmp/hostpath-provisioner/pvc-*

Затем создайте пространство имен Jenkins, контроллер и службу с помощью:

kubectl create namespace kubernetes-plugin
    kubectl config set-context $(kubectl config current-context) --namespace=kubernetes-plugin
    kubectl create -f src/main/kubernetes/service-account.yml
    kubectl create -f src/main/kubernetes/jenkins.yml

Get the url to connect to with:

    minikube service jenkins --namespace kubernetes-plugin --url

## Запуск с удаленным кластером Kubernetes в AWS EKS

EKS обеспечивает аутентификацию в кластере через [aws-iam-authenticator](https://docs.aws.amazon.com/eks/latest/userguide/install-aws-iam-authenticator.html). Срок действия токена истекает через 15 минут, поэтому необходимо установить кэш клиента kubernetes ниже этого значения, установив [аргумент java](https://support.cloudbees.com/hc/en-us/articles/209715698-How-to-add-Java-arguments-to-Jenkins-) следующим образом:

JAVA_ARGS="-Dorg.csanchez.jenkins.plugins.kubernetes.clients.cacheExpiration=60"


## Запуск в Google Container Engine GKE

Предполагая, что вы создали кластер Kubernetes с именем `jenkins`, вот как запустить Jenkins и агентов там.

Создание всех элементов и установка пространства имён по умолчанию:

    kubectl create namespace kubernetes-plugin
    kubectl config set-context $(kubectl config current-context) --namespace=kubernetes-plugin
    kubectl create -f src/main/kubernetes/service-account.yml
    kubectl create -f src/main/kubernetes/jenkins.yml

Подключитесь к IP сетевого балансировщика нагрузки, созданного Kubernetes, порт 80. Получите IP (в данном случае `104.197.19.100`) с помощью команды `kubectl describe services/jenkins` (может потребоваться некоторое время для заполнения):

    $ kubectl describe services/jenkins
    Name:           jenkins
    Namespace:      default
    Labels:         <none>
    Selector:       name=jenkins
    Type:           LoadBalancer
    IP:         10.175.244.232
    LoadBalancer Ingress:   104.197.19.100
    Port:           http    80/TCP
    NodePort:       http    30080/TCP
    Endpoints:      10.172.1.5:8080
    Port:           agent   50000/TCP
    NodePort:       agent   32081/TCP
    Endpoints:      10.172.1.5:50000
    Session Affinity:   None
    No events.

До тех пор, пока Kubernetes 1.4 не удалит SNATing исходных IP-адресов, кажется, что CSRF (включённый по умолчанию в Jenkins 2) необходимо настроить, чтобы избежать ошибок `WARNING: No valid crumb was included in request`. Это можно сделать, проверив _Включить совместимость прокси_ в разделе Управление Jenkins -> Настройка глобальной безопасности.

Настройте Jenkins, добавив облако `Kubernetes` в конфигурацию, установив URL Kubernetes на конечную точку кластера контейнерного движка или просто `https://kubernetes.default.svc.cluster.local`. В разделе учётных данных нажмите `Добавить` и выберите `Учётная запись службы Kubernetes`, или же используйте имя пользователя и пароль API Kubernetes. Выберите «Сертификат» в качестве типа учётных данных, если кластер kubernetes настроен на использование клиентских сертификатов для аутентификации.

Использование `Учётной записи службы Kubernetes` приведёт к тому, что плагин будет использовать токен по умолчанию, смонтированный внутри модуля Jenkins. Дополнительную информацию см. в статье [Настройка учётных записей служб для модулей](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/).

![image](credentials.png)

Возможно, вы захотите установить `Jenkins URL` на внутренний служебный IP, например, `http://10.175.244.232`, чтобы подключиться через внутреннюю сеть.

Установите `Ограничение контейнеров` на разумное число для тестов, например 3.

Добавьте образ с:

* Образом Docker: `jenkins/jnlp-slave`
* Корневым каталогом агента Jenkins: `/home/jenkins`

![image](configuration.png)

Теперь всё готово к использованию.

Разрушение:

    kubectl delete namespace/kubernetes-plugin

## Настройка развёртывания

### Изменение ЦП и памяти запроса/лимитов (Kubernetes Resource API)

Измените файл `./src/main/kubernetes/jenkins.yml` желаемыми ограничениями:

```yaml
resources:
      limits:
        cpu: 1
        memory: 1Gi
      requests:
        cpu: 0.5
        memory: 500Mi

Примечание: JVM будет использовать память запросов как предел кучи (-Xmx).

Сборка

docker build -t csanchez/jenkins-kubernetes .

Связанные проекты

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Это плагин Jenkins, который поддерживает работу динамических узлов в кластере Kubernetes. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/linuxsuren-kubernetes-plugin.git
git@api.gitlife.ru:oschina-mirror/linuxsuren-kubernetes-plugin.git
oschina-mirror
linuxsuren-kubernetes-plugin
linuxsuren-kubernetes-plugin
master