swarm笨笨 2019-07-01
本文只是一种实际部署方案的例子,涉及到的技术有(除Docker/Docker Swarm外):
步骤大纲:
部署Docker machine
部署Docker swarm集群
部署Prometheus stack
部署应用
准备若干Linux服务器(本例使用Ubuntu 16.04),参照Docker CE 镜像源站提到的步骤安装Docker CE。
参照Docker Daemon生产环境配置。
参照Docker Daemon生产环境配置中的mtu和子网章节。
参考使用Fluentd收集Docker容器日志。
到一台机器上执行docker swarm init
,这个机器将作为manager node。
执行docker node ls
会看到类似下面的结果:
$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS dxn1zf6l61qsb1josjja83ngz * manager1 Ready Active Leader
如果你计划不会把工作负载跑在manager node上,那么使用docker drain
:
docker node update --availability drain <node-id>
可参考Docker Swarm基本命令清单。
参考Docker Overlay网络的MTU。
特别注意
观察docker_gwbridge
和ingress
的子网是否与已有网络冲突:
$ docker network inspect -f '{{json .IPAM}}' docker_gwbridge {"Driver":"default","Options":null,"Config":[{"Subnet":"172.18.0.0/16","Gateway":"172.18.0.1"}]} $ docker network inspect -f '{{json .IPAM}}' ingress {"Driver":"default","Options":null,"Config":[{"Subnet":"10.255.0.0/16","Gateway":"10.255.0.1"}]}
如果有冲突则参考Docker Overlay网络的MTU中的方法修改子网。
参考Docker Swarm基本命令清单。
使用的是vegasbrianc的Prometheus监控方案。
整个监控方案包含一下几个组件:
挑选一台Node作为运行监控服务的机器。给这个node打上label:
$ docker node update --label-add for-monitor-stack=1 <node-id>
$ docker network create -d overlay --attachable monitor-net
参考参考Docker Overlay网络的MTU检查子网与MTU是否配置正确。
clone vegasbrianc的Prometheus监控方案 项目代码。
使用我修改过的docker-stack.yml
启动service:
$ docker stack deploy \ --with-registry-auth \ --prune \ -c docker-stack.yml \ p8s-monitor-stack
访问地址:
http://<任意swarm node ip>:9000
http://<任意swarm node ip>:9010
http://<任意swarm node ip>:9020
http://<任意swarm node ip>:9030
http://<任意swarm node ip>:9040
,用户名admin,密码foobar如果你的应用由多个组件(service)组成,那么在部署它们之前你得识别出哪些是stateless service哪些是stateful service。
针对每个service你自问以下三个问题:
如果上述回答都是Yes,那么这个service就是stateless的,只要有一个是No,则这个service是stateful的。
对于stateless service,你可以:
docker stack deploy
部署docker service create
部署对于stateful service,你可以:
docker run
部署docker-compose up
部署docker stack deploy
/docker service create
部署,前提是你得保证这个service只会固定在一台机器上运行。有时候你的应用既有stateless service又有stateful service,这时需要把他们挂载到同一个overlay网络里,这样它们之间就能够互相通信了。
创建app-net
(你也可以改成自己的名字)
$ docker network create -d overlay --attachable app-net
参考Docker Overlay网络的MTU检查子网与MTU是否配置正确。
如果你对于Service部署在哪个Node上有要求,那么你得给Node打上Label:
$ docker node update --label-add <your-label>=1 <node-id>
然后在docker-compose.yaml
里添加约束条件:
version: "3.7" services: busybox: image: busybox deploy: placement: constraints: - node.labels.<your-label> == 1
对于stateless service,编写docker-compose.yaml
,里面写了同时挂载app-net
和monitor-net
,比如:
version: "3.7" services: busybox: image: busybox networks: app-net: monitor-net: aliases: - busybox ... networks: app-net: external: true monitor-net: external: true
注意上面设置了busybox service在monitor-net中的别名,这是因为如果你用docker stack deploy
部署,那么busybox的名字默认是<stack-name>_busybox
,这样对于prometheus而言此名字不稳定,不便于配置详见Prometehus监控Docker Swarm Overlay网络中的容器。
然后用docker stack deploy
部署:
$ docker stack deploy \ --with-registry-auth \ --prune \ -c docker-compose.yaml <stack-name>
如果用docker service create
则:
$ docker service create \ --network app-net \ --network monitor-net \ --name <name> \ ... 其他参数 <image>
下面举例docker run
启动stateful service的方法:
$ docker run -d \ --name <name> \ --network app-net \ ... 其他参数 \ <image> # 然后再挂载到monitor-net上 $ docker network connect monitor-net <name>