背景

    之前写过<<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. CodeForces 55D Beautiful numbers(数位dp+数学)

    题目链接:http://codeforces.com/problemset/problem/55/D 题意:一个美丽数就是可以被它的每一位的数字整除的数. 给定一个区间,求美丽数的个数. 显然这是一道 ...

  2. 模板汇总——AC自动机

    AC自动机 模板题 HDU-2222 Keywords Search #include<bits/stdc++.h> using namespace std; #define LL lon ...

  3. window对象,BOM,window事件,延时器,DOM

    01.定时器补充 function fn(){    console.log(1);}setInterval("fn()",100);  //定时器调用匿名函数/*   funct ...

  4. 文档打印 js print调用打印dom内容

    1.首先按目前研究 print可以打印dom 2.被设置overflow:hidden 的模块,打印时会被截掉. 3.被设置成 display:none 的dom 打印不会有样式 边框等. 4.如果需 ...

  5. Python 单元测试框架系列:聊聊 Python 的单元测试框架(一):unittest

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  6. WordCount2.2

    说明: 合作者:201631062507  201631062526(学号) 代码地址:https://gitee.com/WordCountMC/WordCountTeam 本次作业链接:https ...

  7. Python二元操作符

    def quiz_message(grade): outcome = 'failed' if grade<50 else 'passid' print ('grade', grade, 'out ...

  8. 干货 干货 2019阿里巴巴Android40道基本面试题

    找工作还是需要大家不要经常,有我们干这一行的接触人本来就不多 难免看到面试官会紧张,主要是因为怕面试官问的问题到不上来,那时候不要着急 ,答不上了的千万不然胡扯一些,直接就给面试官说这块我还没接触到, ...

  9. 动态设置 view 在布局中位置

    一.概述 有时项目需要动态设置一个 底部列表,比如 popupwindow ,listview 底部显示 ,所以记录一下 此处, android.support.v7.widget.CardView ...

  10. Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

    结果: 12,-11 原因: Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11.四舍五入的原理是在参数上加0.5然后进行下取整.