如何使用Jenkins部署到(本地)Kubernetes集群

时间:2019-07-16 20:11:39

标签: jenkins kubernetes continuous-deployment

这个问题与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"

谢谢!

2 个答案:

答案 0 :(得分:2)

我不明白为什么会这样:

-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二进制文件可以访问。在适当的卷装入之后,您可以通过使用docker container exec -it jenkins /bin/bash在jenkins容器中创建一个会话来进行验证,并使用kubectl get svc进行测试。确保您在会话中设置了KUBECONFIG环境变量,

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

在运行验证测试之前,

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

在您的管道代码中。如果可以与会话配合使用,那么它也应该可以在管道中使用。

我个人建议为Jenkins创建一个自定义Docker映像,其中包含kubectl二进制文件和其他与Kubernetes集群一起使用所必需的实用程序(例如,基于AWS EKS IAM身份验证的aws-iam-authenticator)。这将在主机系统二进制文件和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

答案 1 :(得分:0)

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