内容简介:本文只是一种实际部署方案的例子,涉及到的技术有(除Docker/Docker Swarm外):步骤大纲:
大纲
本文只是一种实际部署方案的例子,涉及到的技术有(除Docker/Docker Swarm外):
- Docker overlay network
- Fluentd
- Prometheus stack
- vegasbrianc的Prometheus监控方案
步骤大纲:
-
部署Docker machine
- 基本配置
- 配置网络
- 启动Fluentd日志服务
-
部署Docker swarm集群
- 配置网络
- 添加Node
-
部署Prometheus stack
- 给Node打Label
- 创建监控网络
- 启动service
-
部署应用
- 识别stateless与stateful
- 创建应用网络
- 给Node打Label
- 启动service
1 部署Docker machine
1.1 基本配置
准备若干 Linux 服务器(本例使用Ubuntu 16.04),参照 Docker CE 镜像源站 提到的步骤安装Docker CE。
参照 Docker Daemon生产环境配置 。
1.2 配置bridge网络
参照 Docker Daemon生产环境配置 中的mtu和子网章节。
1.3 启动Fluentd日志服务
参考 使用Fluentd收集 Docker 容器日志 。
2 部署Docker swarm集群
到一台机器上执行 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基本命令清单 。
2.1 配置网络MTU和子网
参考 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 中的方法修改子网。
2.2 添加Node
参考 Docker Swarm基本命令清单 。
3 部署Prometheus stack
使用的是 vegasbrianc的Prometheus监控方案 。
整个监控方案包含一下几个组件:
- Prometheus
- Node-exporter,运行在每个node上
- Alertmanager
- cAdvisor,运行在每个node上
- Grafana
3.1 给Node打Label
挑选一台Node作为运行监控服务的机器。给这个node打上label:
$ docker node update --label-add for-monitor-stack=1 <node-id>
3.2 创建监控网络
$ docker network create -d overlay --attachable monitor-net
参考参考 Docker Overlay网络的MTU 检查子网与MTU是否配置正确。
3.3 启动service
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
4 部署应用
4.1 识别stateless与stateful
如果你的应用由多个组件(service)组成,那么在部署它们之前你得识别出哪些是stateless service哪些是stateful service。
针对每个service你自问以下三个问题:
- 这个service崩溃之后,是不是只需要重启它就可以了,而不需要关心数据恢复?
- 这个service是否可以在node之间任意迁移,且不需要分布式存储?
- 这个service是否无需固定IP?
如果上述回答都是Yes,那么这个service就是stateless的,只要有一个是No,则这个service是stateful的。
对于stateless service,你可以:
docker stack deploy docker service create
对于stateful service,你可以:
-
用
docker run
部署 -
用
docker-compose up
部署 -
如果没有固定IP的要求,那么你也可以用
docker stack deploy
/docker service create
部署,前提是你得保证这个service只会固定在一台机器上运行。
有时候你的应用既有stateless service又有stateful service,这时需要把他们挂载到同一个overlay网络里,这样它们之间就能够互相通信了。
4.2 创建应用网络
创建 app-net
(你也可以改成自己的名字)
$ docker network create -d overlay --attachable app-net
参考 Docker Overlay网络的MTU 检查子网与MTU是否配置正确。
4.3 给Node打Label
如果你对于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
4.4 启动service
对于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>
以上所述就是小编给大家介绍的《Docker Swarm部署应用的总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Fabric kafka多机部署总结
- 【Vue项目总结】项目nginx部署
- 总结—Harbor仓库部署和使用问题集锦
- Spring Boot Tomcat 容器化部署实践与总结
- 每日一博 | Nginx+SSL+Tomcat+CDN 部署总结
- linux 部署golang 项目(直接部署和基于nginx部署)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Imperfect C++中文版
威尔逊 / 荣耀、刘未鹏 / 人民邮电出版社 / 2006-1 / 75.0
汇集实用的C++编程解决方案,C++虽然是一门非凡的语言,但并不完美。Matthew Wilson使用C++十年有余,其间发现C++存在一些固有的限制,需要一些颇具技术性的工作进行弥补。本书不仅指出了C++的缺失,更为你编写健壮、灵活、高效、可维护的代码提供了实用的技术和工具。Wilson向你展示了如何克服C++的复杂性,穿越C++庞大的范式阵列。夺回对代码的控制权,从而获得更理想的结果。一起来看看 《Imperfect C++中文版》 这本书的介绍吧!