背景

    之前写过<<docker-compose真香>> 和《docker-compose、docker stack前世今生》两篇博客, 回顾一下思路:

① docker-compose是docker引擎顶层的容器编排工具(Python实现),需要单独安装; docker stack 是docker引擎原生支持的容器编排技术(Go实现)

② 两者都支持最新docker-compose.yml 版本3容器编排文件,部分指令有差异。

③ docker-compose 能现场Build镜像,更适用于开发、测试时候单机迭代部署;docker stack须预先准备镜像,具备生产环境诸多特性。

昨天docker-compose编排的单机多容器突然崩溃,为提高项目服务可用性评价值(SLA), 决心切换到docker stack生产部署。

Docker Swarm优势

Docker Swarm is native clustering for Docker. It turns a pool of Docker hosts into a single, virtual Docker host.

Docker Swarm是Docker平台原生内置的集群编排技术,它将Docker主机池变成了 单个虚拟主机。

有很多理由促使你采用容器集群解决方案。随着应用程序的增长,将面临新的强制要求:例如可伸缩性,可管理性和高可用性。

Docker Swarm 直接优势:

  1. Native  Clustering

  2. Production Grade

  3. Work out of the box

  4. Easy to setup and use

  5. Active Community

高可用支撑生产业务

  Stack、Service、Container 金字塔模型定义了一个完整的生产应用架构:

  • task是Docker Swarm中最小部署单位,task与容器Container是一对一的关系
  • service是一个或一组容器在生产环境的预期状态(也可说是一组task的集合),在Worker节点上执行;有两种模式(对应下面docker-stack.yml-deploy-mode配置节)

    • (默认)replicated: 指定容器数量
    • global: 每个节点一个容器(容器数量由可用节点决定) 
  • stack 是一组服务,协作支撑整个业务

部署策略

还支持 副本集、滚动更新、更新和回滚策略,以上配置都可以在docker-compose.yml 版本3官方文档找到对应的配置字段:

deploy:
endpoint_mode: 服务发现的方式: vip,dnsrr
 labels: 为服务指定的标签
 mode:replicated (指定数量的容器) global(每个节点一个容器)
 replicas: 实例数量
 resources: 配置资源
 restart_policy: 重启策略
 update_config: 服务更新策略
   parallelism: 同时更新容器数量
   delay: 容器组更新的间隔时间
   failure_action: 更新失败的操作:continue、rollbak,pause(默认)
   monitor: 监视更新失败的等待时间
   max_failure_ratio: 更新的失败容错率
   order:操作策略:stop-first(先停止某容器,再创建新容器)、start-first (先创建新容器,所以会与即将消灭的容器有时间重叠)
rollback_config: 回滚策略
    ...同上...

集群多节点部署

  Docker Swarm在以多主机模型支撑业务,对于开发者/部署者来说, 一个节点或多节点部署的配置流程是类似的。

有两种形式节点: managers,workers

managers节点

  • 维护集群状态

使用Raft协议保持集群内部一致性;

测试目的,可以使用单个manager运行swarm;(单manager fail, 服务继续运行)

  • 调度服务
  • 支撑swarm mode  HTTP endpoints

workers节点

workers节点的唯一目的是执行容器,workers节点不参与Raft distributed state, make scheduling decisions, or serve the swarm mode HTTP API.

可以创建只有一个manager的群集,但是如果没有一个manager节点,则不可能有一个工作节点。

默认情况下,所有manager也是worker。在单个manager节点集群中,您可以运行诸如docker service create之类的命令,而调度程序会将所有任务放在本地引擎上。

Load Balancing

https://docs.docker.com/engine/swarm/key-concepts/#services-and-tasks

ingress load balancing

作用在外部要访问的服务上,一般服务会对外暴露一个port,(如果你没有指定的话,swarm manager会自动给这个服务分配一个PublishedPort )

外部Clients能在集群任一节点的PublishedPort 上访问服务(不论这个节点当前是否有这个服务的running task)。

服务发现(这里自然说的是Docker Stack中某个对外暴露的服务),有两种模式(对应docker-stack.yml: deploy---->endpoint_mode)

  • vip:  Docker Swarm为服务分配1个虚拟ip,服务后有多少节点、服务请求到哪个节点容器对于客户端是透明的。  默认
  • dnsrr: Docker Swarm 为服务建立DNS记录,返回可用容器的ip列表, 客户端直接请求其中一个ip, 这种方式一般用于自建负载均衡器

internal load balancing:

作用在每个服务上,swarm内部有一个DNS组件(自动为每个服务分配dns条目),swarm manager使用依据DNS名称分发请求。

Docker Swarm网络模型

①  overlay network:覆盖物网络,顾名思义是附着在主机底层网络之上的网络, 这个网络保证了不同主机之间容器通信

②  ingress network:进入网络,顾名思义是外部客户端访问服务时,服务节点间负载均衡(节点在开放端口上收到请求,上交给IPVS,选择容器),是一种特殊的overlay网络。

③  docker-gwbridge: 将overlay网络连接到docker宿主机的网络,默认: 服务正在运行的每个容器都连接到其本地Docker守护程序主机的docker_gwbridge网络

在初始化或刚加入Swarm集群时,会创建一个Ingress和 docker-gwbridge网络

单机走向集群部署

本次将<<docker-compose真香>> 3容器改造目标:

  • 三个服务---->nginx----> receiver------>app,服务容器通过名为webnet 的overlay网络通信;

  • nginx开放外部访问端口80和8080,关注ingress网络

  • receiver, app服务需要访问宿主机上搭建的Redis, 关注docker-gwbridge网络

一般两个步骤: ① 搭建集群   ② 发布服务

  搭建Docker Swarm集群

单节点/多节点的初始化方式,可参考 docker swarm  -- help指令; 集群节点的管理可参考 docker  node --help指令

$ docker swarm --help
Usage: docker swarm COMMAND
Manage Swarm Commands:
ca Display and rotate the root CA
init Initialize a swarm
join Join a swarm as a node and/or manager
join-token Manage join tokens, 如果忘记Token,可以执行这个参数
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm

  发布服务

可使用docker service create方式创建服务,我比较喜欢使用docker stack deploy搭配docker-stack.yml文件

下面是生产部署中追加的production.yml,创建了一个名为eqidstack_webnet的overlay网络

version: "3.7"
services:
proxy:
networks:
- webnet
receiver:
deploy:
replicas:
restart_policy:
condition: on-failure
networks:
- webnet
volumes:
- type: bind
source: /home/eqidmanager/receiver.secrets.json
target: /app/appsettings.secrets.json
app:
deploy:
replicas: 2
restart_policy:
condition: on-failure
update_config:
parallelism: 1
delay: 5s
order: stop-first
networks:
- webnet
volumes:
- type: bind
source: /home/eqidmanager/appsettings.secrets.json
target: /app/appsettings.secrets.json
networks:
webnet: 
# docker stack不加载同目录下的.env环境变量文件,原有适用于docker-compose工具的yml文件可采用变通方法
docker stack deploy -c <(docker-compose -f docker-stack.yml -f production.yml config) eqidstack

服务部署效果:

#docker stack ls:
NAME SERVICES ORCHESTRATOR
eqidstack Swarm #docker service ls:

ID        NAME            MODE      REPLICAS   IMAGE                   PORTS (服务对外暴露的端口
jml6ecfa330r eqidstack_app       replicated    2/2      12205599/eqidmanager:master
3381stpkirgj eqidstack_proxy      replicated   1/1      nginx:latest              *:80->80/tcp, *:8080->8080/tcp
vhz4ef8p4ffp eqidstack_receiver   replicated   1/1      12205599/eqidreceiver:master

可通过

docker network inspect ingress 验证容器eqidstack_proxy.1 连接到ingress网络;

docker network inspect eqidstack_webnet 验证有4个容器连接到 overlay网络

不停服更新/不停服扩容

手动更新服务配置:docker service update  [opton]  {some_service_name}

我们来为以上名为{eqidstack_proxy}的服务添加 [重启策略]

手动扩容:docker service scale [option] {service=replicas}

为名为{eqidstack_proxy}的服务扩容为2容器

可通过docker service  inspect eqidstack_proxy验证操作结果

总结

docker service 定义某个(副本集)容器在生产环境下的状态,一般业务含义上的服务相关;

docker stack 定义一组服务,服务间协作、调用,支撑整个业务架构;

docker swarm 管理一组服务在集群节点上的的部署

本文以 重难点解读+实战演练的方式记录Docker Swarm生产部署的过程,希望能和大家查缺补漏,共同探讨。

https://docs.docker.com/compose/compose-file/

https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/#manager-nodes

https://docs.docker.com/engine/swarm/key-concepts/#services-and-tasks

https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/

[docker swarm] 从单容器走向负载均衡部署的更多相关文章

  1. (转) Docker - Docker1.12服务发现,负载均衡和Routing Mesh

    看到一篇介绍 Docker swarm以及如何编排的好文章,挪放到这里,自己学习的同时也分享出来. 原文链接: http://wwwbuild.net/dockerone/414200.html -- ...

  2. Docker系列-(3) Docker-compose使用与负载均衡

    上一篇文章介绍了docker镜像的制作与发布,本文主要介绍实际docker工程部署中经常用到的docker-compose工具,以及docker的网络配置和负载均衡. Docker-compose介绍 ...

  3. IceGrid负载均衡部署 z

    [IceGrid负载均衡部署步骤]1.环境主机1:IP=192.168.0.239,上面部署注册表服务器registry和节点node1,registry和node1运行在同一进程中:主机2:IP=1 ...

  4. linux下nginx负载均衡部署

    nginx负载均衡部署 Nginx("engine x") 是一个高性能的 HTTP 和 反向代理 server,也是一个 IMAP/POP3/SMTP 代理server. Ngi ...

  5. [转]Nginx反向代理和负载均衡部署指南

    Nginx反向代理和负载均衡部署指南   1.        安装 1)         从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最 ...

  6. LVS负载均衡部署

    一.lvs-nat模式 1.1.环境介绍 本实验用三台虚拟机完成,一台虚拟机模拟lvs调度器,两块网卡,一块模拟公网一块模拟私网,公网地址192.168.0.201/24,私网地址192.168.4. ...

  7. Docker容器Nginx负载均衡配置、check及stub模块安装

    Nginx是一款高性能的HTTP和反向代理.负载均衡web服务器.本次在Docker容器中部署三个tomcat,Nginx代理三个tomcat服务(以下称节点)来模拟实现负载均衡效果,配置check模 ...

  8. nginx~为docker容器添加负载均衡

    Nginx作为当前最流行的负载均衡和反向代理服务器,它运行在linux平台,一般的.net网站,为了实现分流与负载,需要在多个应用服务器的IIS上部署,通过一些工具实现代码的同步,然后再nginx上去 ...

  9. Docker+nginx+tomcat7配置简单的负载均衡

    本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/4995513.html 本文介绍在Docker上配置简单的负载均衡,宿主机为Ubuntu 14.04.2 ...

随机推荐

  1. CF - 1131 D Gourmet choice

    题目传送门 先把 = 的人用并查集合并在一起. 然后 < > 的建边, 跑一遍 toposort 之后就好了. 入度为0点的值肯定为1, 然后就是因为这个是按照时间线走过来的,所以一个点的 ...

  2. 【github】论怎么去写一个高大上的ReadMe

    前言 以前我时常觉得,自己写的ReadMe很单调乏味,但后来仔细研究一下后,发现有很多方式可以让ReadMe在简洁的基础上变得好看些,所以在这里和大家分享,如果大家有更好的想法,也非常欢迎在评论区留言 ...

  3. MySQL连接方式小结

    1.   连接方式 1.1  方式1 /usr/local/mysql5./bin/mysql -p 此方法默认采用root@localhost用户登录, 1.2  方式2 /usr/local/my ...

  4. SQL Server2008 inner join多种方式的实践

    这些天的学习,才发现自己对SQL原来是如此的不了解.之前一直以为自己轻松应对各种复杂的SQL查询,但是一旦提到效率上,可能就比较傻眼了,有时候也会埋怨客户的服务器不好使. 至于Inner Join的三 ...

  5. 学习笔记-Unity3d代码实现Windows10加载圈圈的效果

    最近在写一个Unity3d的模仿windows10的桌面的程序,由于Unity3d本身不支持Gif图片,所以突发奇想使用代码来实现接近的. 接下来是代码部分:不一一解析,很简单,看的懂原理就Okly了 ...

  6. java基础day2

    Java标识符命名规则: 标识符由字母,下划线“_”.美元符号$或数字组成/ 不能以数字开头 区分大小写 不能是关键字 “ 见名知意” 约定俗成的规则 类名:首字母大写变量名:除第一个单词外小写,其他 ...

  7. MySQL实现Oracle rank()排序

    一.Oracle写法介绍 MySQL5.7版本没有提供类似Oracle的分析函数,比如开窗函数over(...),oracle开窗函数over(...)使用的话一般是和order.partition ...

  8. 第1次作业:使用Packet Tracer分析HTTP数据包

    个人信息:      •  姓名:李微微       •  班级:计算1811       •  学号:201821121001 一.摘要 本文将会描述使用Packet Tracer工具用到的网络结构 ...

  9. day 12 特殊权限

    1.suid (set uid) 特殊权限 suid优点: 可以让普通用户执行无法执行的命令 方便 suid缺点: 如果rm 为suid, 无论谁执行该命令,都能删除系统的任何 资源 set uid ...

  10. Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例

    在Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们看到了XMLConfigBuilder(xml配置解析器)的实例化.而且这个实例化过程在文章:Mybatis源码解析,一步一步从浅 ...