从Jenkins容器中调用在Docker主机上部署docker堆栈

时间:2018-10-21 22:40:41

标签: docker jenkins kubernetes jenkins-plugins docker-stack

在OS X主机上,我使用启用了Kubernetes的Docker CE(18.06.1-ce-mac73(26764)),并使用Kubernetes编排。在此主机上,我可以运行堆栈部署,以使用以下简单的docker-compose文件(kube-compose.yml)将容器部署到Kubernetes:

version: '3.3'
services:
  web:
    image: dockerdemos/lab-web
    volumes:
      - "./web/static:/static"
    ports:
      - "9999:80"

,此命令行从包含撰写文件的目录运行:

docker stack deploy --compose-file ./kube-compose.yml simple_test

但是,当我尝试从Jenkins容器运行相同的命令时,Jenkins返回:

  

此节点不是群集管理器。使用“ docker swarm init”或“ docker swarm join”将此节点连接到swarm并重试

我不希望对Jenkins容器中的Docker客户端进行初始化,因为我没有在主机上使用Docker swarm。

Jenkins容器在docker-compose中定义,以包括到docker主机套接字端点的卷挂载:

version: '3.3'
services:
  jenkins:
    # contains embedded docker client & blueocean plugin
    image: jenkinsci/blueocean:latest
    user: root
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - ./jenkins_home:/var/jenkins_home
      # run Docker from the host system when the container calls it.
      - /var/run/docker.sock:/var/run/docker.sock
      # root of simple project
      - .:/home/project
    container_name: jenkins

我还按照本指南使用socat https://github.com/docker/for-mac/issues/770和此处Docker-compose: deploying service in multiple hosts将请求代理到Docker主机。

最后,我使用以下Jenkins定义(Jenkinsfile)调用堆栈以在主机上进行部署。 Jenkins已安装了Jenkins泊坞窗插件:

node {
    checkout scm

    stage ('Deploy To Kube') {
        docker.withServer('tcp://docker.for.mac.localhost:1234') {
            sh 'docker stack deploy app --compose-file /home/project/kube-compose.yml'
        }
    }      
}

我还尝试过将withServer签名更改为:

docker.withServer('unix:///var/run/docker.sock')

,我得到相同的错误响应。但是,我能够从Jenkins容器远程登录到Docker主机,因此我知道它是可以到达的。另外,正如我前面提到的,我知道消息说要运行swarm init,但我没有部署到swarm。

我在Jenkins容器中检查了docker客户端的版本,它与我在主机上使用的版本相同(不过是Linux变体):

  

Docker版本18.06.1-ce,内部版本d72f525745

这是我描述的代码:https://github.com/ewilansky/localstackdeploy.git

请让我知道是否可以通过Jenkins容器执行我希望做的事情。所有这些的目的是提供管道的简单,可移植的演示,并部署到Kubernetes是最后一步。我知道这不是在本地开发环境之外的任何地方采用的方法。

1 个答案:

答案 0 :(得分:1)

在Jenkins Docker插件或Kubernetes Docker Stack Deploy命令可以支持我描述的远程部署方案之前,这是一种对我有效的方法。

我现在正在使用来自Jenkins容器的Kubernetes客户端kubectl。为了最大程度地减少Jenkins容器的大小,我只向Kubernetes客户端添加了基于Alpine Linux构建的jenkinsci / blueocean映像。该DockerFile显示了附加内容:

FROM jenkinsci/blueocean
USER root
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin/kubectl
RUN mkdir /root/.kube
COPY kube-config /root/.kube/config

我采用了这种方法,该方法将图像大小增加了约100 mb,而不是使用Alpine Linux Kubernetes软件包,该软件包在我的测试中几乎使图像大小增加了一倍。当然,Kubernetes软件包具有所有Kubernetes组件,但是我所需要的只是Kubernetes客户端。这类似于将Docker客户端驻留在Jenkins容器中以便在主机上运行Docker命令的要求。

在DockerFile中注意对Kuberenetes配置文件的引用:

kube-config /root/.kube/config

我从主机(运行Mac的Docker的计算机)上的Kubernetes配置文件开始。我相信,如果您在Mac的Docker中启用Kubernetes,则Kubernetes客户端配置将出现在〜/ .kube / config中。如果没有,请分别安装Kubernetes客户端工具。在您将通过DockerFile复制到Jenkins容器的Kubernetes配置文件中,只需更改服务器值,以使Jenkins容器指向Docker for Mac主机:

    server: https://docker.for.mac.localhost:6443

如果您使用的是Windows计算机,我认为您可以使用docker.for.win.localhost。这里有一个关于此的讨论:https://github.com/docker/for-mac/issues/2705,还有这里描述的其他方法:https://github.com/docker/for-linux/issues/264

重组Jenkins容器之后,我便能够使用kubectl为我的应用程序创建部署和服务,该应用程序现在在Kubernetes Docker for Mac主机中运行。就我而言,这是我添加到Jenkins文件中的两个命令:

 stage ('Deploy To Kube') {
    sh 'kubectl create -f /kube/deploy/app_set/sb-demo-deployment.yaml'
}
stage('Configure Kube Load Balancer') {
    sh 'kubectl create -f /kube/deploy/app_set/sb-demo-service.yaml'
}

Kubernetes容器部署有很多选项。就我而言,我只需要在负载均衡器后面部署我的Web应用程序(带有副本)。所有这些都在kubectl调用的两个yaml文件中定义。这比docker stack部署要复杂得多,但是可以达到相同的最终结果。