在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是最后一步。我知道这不是在本地开发环境之外的任何地方采用的方法。
答案 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部署要复杂得多,但是可以达到相同的最终结果。