Один Дженкинс, два Кубернетских кластера
Я пытаюсь использовать несколько облаков Kubernetes и иметь только одного Дженкинса. Мне удалось зарегистрировать оба кластера Kubernetes как облака, и все проверки входа в систему работают. Когда я запускаю сборку в кластере, где находится Jenkins, он работает нормально, извлекает код, создает образ и все такое.
Тем не менее, когда я меняю метку на свой второй кластер, в нем нет Jenkins, который, кажется, никогда не хочет строить там и всегда строится на кластере, локальном для Jenkins.
Я упускаю что-то глупое, я уверен в этом, но не понимаю, что это такое.
0 ответов
Чтобы заставить его работать с двумя кластерами Kubernetes и одним Jenkins, я использовал директиву под названием: cloud '' вот так:
stage('do something') {
agent { kubernetes {
// CluserName is configured in Jenkins --> Manage Jenkins --> configure system in the Kubernetes plugin section
cloud '<Clustername>'
label "<TheLabelYouGave>"
containerTemplate {
name 'maven'
image 'maven:3.3.9-jdk-8-alpine'
ttyEnabled true
command 'cat'
}
}
}
steps {
script {
echo "${pom.version} ======================================================="
}
}
}
Вы можете увидеть это в примерах, размещенных в документации плагина Kubernetes для репозитория Jenkins в GitHub: https://github.com/jenkinsci/kubernetes-pluginCtrl + f и выполните поиск облачных 'kubernetes'
Возможно, вам не хватает токена учетной записи службы из другого кластера. Если вы протестируете кластерное соединение в конфигурации Kubernetes в Jenkins -> Manage Jenkins, какой результат вы получите.
Возможно, вам понадобится:
kubectl describe sa <service account>
Затем вы увидите токен, затем скопируйте этот токен, используя эту команду:
kubectl describe secret <token>
Затем вы можете скопировать этот длинный токен и поместить его в учетные данные Jenkins как токен kubernetes или просто токен.
Если вы перейдете в облачную конфигурацию в Jenkins, она даст вам "Success":
Пример результата конфигурации облака Jenkins
Я сижу с новой проблемой, с которой вы тоже можете скоро столкнуться. Я потратил на это около 2 рабочих недель.
Есть 2 варианта, я пока не могу дать вам окончательный ответ, но могу дать варианты и объяснения.
КОНТЕКСТ
У меня есть 2 кластера кубернетов под названием FS и TC. Дженкинс, который я использую, работает на TC.
Подчиненные устройства развертываются в FS из TC Jenkins, однако ведомые устройства в FS не подключаются к мастеру Jenkins в TC.
Подчиненные устройства используют TCP-соединение, которое требует HOST и PORT. Однако предоставляемая служба jnlp на TC - это HTTP (http:/jenkins-jnlp.tc.com/).
Даже если я использую
- ВЕДУЩИЙ: jenkins-jnlp.tc.com
- ПОРТ: 80
Он по-прежнему будет жаловаться, что получает последовательные данные вместо двоичных данных.
Для TC я использовал локальную службу JNLP HOST (jenkins-jnlp.svc.cluster.local) с ПОРТОМ (50000). Это хорошо работает в нашей текущей среде TC.
РЕШЕНИЯ
Решение #1
Возможное решение могло бы заключаться в наличии контейнера ретрансляции HTTP на TCP, работающего между ведомым и главным устройством на FS. Затем он будет связан с URL-адресом HTTP в TC (http:/jenkins-jnlp.tc.com/), инкапсулируя HTTP-соединение с TCP (localhost:50000) и наоборот.
Затем ведомые устройства на FS могут подключаться к ведущему устройству TC, используя этот TCP-порт, доступный из этого контейнера в середине.
Решение #2
Люди продолжали жаловаться, и, в конце концов, примерно 20 февраля 2020 года кто-то сделал для Jenkins новые функции. Они представили веб-сокеты, которые могут работать через HTTP и преобразовывать его в TCP на ведомом устройстве.
Я настроил его, но он кажется слишком новым и не работает для меня, хотя подчиненное устройство на FS говорит, что оно подключено, но все еще не взаимодействует должным образом с мастером Jenkins на TC. Он по-прежнему видит модуль агента / подчиненного устройства как отключенный.
Вот ссылки, которые я использовал
- Исходный пост
- Примечание об обновлении Дженкинса
- Подробности о Jenkins WebSocket
- Входящий агент Jenkins на github
- DockerHub Дженкинс-входящий-агент
ЗАКЛЮЧЕНИЕ
После множества возни, исследований и ударов головой о стену, я думаю, что единственное решение - это решение №1. Проблема с решением №1, простой инструмент или сервис для инкапсуляции HTTP в TCP и обратно, не существует (о чем я знаю, я искал несколько дней). Значит, мне придется сделать его самому.
Решение №2 все еще слишком ново, от нуля до нуля документов, которые могли бы помочь мне или упростить его настройку, и, похоже, в нем есть некоторые ошибки. Кажется, единственный способ исправить эти ошибки - это изменить код Jenkins и jnlp-агента, который я даже не знаю, с чего начать.