在我的OS主机上,我使用Docker (18.06.1-ce-mac73 (26764))启用Kubernetes,并使用Kubernetes编排。在此主机上,我可以运行堆栈部署,使用这个简单的docker文件(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返回:
此节点不是群集管理器。使用“停靠群集”或“停靠群连接”将此节点连接起来,然后再试一次。
我不希望Jenkins容器中的docker客户端被初始化为一个集群,因为我没有在主机上使用Docker群集。
Jenkins容器是在docker -组合中定义的,以包含一个卷装入到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向坞主机请求代理。
最后,我使用以下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容器向码头主机发送电话,这样我就知道它是可以到达的。此外,正如我前面提到的,我知道消息是说运行saying,但我并不是部署到swarm。
我在Jenkins容器中检查了docker客户端的版本,它与我在主机上使用的版本相同(不过,Linux变体):
Docker版本18.06.1-ce,构建d72f525745
下面是我描述的代码:https://github.com/ewilansky/localstackdeploy.git
请告诉我是否有可能从詹金斯集装箱里做我希望做的事情。所有这些的目的是提供一个简单的、可移植的管道演示,部署到Kubernetes是最后一步。据我所知,这不是在地方发展环境以外的任何地方都会采取的办法。
发布于 2018-10-25 15:10:57
在Jenkins Docker插件或Kubernetes Docker Stack部署命令能够支持我描述的远程部署场景之前,这里的方法对我很好。
我现在正在使用Jenkins容器中的Kubernetes客户端kubectl。为了最小化Jenkins容器的大小增加,我只将Kubernetes客户端添加到构建在Alpine上的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,而不是得到包,它几乎是我测试中图像大小的两倍。当然,Kubernetes包有所有Kubernetes组件,但我所需要的只是Kubernetes客户端。这类似于这样的要求,即码头客户端必须驻留在Jenkins容器中,以便在主机上运行docker命令。
请注意,在DockerFile中有对Kuberenetes文件的引用:
kube-config /root/.kube/config我从主机上的Kubernetes配置文件(运行Mac的Docker计算机)开始。我相信,如果您在Docker中启用Kubernetes,Kubernetes客户端配置将出现在~/..kube/config。如果没有,分别安装Kubernetes客户端工具。在您将通过DockerFile复制到Jenkins容器的Kubernetes配置文件中,只需更改服务器值,以便Jenkins容器指向DockerFile主机:
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为我的应用程序创建一个部署和服务,该应用程序现在运行在用于Mac主机的Kubernetes Docker中。在我的例子中,下面是我添加到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堆栈部署要复杂一些,但最终结果是相同的。
https://stackoverflow.com/questions/52920540
复制相似问题