首页 > 解决方案 > 1 Jenkins 2 个集群,第 2 个集群上的代理连接问题

问题描述

我正在处理一个您可能很快也会面临的新问题。如果可能的话,我需要一点帮助。我为此花了大约 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/),它使用 nginx 自动生成 URL。

即使我使用

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

投诉

对于 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 主服务器。

图表更好地理解

解决方案#2

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

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

这是我使用的链接

  1. 原帖
  2. 关于 Jenkins 的更新说明
  3. Jenkins WebSocket 的详细信息
  4. Jenkins 入站代理 github
  5. DockerHub jenkins-inbound-agent

结论

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

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

更新#1

我已经完成了中间容器的代码。我现在可以从 HTTP 到 TCP 的下游,我只需要设置一个上游 TCP 到 HTTP。

还要考虑运行单个中央 docker 容器以转换协议所需的多线程量。完成后,我想将 HTTP-to-TCP 容器作为边车添加到 Jenkins 代理。

这样每次slave在不同的集群中启动时,它都会自动连接,我不必担心多个连接。这就是理论,但显然我想要结果,你们也是。

标签: jenkinskubernetesjnlpagent

解决方案


推荐阅读