【问题标题】:One Jenkins, Two Kubernetes Clusters一个 Jenkins,两个 Kubernetes 集群
【发布时间】:2019-03-06 18:07:06
【问题描述】:

我正在尝试使用多个 Kubernetes 云并且只有一个 Jenkins。我能够将两个 Kubernetes 集群都注册为云,并且所有登录检查都有效。当我在 Jenkins 所在的集群上运行构建时,它可以正常工作、提取代码、构建映像等等。

但是,当我将标签更改为我的第二个集群时,没有任何 Jenkins 似乎永远不想在那里构建,并且总是在 Jenkins 本地的集群上构建。

我错过了一些愚蠢的东西,我很确定,但不明白它是什么。

【问题讨论】:

  • 你在用什么? Jenkins Kubernetes 插件?
  • 嗨,是的,我正在使用 jenkins kubernetes 插件。要让一个 Jenkins 与多个 Kubernetes 集群通信,只需配置第二个云并将您的 jenkinsfile 指向第二个云。您还需要添加密钥等,但它确实有效。

标签: jenkins kubernetes


【解决方案1】:

为了让它与两个 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} ======================================================="
            }                
        }             
}

您可以在 GitHub 中 Jenkins 存储库的 Kubernetes 插件文档中的示例中看到这一点: https://github.com/jenkinsci/kubernetes-plugin Ctrl + f 并搜索云“kubernetes”

【讨论】:

    【解决方案2】:

    您可能缺少来自其他集群的服务帐户令牌。如果你在 Jenkins -> Manage Jenkins 的 Kubernetes config 上测试集群连接,你会得到什么结果。

    您可能需要使用:

    kubectl describe sa <service account>
    

    然后您将看到一个令牌,然后使用以下命令复制该令牌:

    kubectl describe secret <token>
    

    然后您可以复制该长令牌并将其作为 kubernetes 令牌或只是令牌放入 Jenkins 凭据中。

    如果你去 Jenkins 中的云配置,它会给你“成功”:

    Jenkins cloud config result example

    我正面临一个新问题,您可能很快也会遇到。我为此花了大约 2 个工作周。

    有2个选项,我目前还不能给你一个明确的答案,但我可以给出选项和解释。

    上下文

    我有 2 个 kubernetes 集群,分别称为 FS 和 TC。 我使用的 Jenkins 在 TC 上运行。

    slave 确实从 TC Jenkins 部署在 FS 中,但是 FS 中的 slave 不会连接到 TC 中的 Jenkins master。

    slave 使用需要 HOST 和 PORT 的 TCP 连接。但是TC上暴露的jnlp服务是HTTP(http://jenkins-jnlp.tc.com/)。

    即使我使用

    • 主机:jenkins-jnlp.tc.com
    • 端口:80

    它仍然会抱怨它获取的是串行数据而不是二进制数据。

    The complaint

    对于 TC,我使用了带有 PORT (50000) 的本地 jnlp 服务 HOST (jenkins-jnlp.svc.cluster.local)。这适用于我们当前的 TC 环境。

    解决方案

    解决方案 #1

    一个可能的解决方案是在 FS 上的从属服务器和主服务器之间运行一个 HTTP 到 TCP 中继容器。然后它将链接到 TC 中的 HTTP url (http:/jenkins-jnlp.tc.com/),封装与 TCP (localhost:50000) 的 HTTP 连接,反之亦然。

    FS 上的从服务器然后可以使用从中间容器暴露的 TCP 端口连接到 TC 主服务器。

    Diagram to understand better

    解决方案 #2

    人们不断抱怨,最终有人在 2020 年 2 月 20 日左右为 Jenkins 提供了一个新功能。他们引入了可以在 HTTP 上运行并将其转换为从站上的 TCP 的 Websocket。

    我确实设置了它,但它似乎太新并且不适合我,即使 FS 上的从站说它已连接,它仍然无法与 TC 上的 Jenkins 主站正确通信。它仍然认为代理/从属 pod 处于脱机状态。

    这是我使用的链接

    1. Original post
    2. Update note on Jenkins
    3. Details on Jenkins WebSocket
    4. Jenkins inbound-agent github
    5. DockerHub jenkins-inbound-agent

    结论

    经过大量的摆弄、研究和摸索后,我认为唯一的解决方案是解决方案 #1。解决方案#1 的问题,不存在将 HTTP 封装到 TCP 并返回的简单工具或服务(据我所知,我搜索了几天)。这意味着,我必须自己制作一个。

    解决方案 #2 仍然太新,零到没有文档来帮助我或简化设置,并且似乎带有一些错误。似乎修复这些错误的唯一方法是修改 Jenkins 和 jnlp 代理的代码,我什至不知道从哪里开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-13
      • 2016-09-04
      • 2019-01-26
      • 2021-09-14
      • 2019-03-15
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多