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

如何使用Jenkins部署到(本地)Kubernetes群集,jenkins,kubernetes,continuous-deployment,Jenkins,Kubernetes,Continuous Deployment,这个问题与其中一个有点关联,因为它更清楚地说明了我要实现的目标。。这个问题是关于我在试图完成前一个问题中的任务时遇到的一个问题 我正在尝试测试我的kubectl是否在Jenkins容器中工作。启动Jenkins容器时,我使用以下命令: docker run \ -v /home/student/Desktop/jenkins_home:/var/jenkins_home \ -v $(which kubectl):/usr/local/bin/kubectl \ #bind d

这个问题与其中一个有点关联,因为它更清楚地说明了我要实现的目标。。这个问题是关于我在试图完成前一个问题中的任务时遇到的一个问题

我正在尝试测试我的
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"

谢谢

我不明白为什么会有:

-v$(哪个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
env var,其中包括:

export KUBECONFIG=/home/jenkins/.kube/kubeconfig
在运行验证测试和

withEnv(["KUBECONFIG=$HOME/.kube/kubeconfig"]) {
// Your stuff here
}
在管道代码中。如果它与会话一起工作,那么它也应该在管道中工作

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

下面是我使用的
Dockerfile
文件,其中包含
helm
kubectl
aws iam验证器

# 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

你好我编辑了我的问题,添加了解释所需行的注释。。请查收。基本上,我试图使docker主机的
kubectl
二进制文件可用于Jenkins容器,并将docker主机的
KUBECONFIG
目录绑定到Jenkins容器。。另外,非常感谢您定制的Jenkins Dockerfile。。。我试着自己做一个,但没有成功。。您的Dockerfile帮助我找到了其中的错误:)使用上面的
Dockerfile
使用预安装的
kubectl
构建自定义映像,或者在容器内创建会话,并按照回答中的说明测试
kubectl
。如果它与会话一起工作,它应该在管道中工作。非常感谢。我现在试试看。。如何将docker主机中的conf文件传输到Jenkins容器?使用卷“-v”/home/.kube:/root/.kube”`