【问题标题】:Jenkinsfile Kubernetes expose container portsJenkinsfile Kubernetes 暴露容器端口
【发布时间】:2019-03-14 13:24:41
【问题描述】:

我正在尝试在我的 Jenkins 管道中导出我的 Kubernetes 容器上的一个端口。

我在网上查了一下,就是不知道如何让它工作。

我需要将端口 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 中做到这一点。

我在网上尝试了一些示例,但似乎没有更接近。

【问题讨论】:

    标签: selenium jenkins kubernetes jenkins-pipeline jenkins-plugins


    【解决方案1】:

    将 Kubernetes pod 视为对传统服务器的抽象。如果 pod 中的容器在特定端口上暴露了 mysql 或 selenium 之类的服务,则默认情况下,pod 中的所有其他容器都可以访问所选端口上的该服务:

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

    与其使用 POD_IP,不如尝试使用 localhost:4444(或您需要的任何端口)来访问服务。

    在各种构建中的单元测试期间,我使用相同的模式访问 sidecar 容器中的 mysql。

    【讨论】:

    • 所以这适用于“节点”容器击中“网格”但是,由于我们的 kubernetes 服务器是我们 jenkins 服务器的从属服务器,ip 不同,所以我不能使用本地主机, POD_IP 获取容器正在运行的从属设备的 ip,然后我需要公开 4444 以便它在从属设备上打开,以便主詹金斯可以访问它....如果这有意义,谢谢
    • @Karl 为什么需要Jenkins master 才能访问slave?在您的示例中,您似乎在同一个 pod 中运行集线器和浏览器。通信是从浏览器到集线器的,对吧?
    【解决方案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

    【讨论】:

      猜你喜欢
      • 2018-05-22
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 2017-01-28
      • 2019-02-01
      相关资源
      最近更新 更多