Jenkinsfile Kubernetes предоставляет доступ к портам контейнера

#selenium #jenkins #kubernetes #jenkins-pipeline #jenkins-plugins

#selenium #дженкинс #kubernetes #jenkins-конвейер #jenkins-плагины

Вопрос:

Я пытаюсь экспортировать порт из моего контейнера Kubernetes в мой конвейер Jenkins.

Я посмотрел онлайн, и я просто не могу понять, как заставить это работать.

Мне нужно экспортировать порт 4444 в контейнер selenium-hub.

 def label = "selenium-hub-${UUID.randomUUID().toString()}"

podTemplate(label: label, yaml: """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: selenium-hub
    image: selenium/hub:3.4.0
    
  - name: selenium-chrome
    image: selenium/node-chrome:3.4.0
    env:
    - name: HUB_PORT_4444_TCP_ADDR
      value: localhost
    - name: HUB_PORT_4444_TCP_PORT
      value: 4444
    - name: DISPLAY
      value: :99.0
    - name: SE_OPTS
      value: -port 5556
  - name: selenium-firefox
    image: selenium/node-firefox:3.4.0
    env:
    - name: HUB_PORT_4444_TCP_ADDR
      value: localhost
    - name: HUB_PORT_4444_TCP_PORT
      value: 4444
    - name: DISPLAY
      value: :98.0
    - name: SE_OPTS
      value: -port 5557
  

В настоящее время я получаю IP-адрес от концентратора и передаю его в свои тесты для запуска через сетку

   node(label) {
        containerLog('selenium-hub')
        sh('hostname -i')
        POD_IP = sh(script: "hostname -i", returnStdout: true).toString().replaceAll('\n', '');
        node() {
            sh("POD_IP='${POD_IP}' UI_URL=https://EEEEEE.net/ SERVICE_URL=https://WWWWWW.net/ ./node_modules/webdriverio/bin/wdio ./tests/UI/helpers/configs/wdio.GRID.conf.js --nolazy")
        }
  

Мне кажется, что в момент запуска тестов он не может получить доступ к сетке, поэтому я полагаю, что это связано с тем, что порт 4444 не открыт, но я не могу понять, как это сделать в Kubernetes.

Я попробовал несколько примеров в Интернете, но, похоже, они не стали ближе.

Ответ №1:

Представьте модуль Kubernetes как абстракцию традиционного сервера. Если контейнер в модуле предоставляет доступ к службе, такой как mysql или, в данном случае, selenium, на определенном порту, то все остальные контейнеры в модуле могут получить доступ к этой службе на выбранном порту по умолчанию:

https://kubernetes.io/docs/concepts/workloads/pods/pod/#resource-sharing-and-communication

Вместо использования POD_IP просто попробуйте использовать localhost: 4444 (или любой другой порт, который вам нужен) для доступа к сервису.

Я использую один и тот же шаблон для доступа к mysql в контейнере sidecar во время модульных тестов в различных сборках.

Комментарии:

1. Итак, это работает для контейнеров «узла», попадающих в «сетку», но, поскольку наш сервер kubernetes является подчиненным для нашего сервера jenkins, ip отличается, поэтому я не могу использовать локальный хост, POD_IP получает ip подчиненного устройства, на котором запущены контейнеры, затем мне нужно предоставить 4444, чтобы он был открыт на подчиненном устройстве, чтобы главный дженкинс мог получить к нему доступ …. если это имеет смысл, спасибо

2. @Karl зачем вам нужен главный Jenkins, чтобы иметь доступ к ведомому устройству? В вашем примере похоже, что вы запускаете концентратор и браузер в одном модуле. Связь идет от браузера к концентратору, верно?

Ответ №2:

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

 apiVersion: v1
kind: Service
metadata:
  name: selenium-hub
  labels:
    app: selenium-hub
spec:
  ports:
  - port: 4444
    targetPort: 4444
    name: port0
  selector:
    app: selenium-hub
  type: NodePort
  sessionAffinity: None
  

Для получения дополнительной информации https://github.com/kubernetes/examples/tree/master/staging/selenium