Команда — команда, которую будет выполнять контейнер.
По умолчанию время ожидания подключения агента установлено равным 100 секундам. В некоторых случаях вы можете захотеть установить другое значение, если это так, вы можете установить системное свойство org.csanchez.jenkins.plugins.kubernetes.PodTemplate.connectionTimeout
равным другому значению. Пожалуйста, ознакомьтесь со страницей Функции, управляемые системными свойствами, чтобы узнать, как настроить системные свойства в Jenkins.
Чтобы поддерживать любое возможное значение в объекте 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 унаследует селектор узла, служебную учётную запись, секреты извлечения образов контейнеров, шаблоны контейнеров и тома от шаблона, от которого он наследует.
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
будет добавлен, как определено в «родительском» шаблоне.
Поле 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.
Обратите внимание, что система, на которой вы запускаете mvn
, должна быть доступна из кластера. Если вы видите, что агенты подключаются не к тому хосту, вы можете использовать jenkins.host.address
, как указано выше.
Для интеграционных тестов установите и запустите 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 запущен и является контекстом по умолчанию в вашем ~/.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 для Jenkins с установленным плагином. Основан на официальном образе.
docker run --rm --name jenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home csanchez/jenkins-kubernetes
Пример конфигурации создаст набор состояний, на которых выполняется Jenkins с постоянным томом и используется учетная запись службы для аутентификации в Kubernetes API.
Локальный тестовый кластер с одним узлом можно создать с помощью 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/).

Возможно, вы захотите установить `Jenkins URL` на внутренний служебный IP, например, `http://10.175.244.232`, чтобы подключиться через внутреннюю сеть.
Установите `Ограничение контейнеров` на разумное число для тестов, например 3.
Добавьте образ с:
* Образом Docker: `jenkins/jnlp-slave`
* Корневым каталогом агента Jenkins: `/home/jenkins`

Теперь всё готово к использованию.
Разрушение:
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 )