首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Jenkins容器中调用在码头主机上部署的docker堆栈

从Jenkins容器中调用在码头主机上部署的docker堆栈
EN

Stack Overflow用户
提问于 2018-10-21 22:40:40
回答 1查看 1.4K关注 0票数 1

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

代码语言:javascript
复制
version: '3.3'
services:
  web:
    image: dockerdemos/lab-web
    volumes:
      - "./web/static:/static"
    ports:
      - "9999:80"

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

代码语言:javascript
复制
docker stack deploy --compose-file ./kube-compose.yml simple_test

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

此节点不是群集管理器。使用“停靠群集”或“停靠群连接”将此节点连接起来,然后再试一次。

我不希望Jenkins容器中的docker客户端被初始化为一个集群,因为我没有在主机上使用Docker群集。

Jenkins容器是在docker -组合中定义的,以包含一个卷装入到docker主机套接字端点:

代码语言:javascript
复制
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对接插件:

代码语言:javascript
复制
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签名更改为:

代码语言:javascript
复制
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是最后一步。据我所知,这不是在地方发展环境以外的任何地方都会采取的办法。

EN

回答 1

Stack Overflow用户

发布于 2018-10-25 15:10:57

在Jenkins Docker插件或Kubernetes Docker Stack部署命令能够支持我描述的远程部署场景之前,这里的方法对我很好。

我现在正在使用Jenkins容器中的Kubernetes客户端kubectl。为了最小化Jenkins容器的大小增加,我只将Kubernetes客户端添加到构建在Alpine上的jenkinsci/blueocean映像中。这个DockerFile显示了添加:

代码语言:javascript
复制
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文件的引用:

代码语言:javascript
复制
kube-config /root/.kube/config

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

代码语言:javascript
复制
    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文件中的两个命令:

代码语言:javascript
复制
 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堆栈部署要复杂一些,但最终结果是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52920540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档