【问题标题】:Kubernetes cluster pods as Jenkins Build AgentsKubernetes 集群 pod 作为 Jenkins 构建代理
【发布时间】:2020-11-17 23:03:08
【问题描述】:

我已经在我们的 Jenkins 中安装了Kubernetes plugin - 1.23.3,并且能够在 kubernetes pod(动态 Jenkins Slave)上执行 shell 命令。这是使用默认的jnlp & jenkins/jnlp-slave:latest

假设如果我更改下面的“名称”和“Docker Image”部分以使用我们的私有注册表和图像

Manage Jenkins --> Configure System--> Cloud --> Pod Template --> Container Template

Name: sonatype
Docker image:sonatype:4546/ubuntu-16.04

它不使用我们的私有 docker 镜像,甚至不在 pod-containers 上运行 shell 命令。我们的想法是在 Kubernetes 集群 pod 上使用我们自己的 docker 镜像作为动态 Jenkins 构建代理来执行 build + static analysis

如何在 Kubernetes 集群中使用我们的私有 docker 注册镜像并将它们作为 Jenkins slave 执行?我有下面的脚本管道代码。到 K8S 工作节点的第 1 阶段“SCM 代码检查”正在运行,下一个第 2 阶段构建它正在从 template Kubernetes Pod Template 启动 pod 代理。但如果使用docker: not found 失败。似乎试图在 pod 中提取我们的注册表图像。我们的工作节点系统的代码需要安装在动态 Jenkins 从属 pod 中并执行构建和下一个阶段。任何实现的方向都会有所帮助。

node ("kubupods") { 
       stage('Code Compile') { 
          sh 'hostname'
        }
                
      stage('Code Analysis') {    
         sh 'hostname'
    }
    }
    
 

【问题讨论】:

    标签: docker jenkins kubernetes jenkins-kubernetes


    【解决方案1】:

    Jenkins 默认会从 dockerhub 拉取镜像。在您的情况下,图像 sonatype:4546/ubuntu-16.04 。为了让您使用私有注册表,如果您正在管道中构建,您需要提供私有注册表及其凭据。您可以在 UI 上提供它,也可以通过代码来实现。参考here

    之后,您还需要告诉 kubernetes YAML 以及私有注册表。 为此,您可以参考here。这基本上是两个步骤 a) 创建一个 Kubernetes 机密 b) 使用 imagepullsecret 字段告诉您的部署有关秘密。

    确保您将图片称为 <username or registry URL/<image_name>:<tag(maybe $BUILD_NUMBER)>

    =============== 问题添加后编辑 1 =====

    配置插件以使用 Jenkins 安装软件包。

    1. 转到管理 Jenkins

    2. 全局工具配置

    3. Docker -> 填写名称(例如:Docker-latest) 检查自动安装,然后添加安装程序(从这里下载)。

    4. 然后保存

    如果你已经在你的机器上安装了,那么用 Docker 的位置更新 Jenkins 中的 PATH 变量。

    Reference for Jenkins File

    【讨论】:

    • 是的,jenkins 默认是从 dockerhub 拉取镜像的。我们有 sonatype nexus 作为私有注册表。我已经在 J​​enkins GUI 中定义的凭据。但是我没有在我的脚本管道中调用它。我会检查这部分。那么作为 Jenkins 代理启动动态 Kubernetes pod 还需要 yml 文件吗?
    • 虽然我没有将部件 pod 作为 Jenkins 代理,但我相信在 k8s 中将任何东西部署为 pod,你需要一个 YAML,检查这个plugins.jenkins.io/kubernetes-cd
    • 从我们的私有注册中心拉取镜像,kubectl create secret docker-registry regcred --docker-server=https://nexus-server/nexus/ --docker-username=admin --docker-password=password --docker-email=user@company.com 但它显示error: no matches for kind "Secret" in version "v1" docker login 到我们的私有注册中心是成功的。
    • 上面的秘密命令对我有用,如果对你有帮助,请接受答案。
    • 在运行上述命令之前,是否需要在~/.docker/ 下手动创建空的yml 文件?
    【解决方案2】:

    上面 Tarun 的回答假设您正在构建管道中的图像。

    我在我们的管道中做了类似的事情,但是我们在管道之外构建了一个自定义 jnlp-slave 映像(加载了我们为 CI/CD 所需的工具)并在 kubernetes 插件 yaml 中引用它。

    构建自定义 jnlp-slave 映像。 (下面的Dockerfile)

    FROM jenkins/jnlp-slave:latest
    
    # Download/install tools
    
    ENTRYPOINT ["jenkins-slave"]
    

    将自定义 jnlp-slave 映像推送到您的私有注册表

    docker build -t my-private-registry/jnlp-slave:custom .
    docker push my-private-registry/jnlp-slave:custom
    

    定义您的 Jenkinsfile,以便 pod 使用您在上一步中构建的映像。

    pipeline {
        agent {
            kubernetes {
                yaml """
    apiVersion: v1
    kind: Pod
    metadata:
      label:
        jenkins: slave
    spec:
      containers:
      - name: jnlp
        image: my-private-registry/jnlp-slave:custom
    }}}
    
    stages {
      stage("Test") {
        sh("hostname")
      }
    }
    

    我们的注册表不需要身份验证,但如果需要,您需要向 jenkins 提供机密(正如 Tarun 所提到的),以使其在您的注册表中进行身份验证。

    【讨论】:

    • @Mandopalooza,非常感谢您的回答。有了这个https://github.com/jenkinsci/kubernetes-plugin 指令,就可以通过管道配置 K8s Jenkins 插件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2021-04-26
    • 2019-10-19
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多