jenkins - 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。
即使我使用
- 主机:jenkins-jnlp.tc.com
- 港口:80
它仍然会抱怨它正在获取串行数据而不是二进制数据。
对于 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。解决方案#1 的问题,不存在将 HTTP 封装到 TCP 并返回的简单工具或服务(据我所知,我搜索了几天)。这意味着,我必须自己做一个。
解决方案 #2 仍然太新,零到没有文档来帮助我或使其易于设置,并且似乎带有一些错误。似乎修复这些错误的唯一方法是修改 Jenkins 和 jnlp 代理的代码,我什至不知道从哪里开始。
更新#1
我已经完成了中间容器的代码。我现在可以从 HTTP 到 TCP 的下游,我只需要设置一个上游 TCP 到 HTTP。
还要考虑运行单个中央 docker 容器以转换协议所需的多线程量。完成后,我想将 HTTP-to-TCP 容器作为边车添加到 Jenkins 代理。
这样每次slave在不同的集群中启动时,它都会自动连接,我不必担心多个连接。这就是理论,但显然我想要结果,你们也是。
解决方案
推荐阅读
- javascript - 使用 dom-to-image 库下载时排除元素
- c - 二分搜索 - 为什么每次更改间隔时都需要减 1/加 1?
- postgresql - 在 Postgresql 中将 2 行合并为 1 行
- node.js - K8S - 从服务目录中获取服务列表
- google-api - 谷歌搜索控制台 API
- haskell - 无法将预期类型“IO ()”与实际类型匹配 [Place]
- regex - 确定特定格式的字符串的正则表达式
- c# - 异步程序未异步运行的奇怪行为
- powerbi - 计算去年同一会计期间的总收入
- java - Xml 签名在 .NET 中验证正常,但在 Java 中失败