Один Дженкинс, два Кубернетских кластера

Я пытаюсь использовать несколько облаков 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. Он по-прежнему видит модуль агента / подчиненного устройства как отключенный.

Вот ссылки, которые я использовал

  1. Исходный пост
  2. Примечание об обновлении Дженкинса
  3. Подробности о Jenkins WebSocket
  4. Входящий агент Jenkins на github
  5. DockerHub Дженкинс-входящий-агент

ЗАКЛЮЧЕНИЕ

После множества возни, исследований и ударов головой о стену, я думаю, что единственное решение - это решение №1. Проблема с решением №1, простой инструмент или сервис для инкапсуляции HTTP в TCP и обратно, не существует (о чем я знаю, я искал несколько дней). Значит, мне придется сделать его самому.

Решение №2 все еще слишком ново, от нуля до нуля документов, которые могли бы помочь мне или упростить его настройку, и, похоже, в нем есть некоторые ошибки. Кажется, единственный способ исправить эти ошибки - это изменить код Jenkins и jnlp-агента, который я даже не знаю, с чего начать.

Другие вопросы по тегам