【问题标题】:Jenkins on Kubernetes in Helm - how to attach ssh keys to the agentHelm 中 Kubernetes 上的 Jenkins - 如何将 ssh 密钥附加到代理
【发布时间】:2020-04-23 18:16:56
【问题描述】:

我正在使用来自stable/jenkins helm chart 的 Jenkins - 一切都很好我将带有 id_rsa/.pub 密钥的秘密作为卷附加到 jenkins master(在/opt/sshkeys/ 中,为什么会有?因为创建的文件是777权限的软链接所以不能直接去$HOME/.ssh)

root@agent-pod:/opt/config# ls -alh
total 12K
drwxrwxrwx 3 root root 4.0K Apr 20 13:00 .
drwxr-xr-x 1 root root 4.0K Apr 20 13:02 ..
drwxr-xr-x 2 root root 4.0K Apr 20 13:00 ..2020_04_20_13_00_29.601158101
lrwxrwxrwx 1 root root   31 Apr 20 13:00 ..data -> ..2020_04_20_13_00_29.601158101
lrwxrwxrwx 1 root root   13 Apr 20 13:00 id_rsa -> ..data/id_rsa

然后运行几个脚本(cp、chmod)将它们作为正确的文件移动到/home/jenkins/.ssh/id_rsa - jenkins 代理的问题是 - 由于 777 原因,我不能简单地附加卷,我不能使用代理上的任何命令作为主要 ENTRYPOINT 命令都是使其成为代理的命令

command:
args: "${computer.jnlpmac} ${computer.name}"
  • 尝试对mkdir /home/jenkins/.ssh && chmod ... && <above args>; 进行任意组合会使pod 进入0/1 Completed 状态而不是1/1 Running

有谁知道如何将两个 priv 和 pub 键放入 jenkins 代理?这是主要问题。我刚才说的都是我的解决方法。

Jenkins 的部分 Kubernetes 插件(在 Kubernetes 上运行 Jenkins 时需要)显示:

Constraints
Multiple containers can be defined in a pod. One of them is automatically created with name
jnlp, and runs the Jenkins JNLP agent service, with args ${computer.jnlpmac} ${computer.name},
and will be the container acting as Jenkins agent.

Other containers must run a long running process, so the container does not exit. If the default 
entrypoint or command just runs something and exit then it should be overridden with something
like cat with ttyEnabled: true.

WARNING If you want to provide your own Docker image for the JNLP slave, you must name the
container jnlp so it overrides the default one. Failing to do so will result in two slaves 
trying to concurrently connect to the master.

PS:我在https://kubernetes.io/docs/concepts/configuration/secret/#use-cases (ctrl+f Use-Case: Pod with ssh keys) 看到了描述如何将密钥附加到 pod 的官方文档,但我在 777 中遇到了上述问题

PS:要查看部署和值文件的外观和测试,您可以安装 helm3 和 helm3 show values stable/jenkins > jenkins.yaml

【问题讨论】:

  • 我认为这个媒体上的tutorial 可以回答你的问题。你能检查一下,如果它解决了你的问题,请告诉我?
  • 我通过创建 nfs 服务器并将其作为卷附加到代理并手动将密钥放在那里解决了这个问题

标签: docker jenkins kubernetes


【解决方案1】:

正如 @potatopotato 在 cmets 中提到的,他通过创建 nfs server 并将其作为卷附加到代理解决了这个问题,并手动将密钥放在那里。


我建议查看这个媒体article,因为它很好地描述了它应该如何完成,本文中提到的所有资源都可以在这个 git repository 中找到

此 git 存储库包含运行演示以进行部署所需的文件

  • 詹金斯大师
  • 具有持久卷的 Jenkins 代理

更准确地检查这部分。

master和agent之间的通信

Jenkins 主服务器和代理可以通过多种方式相互连接。我们将通过 SSH 从 Jenkins 主服务器发起此连接,使用 SSH 凭据来保护连接。 这种方法要求我们将 ssh-slaves 插件安装到我们的 master 上,将 ssh 凭据安装到 master 和 agent 中,并将我们的代理基于 ssh-slave 映像。

此外,Jenkins 主服务器需要通过唯一的静态主机名连接到每个代理,我们通过使用 StatefulSet 部署代理来获得。

代理初始化

Jenkins master 不会连接到基于 ssh 的代理,除非它被配置为这样做。我们可以通过给每个代理 pod 一个负责配置 Jenkins master 的 Init Container 来引导这个配置。当代理启动时,Jenkins master 已经在尝试连接了。

Init Container 需要完成以下操作:

  • 从 master 下载 Jenkins CLI
  • 使用 CLI 检查 master 是否已配置为使用此 代理
  • 如果需要,使用 CLI 将 master 配置为使用此代理

这需要在我们的代理 pod 中进行一些配置:

  • fsGroup 设置为“jenkins”用户组。这是必要的,因为 默认情况下,持久卷以 root 用户身份挂载,使它们 对“jenkins”用户不可用。
  • Init 容器中的环境变量:JENKINS_URL:http Jenkins master JENKINS_LABEL 的地址:我们代理的标签
  • 主容器中的环境变量: JENKINS_SLAVE_SSH_PUBKEY:认证连接的公钥 尝试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2013-02-25
    • 2021-04-22
    • 2019-01-19
    • 1970-01-01
    • 2018-12-09
    相关资源
    最近更新 更多