您可能缺少来自其他集群的服务帐户令牌。如果你在 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 处于脱机状态。
这是我使用的链接
- Original post
- Update note on Jenkins
- Details on Jenkins WebSocket
- Jenkins inbound-agent github
- DockerHub jenkins-inbound-agent
结论
经过大量的摆弄、研究和摸索后,我认为唯一的解决方案是解决方案 #1。解决方案#1 的问题,不存在将 HTTP 封装到 TCP 并返回的简单工具或服务(据我所知,我搜索了几天)。这意味着,我必须自己制作一个。
解决方案 #2 仍然太新,零到没有文档来帮助我或简化设置,并且似乎带有一些错误。似乎修复这些错误的唯一方法是修改 Jenkins 和 jnlp 代理的代码,我什至不知道从哪里开始。