Jenkins и Kubernetes с Docker Desktop

Stepan Mikulov

Administrator
Команда форума
С полной версией поддержки Kubernetes для Docker Desktop я решил обновить свое руководство по локальной разработке с помощью Jenkins. Новое предложение значительно упрощает локальную работу локального кластера Kubernetes.
Настройте рабочий стол Docker для Windows для запуска Kubernetes. Не забудьте изменить настройки, чтобы предоставить Docker немного больше ресурсов и поделиться своими дисками.
Чтобы упростить отладку развертываний в кластере, я разверну панель управления Kubernetes с помощью команды helm.

helm install --wait --name k8s-dash --set service.type=NodePort,service.nodePort=31111 stable/kubernetes-dashboard

Я столкнулся с несколькими проблемами при установке панели управления Kubernetes. Во-первых, helm кэширует диаграммы локально, и, поскольку я установил другую версию диаграммы более года назад, я столкнулся с проблемой попытки использовать последние параметры для старой диаграммы. Чтобы решить эту проблему, запустите обновление репозитория helm, чтобы получить последние диаграммы. Вторая проблема заключалась в доступе к пользовательскому интерфейсу в Chrome, который не мог расшифровать сертификат SSL со следующей ошибкой.


You cannot visit localhost right now because the website sent scrambled credentials that Chrome cannot process.

Чтобы исправить это, я выполнил ответ https://stackoverflow.com/a/31900210/5732682. Я бы никогда не включил это на производственном сервере, и вы тоже.
После того, как все будет установлено и настроено, вы сможете посетить https: // localhost: 31111 и получить доступ к пользовательскому интерфейсу Dashboard.
Затем мы хотим развернуть Jenkins в кластере и настроить его для локальной разработки.

Master:
ImageTag: "2.141"
ServiceType: NodePort
NodePort: 32222
UseSecurity: false
InstallPlugins:
- kubernetes:1.12.4
- workflow-aggregator:2.5
- credentials-binding:1.16
- git:3.9.1
- blueocean:1.8.2
- timestamper:1.8.10
- greenballs:1.15
- cobertura:1.12.1
ScriptApproval:
- method groovy.json.JsonSlurperClassic parseText java.lang.String
- method java.util.Collection toArray
- method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment
- new groovy.json.JsonSlurperClassic
- staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods first java.lang.Object[]
- staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods leftShift java.util.Map java.util.Map
- staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods split java.lang.String
- staticMethod org.kohsuke.groovy.sandbox.impl.Checker checkedCall java.lang.Object boolean boolean java.lang.String java.lang.Object[]
- staticMethod org.kohsuke.groovy.sandbox.impl.Checker checkedGetProperty java.lang.Object boolean boolean java.lang.Object
InitScripts:
JobRelationshipManager: |-
import jenkins.model.Jenkins
import org.jenkinsci.plugins.workflow.job.WorkflowJob
import hudson.plugins.git.GitSCM
def jobs = hudson.model.Hudson.instance.getAllItems(org.jenkinsci.plugins.workflow.job.WorkflowJob)*.fullName
if('JobRelationshipManager' in jobs) {
println 'JobRelationshipManager already defined'
} else {
WorkflowJob job = Jenkins.instance.createProject(WorkflowJob, 'JobRelationshipManager')
GitSCM scm = new GitSCM("/code/jobrm/websiteui")
def flowDefinition = new org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition(scm, "Jenkinsfile.local")
job.definition = flowDefinition
Jenkins.instance.reload()
}
Agent:
Enabled: true
ImageTag: alpine
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1024Mi"
volumes:
- type: HostPath
hostPath: /host_mnt/e/code
mountPath: /code
- type: HostPath
hostPath: /var/run/docker.sock
mountPath: /var/run/docker.sock
rbac:
install: true
Persistence:
ExistingClaim: jenkins-pvc
volumes:
- name: source-code
hostPath:
path: /host_mnt/e/code
mounts:
- mountPath: /code
name: source-code
view rawjenkins-helm-values.yaml hosted with ❤ by GitHub
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
storageClassName: hostpath
selector:
matchLabels:
app: "jenkins"
matchExpressions:
- {key: release, operator: In, values: [jenkins]}
view rawpvc.yaml hosted with ❤ by GitHub

Раньше я использовал плагин File System SCM для мониторинга и использования локальной папки для сборок. Но есть более простое решение, которое работает почти так же хорошо, и не требует установки дополнительных плагинов. Мы можем использовать путь к папке к локальному репозиторию git, как если бы это был удаленный репозиторий. Единственная проблема с этим способом заключается в том, что Jenkins будет использовать только сервер git для изменений, а не для изменений локальных файлов, поэтому вам нужно будет проверить изменения локально, прежде чем сборка сможет их забрать. Но я заметил, что производительность намного выше, если использовать только git и не полагаться на файловую систему для отслеживания изменений.
Docker Desktop с Kubernetes монтирует локальные общие тома в / host_mount / {DRIVE_LETTER} / в средах Windows. Конфигурация агента - это отдельная конфигурация модуля, для которой нужен собственный путь к исходному коду.
Есть и другие изменения, облегчающие жизнь, которые я реализовал с момента последнего написания конфигурации. Во-первых, это отключение безопасности для локальной разработки в строке 6. Это удаляет часть входа в систему Jenkins и дает бонус в виде отсутствия необходимости каждый раз искать пароль администратора. Я также увеличил ресурсы агента по умолчанию, строка 52. Возникла проблема, когда Kubernetes завершал работу модуля после достижения пределов ресурсов агента и завершал сборку с ошибкой. Это было исправлено увеличением лимитов.
Чтобы избежать времени раскрутки и необходимости загружать все плагины в хранилище, я использую PersistentVolumeClaim, который выделяется заранее. Таким образом, каждый раз, когда я удаляю воссоздать экземпляр Jenkins, не так много времени задержки его вызова. Иногда необходимо удалить и воссоздать том, и это можно сделать с помощью простой команды kubectl.
Я иногда сталкивался с проблемой, что постоянный том не может быть привязан к модулю, что, как я подозреваю, связано с тем, что у меня был старый постоянный том в кластере из предыдущей конфигурации Jenkins, который, возможно, мешал привязке нового тома в капсулу. Я только что очистил свои постоянные тома, удалив их из пользовательского интерфейса, или вы можете использовать kubectl для их удаления. После этого я удалил развертывание Jenkins и повторно развернул как Persistent Volume, так и Jenkins.
На этом мы завершаем быструю и простую настройку Jenkins на Kubernetes локально.


Перевод статьи с сайта: https://medium.com/@garunski/jenkins-and-kubernetes-with-docker-desktop-53a853486f7c
 
Сверху