一个詹金斯人,两个Kubernetes集群

时间:2019-03-06 18:07:06

标签: jenkins kubernetes

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

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

我想必我缺少一些愚蠢的东西,但看不到它是什么。

2 个答案:

答案 0 :(得分: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} ======================================================="
            }                
        }             
}

您可以在GitHub中用于Jenkins回购的Kubernetes插件的文档中的示例中看到以下内容: https://github.com/jenkinsci/kubernetes-plugin Ctrl + f并搜索云“ kubernetes”

答案 1 :(得分:0)

您可能从另一个群集中缺少服务帐户令牌。如果您在Jenkins-> Manage Jenkins的Kubernetes配置上测试集群连接,将会得到什么结果。

您可能需要使用:

kubectl describe sa <service account>

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

kubectl describe secret <token>

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

如果您进入Jenkins的云配置,它将为您提供“成功”:

Jenkins cloud config result example

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

有2种选择,到目前为止,我还不能给您确切的答案,但是我可以提供选择和解释。

上下文

我有2个名为FS和TC的Kubernetes集群。 我正在使用的Jenkins在TC上运行。

从服务器确实从TC Jenkins部署在FS中,但是FS中的从服务器无法连接到TC中的Jenkins主服务器。

从站利用需要HOST和PORT的TCP连接。但是,TC上公开的jnlp服务是HTTP(http:/jenkins-jnlp.tc.com/)。

即使我使用

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

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

The complaint

对于TC,我通过端口(50000)使用了本地jnlp服务HOST(jenkins-jnlp.svc.cluster.local)。这对于我们当前的TC环境非常有效。

解决方案

解决方案#1

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

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

Diagram to understand better

解决方案2

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

我确实进行了设置,但是它似乎太新了,即使FS上的从站表示已连接,但它仍无法与我一起使用,但仍无法与TC上的Jenkins主机正确通信。仍然会看到代理/从机吊舱处于脱机状态。

这是我使用的链接

  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代理的代码,我什至不知道从哪里开始。