我正在尝试使用多个Kubernetes云,并且只有一个Jenkins。我能够将两个Kubernetes集群都注册为云,并且所有登录检查均有效。当我在Jenkins所在的集群上运行构建时,它可以正常工作,提取代码,构建映像等等。
但是,当我将标签更改为我的第二个集群时,那里没有任何Jenkins,似乎永远都不想在那建立,而总是在Jenkins本地的集群上建立。
我想必我缺少一些愚蠢的东西,但看不到它是什么。
答案 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/)。
即使我使用
它仍然会抱怨它正在获取串行数据而不是二进制数据。
对于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主服务器。
解决方案2
人们不断抱怨,最终有人在2020年2月20日左右对Jenkins进行了新功能。他们引入了Websocket,可以在HTTP上运行并将其转换为从站上的TCP。
我确实进行了设置,但是它似乎太新了,即使FS上的从站表示已连接,但它仍无法与我一起使用,但仍无法与TC上的Jenkins主机正确通信。仍然会看到代理/从机吊舱处于脱机状态。
这是我使用的链接
结论
经过大量的摆弄,研究和摸索,我认为唯一的解决方案是解决方案#1。解决方案1的问题不存在,无法将HTTP封装到TCP并返回的简单工具或服务(据我所知,我搜索了几天)。这意味着,我得自己做一个。
解决方案2仍然太新,从零到零的文档可以帮助我或使设置变得容易,并且似乎存在一些错误。似乎修复这些错误的唯一方法是同时修改Jenkins和jnlp代理的代码,我什至不知道从哪里开始。