【问题标题】:How to configure Jenkins master and dynamic agents in different clouds? With Kubernetes plugin如何在不同的云中配置 Jenkins 主代理和动态代理?使用 Kubernetes 插件
【发布时间】:2019-03-02 12:18:52
【问题描述】:

就上下文而言,我在一家大型公司工作,该公司的团队位于不同的云(Azure 和 IBM 云,前身为 Bluemix)。 Ops 团队最终将控制 Jenkins master,但由于我的团队是第一个需要这个的,我们正在设置它。

我们有什么:

  • Jenkins master 位于最新版本的 Azure (cloud A) 中,我们拥有 Kubernetes 插件(以及其他插件)来动态配置代理。
  • 我的团队在 IBM Kubernetes 集群(cloud B)中工作。在这个云中,我们在 k8s 集群中有一个用于 devops 的命名空间,我们希望在其中创建和运行从代理。在这个云中,我们还在该命名空间、角色和角色绑定中创建了一个服务帐户。

问题:配置 Jenkins 主服务器以连接 IBM 云中的此类命名空间,以根据需要配置代理并运行作业。 具体来说,在 Jenkins > 管理 > 配置系统 > 云中。 我有:

  • Kubernetes URL 设置为集群主节点的 IP:port
  • Kubernetes 服务器证书密钥,我把创建服务帐户时得到的证书放在这里。
  • 命名空间、凭据我有服务帐户,最后是 Jenkins URL。

当我尝试该配置并测试我得到的连接时:

错误测试连接https://ip:port:执行失败:GET at: https://ip:port/api/v1/namespaces/devops/pods。消息:未经授权! 配置的服务帐户无权访问。服务帐号可能 已被撤销。未经授权。

问题:

  • 有人知道怎么做或者有类似的链接吗?
  • 在图片中,我应该在 kubernetes URL 中输入什么?根据文档,我应该输入容器引擎集群端点,IBM Cloud 中的那个是什么?我有 Master 节点的 IP 和端口。

我已经阅读了很多来自 IBM 的文档、Jenkins 的 kubernetes 插件 (https://github.com/jenkinsci/kubernetes-plugin) 以及解释如何使用 kubernetes 和动态配置配置 jenkins 的大量其他帖子,其中许多人说可以拥有 jenkins和不同云中的奴隶,但没有人解释如何做到这一点..

提前谢谢你。

++++++++++++++++++++更新+++++++++++++++++++++++

在下面的屏幕截图中,我展示了我正在使用的配置。特别是 Kubernetes URLnamespace 字段。

感谢 @samhain1138 迄今为止的帮助,但 我无法在 Jenkins Kubernetes 插件配置部分成功连接测试。我想我可能没有在该部分的某些字段中输入正确的信息。

注意:请记住,我的设置如下:Jenkins master 在 Cloud A (Azure) 中,我希望代理节点运行在另一个云中的不同集群中,称之为 Cloud B(在我的案例是 IBM Cloud)。

在上面的屏幕截图中,我确定 Kubernetes URLnamespace 的值正确,但我不确定其他字段(Kubernetes服务器证书密钥凭据。)

Kubernetes 服务器证书密钥 字段中,我尝试输入:

  • IBM Kubernetes 集群中服务帐户的 ca.cert。 (通过 1. 创建服务帐户,获取该服务帐户的秘密,并从该秘密中提取 ca.cert 获得)
  • 来自服务器的“令牌”,我在 IBM 的 kubernetes 集群中进行 kubectl 配置视图。执行命令“kubectl config view”时,令牌位于字段 users>user>auth-provider>config>id-token

在凭据中,我创建并尝试了不同的种类

  • 用户名和密码:我使用 IBM 集群的凭据和服务帐户凭据尝试了此操作(当我创建服务帐户、角色和角色绑定时,我注意到创建的用户是 serviceaccountname-namespace-集群)
  • Kubernetes 服务帐号

我尝试了所有这些组合,但始终无法在测试连接时连接成功

我得到的错误:

【问题讨论】:

  • 您对服务帐户进行了哪些尝试,您使用的是什么服务帐户?
  • @Rico 在集群的命名空间中我计划运行从属服务器,我创建了一个 serviceAccount,一个角色,并将它与角色绑定绑定。我得到了它的秘密的 ca.cert 并把它放在 Jenkins > kubernetes 服务器证书密钥中。
  • @Alo 你没有很好地解释错误;是什么引发了错误?是当 cloud A 上的 Jenkins master 尝试打开与 cloud B 上的 Kubernetes master 的连接时?在这种情况下,必须在 cloud B 而不是 cloud A 上配置服务帐户
  • 嗨@samhain1138,我会在一分钟内编辑这个问题,但要回答你的问题,是的,这正是我的意思,我做到了。我在云 A(天蓝色)中有 Jenkins,在云 B(IBM)中有一个集群和命名空间。我在云 B 中获得了一个 serviceAccount、role 和 rolebinding,并将其证书放在 jenkins(在云 A 中)部分 kubernetes 的配置中,当我尝试测试连接时,我收到了该错误消息。
  • @Alo 您是如何在云 B 上创建服务帐户的?云 B 上是否启用了 RBAC?

标签: jenkins kubernetes azure-devops ibm-cloud devops


【解决方案1】:

好的,您需要更改 Jenkins 主 UI 中的一些内容,如果我理解正确的话,这些内容在您的 Azure 帐户中运行。

首先,Jenkins master 正在尝试连接到本地 (Azure) Kubernetes master。
您必须将其设置为可解析为运行在 IBM 上的 Kubernetes 主服务器。
就此而言,主机名将以“.local”结尾。

我怀疑您在发布的屏幕截图中使用的凭据是否与 IBM 上的 Kubernetes 主服务器相对应(它们对应于 Azure Kubernetes 主服务器,否则您会收到不同的错误),因此您需要更新那些,以及。
这已涵盖 here,完成后,here(在“然后,按照这些步骤设置 HTTP 凭据”下,忽略用于获取密码的 gcloud 命令)。
确保可以使用“测试连接”按钮 Azure 上的 Jenkins 主服务器访问 IBM 上的 Kubernetes 主服务器。

那么您似乎也混淆了 Kubernetes 命名空间设置。
您的服务帐户使用 devops 命名空间,而您的 Jenkins 主服务器配置为使用 kubernetes-plugin 命名空间。
服务帐户对应于命名空间,因此您需要将该设置更新为 devops

这仍然是一个非常糟糕的主意,尤其是在安全性方面(如果我嗅探您的连接,我可以复制并使用您的 IBM k8s 主服务器的密码 + 服务帐户,这允许我启动 pod!)。
你真的应该在 IBM 上运行那个 Jenkins master,或者如果你有充分的理由进行这种奇怪的设置,至少要确保这个连接通过 VPN...

【讨论】:

  • 谢谢!我正在尝试您现在所说的内容。尽管出于安全原因,我应该指出屏幕截图来自教程。在我的例子中,kubernetes URL 是 IBM 主节点的 IP 和端口,我修改了我上传的 yaml,命名空间不是 devops :)。我会在完全测试您的回复后立即更新!
  • @Alo 哦,好吧,我无法知道这一点,但强调这一点仍然很重要。祝你好运,请更新或接受答案! :)
  • 很抱歉,这对我不起作用。您共享的第一个链接“使用 k8s API 访问集群”我使用了“没有 kubectl 代理”部分,我得到了我在 Kubernetes URL 中使用的 APISERVER。而第二个链接,据说使用我的凭据 http 凭据假设 IBM Cluster 的凭据也没有工作。我将编辑显示我尝试过的所有内容的问题,希望对您有所帮助。我确实检查了我可以使用验证它的网站访问 IP 和端口。错误消息是:“禁止使用 pod:用户 \"system:anonymous\" 无法列出其中的 pod”
  • @Alo 我看到了更新,我什么都不懂,我需要你更详细地描述一切
  • 我刚刚修改了更新。我希望这有帮助。我现在的问题是在 Jenkins 配置页面中测试连接时出错,我相信我没有正确使用“Kubernetes 服务器证书密钥”或“凭据”字段。我尝试了 HTTP 类型但没有成功,即使我的凭据在 IBM k8s 集群中具有管理员权限。
猜你喜欢
  • 2020-06-22
  • 2020-02-27
  • 2018-07-13
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2019-02-08
  • 2022-10-24
  • 1970-01-01
相关资源
最近更新 更多