【问题标题】:How to deploy to a (local) Kubernetes cluster using Jenkins如何使用 Jenkins 部署到(本地)Kubernetes 集群
【发布时间】:2019-11-25 15:13:21
【问题描述】:

这个问题与my previous questions 中的一个有点相关,因为它更清楚地说明了我想要实现的目标。这个问题是关于我在尝试完成上一个问题中的任务时遇到的一个问题。 ..

我正在尝试测试我的 kubectl 是否在 Jenkins 容器中工作。当我启动我的 Jenkins 容器时,我使用以下命令:

docker run \ 
    -v /home/student/Desktop/jenkins_home:/var/jenkins_home \
    -v $(which kubectl):/usr/local/bin/kubectl \ #bind docker host binary to docker container binary
    -v ~/.kube:/home/jenkins/.kube \ #docker host kube config file stored in /.kube directory. Binding this to $HOME/.kube in the docker container
    -v /var/run/docker.sock:/var/run/docker.sock \ 
    -v $(which docker):/usr/bin/docker -v ~/.kube:/home/root/.kube \ 
    --group-add 998 
    -p 8080:8080 -p 50000:50000 
    -d --name jenkins jenkins/jenkins:lts

容器启动,我可以登录/创建作业/运行管道脚本都没有问题。

我创建了一个管道脚本只是为了检查我是否可以像这样访问我的集群:

pipeline {
    agent any
    stages {
        stage('Kubernetes test') {
            steps {
                sh "kubectl cluster-info"
            }
        }
    }
}

运行此作业时,它失败并出现以下错误:

+ kubectl cluster-info // this is the step

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
error: the server doesn't have a resource type "services"

谢谢!

【问题讨论】:

    标签: jenkins kubernetes continuous-deployment


    【解决方案1】:

    我不明白为什么会有:

    -v $(which kubectl):/usr/local/bin/kubectl -v ~/.kube:/home/jenkins/.kube

    /usr/local/bin/kubectl 是一个 kubectl 二进制文件,~/.kube:/home/jenkins/.kube 应该是 kubectl 二进制文件查找集群上下文文件的位置,即kubeconfig。首先,您应该确保kubeconfig 已安装到/home/jenkins/.kube 的容器,并且kubectl 二进制文件可以访问。安装适当的卷后,您可以通过在 jenkins 容器中使用 docker container exec -it jenkins /bin/bash 创建会话并使用 kubectl get svc 进行测试来进行验证。确保您在会话中设置了KUBECONFIG env var:

    export KUBECONFIG=/home/jenkins/.kube/kubeconfig
    

    在运行验证测试之前

    withEnv(["KUBECONFIG=$HOME/.kube/kubeconfig"]) {
    // Your stuff here
    }
    

    在您的管道代码中。如果它与会话一起工作,它也应该在管道中工作。

    我个人建议为 Jenkins 创建一个自定义 Docker 映像,其中将包含 kubectl 二进制文件和其他必要的实用程序(例如 aws-iam-authenticator 用于基于 AWS EKS IAM 的身份验证)以使用 Kubernetes 集群。这会在您的主机系统二进制文件和 Jenkins 二进制文件之间创建隔离。

    下面是我正在使用的Dockerfile,其中包含helmkubectlaws-iam-authenticator

    # This Dockerfile contains Helm, Docker client-only, aws-iam-authenticator, kubectl with Jenkins LTS.
    
    FROM jenkins/jenkins:lts
    USER root
    
    ENV VERSION v2.9.1
    ENV FILENAME helm-${VERSION}-linux-amd64.tar.gz
    ENV HELM_URL https://storage.googleapis.com/kubernetes-helm/${FILENAME}
    ENV KUBE_LATEST_VERSION="v1.11.0"
    
    # Install the latest Docker CE binaries
    RUN apt-get update && \
        apt-get -y install apt-transport-https \
          ca-certificates \
          curl \
          gnupg2 \
          software-properties-common && \
        curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
        add-apt-repository \
          "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
          $(lsb_release -cs) \
          stable" && \
       apt-get update && \
       apt-get -y install docker-ce \
       && curl -o /tmp/$FILENAME ${HELM_URL} \
       && tar -zxvf /tmp/${FILENAME} -C /tmp \
       && mv /tmp/linux-amd64/helm /bin/helm \
       && rm -rf /tmp/linux-amd64/helm \
       && curl -L https://storage.googleapis.com/kubernetes-release/release/${KUBE_LATEST_VERSION}/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl \
       && chmod +x /usr/local/bin/kubectl \
       && curl -L https://amazon-eks.s3-us-west-2.amazonaws.com/1.11.5/2018-12-06/bin/linux/amd64/aws-iam-authenticator -o /usr/local/bin/aws-iam-authenticator \
       && chmod +x /usr/local/bin/aws-iam-authenticator
    

    【讨论】:

    • 嗨..我编辑了我的问题以添加解释请求行的 cmets.. 请检查。基本上,我试图使 Jenkins 容器可以使用 docker 主机的 kubectl 二进制文件,并将 docker 主机的 KUBECONFIG 目录绑定到 Jenkins 容器。另外,非常感谢您的自定义 Jenkins Dockerfile。 . 我试着自己做一个,但没有用.. 你的 Dockerifle 帮我找到了其中的错误 :)
    • 使用上面的Dockerfile 来构建一个预先安装了kubectl 的自定义映像,或者在容器内创建一个会话并测试kubectl,如答案中所述。如果它与会话一起工作,它应该在管道中工作。
    • 非常感谢。我现在试试看。。如何将docker主机中的conf文件传输到Jenkins容器中?
    • 使用卷 ` -v "/home//.kube:/root/.kube"`
    【解决方案2】:

    Kubernetes fails inside jenkins pipeline 这是我在 windows 机器上本地安装 jenkins 的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2020-05-28
      • 2019-01-12
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      相关资源
      最近更新 更多