swarm集群

容器集群 swarm

容器生态包含三个部分

  • 容器核心知识 架构、镜像、容器、网络、存储
  • 容器平台技术 容器编排引擎、容器管理平台、基于容器的paas
  • 容器支持技术 多主机管理、跨主机网络方案、监控、日志管理

docker Swarm

从主机层面上来讲,docker swarm 管理的是 docker host 集群

集群化
  • 服务器集群由一组网络上相互连接的服务器组成,他们协同工作。集群能够像 单个 系统那样工作,同时提供高可用、负载均衡和并行处理
  • 如果部署应用和服务时选择的是多个独立的服务器而非集群,资源整体利用率很难到达最优。而且,应用使用资源的趋势是波动的,丧失了业务的弹性。当某个服务器宕机时,我必须手动将受影响的应用迁移到其他服务器
docker swarm mode

在docker v1.12中 docker重现实现了容器集群的编排方式。docker swarm 集成到 docker engine 。在此之前,提供集群的功能的 docker swarm 是一个独立的软件,而且依赖外部数据库。

重要概念

swarm

  • swarm运行docker engine 的多个主机组成的集群
  • 从 v1.12开始,集群管理和编排功能已经集成到 docker engine。当 docker engine 初始化了一个swarm 或者加入到一个已经存在的 swarm 时,他就启动了 searm mode
  • 运行searm mode后,docker 增加了编排service的能力
  • docker允许在同一台主机上运行swarm server,同时运行单独的容器

node

  • swarm中的每个docker engine都是一个node 有两种类型的node:managerworker
  • 在manager node上执行部署命令 manager将任务进行拆分分配给一个或多个worker node完成部署
    *manager node 负责执行编排集群管理工作,保持并维护swarm处于期望状态。swarm 上如果有多个manager node ,他们会自己协商一台个manager节点为leader执行编排任务。
  • worker node接受并处理,manager node 派发的任务。默认配置下manager node 同时也是一个worker node,不过可以配置成manager-only node 让其专门负责编排和集群管理工作
  • worker node 会定时向 manager node 报告自己的状态和正在执行的任务的状态,这样manager 就可以维护整个集群的状态

server

  • service 定义了worker node 上要执行的任务。swarm编排任务就是保证service处于期望状态下

例:
1、在swarm中运行一个httpd服务,使用httpd镜像,副本数为3;
2、manager node 负责创建这个service ,分析需要启动3个httpd容器,根据当前各个worker node的状态,然后将任务分配下去,node1 创建两个容器,node2 创建1个容器;
3、运行了一段时间后,node2突然宕机了,manager 监控到node2异常,根据各个worker node 状态,在node3上又启动了一个httpd容器
保证了service 处于期望的三个副本的状态

部署集群

1、创建swarm集群manager节点(初始化)
# docker swarm init --advertise-addr 192.168.1.90
--advertise-addr :指定与其他节点通信的地址

命令执行成功后会输出三部分信息
>swarm创建成功,此node成为manager节点
以worker身份加入此集群需要的命令(可以复制去worker node执行)
以manager身份加入此集群需要的命令

查看此集群内的节点列表
# docker node ls
docker node ls --filter role=manager
--filter 按角色进行过滤

2、在worker节点上运行加入到集群的命令(manager安装时生成)

# docker swarm join \
--token SWMTKN-1-1daezk9u1u8f1ul7xt5reneubhqkaowdmwt8bgw382517r7vn3-be37t5k6wzd9brjykdc7iaigg \
192.168.1.90:2377

Error response from daemon: rpc error: code = 14 desc = grpc: the connection is unavailable
工作节点加入集群时报错 关闭防火墙

再次查看集群的节点列表
# docker node ls

查看以worker加入此集群的命令
# docker swarm join-token worker
查看以manager加入此集群的命令
docker swarm join-token manager

运行service

1、创建名为web_service的服务
# docker service create --name web_server httpd
--name 为服务命名 使用指定镜像

# docker service ls
查看服务列表
列表中的REPLICAS列为服务的副本信息

# docker service ps
查看服务每个副本的状态 服务的镜像名、副本在那个节点上运行、运行状态、错误信息
报错信息 No such image: ubuntu:lates
记得添加国内加速器配置

实现service的伸缩

1、增加web_server服务的副本数 scale up
(依赖以创建的服务)(增加指定数量,并非增加指定数量)
# docker service scale web_server=5

通过docker service ls docker service ps web_server查看详细

让manager node 不运行容器
# docker node update --availability drain swarm1
更新设置 从有效主机里移除 swarm1

# docker node ls
再次查看 AVAILABILITY列swarm1节点已经从Active状态到Drain状态

# docker service ps web_server
再次查看服务的状态 swarm1 节点上的副本已经被shutdown了,并且已经在其他节点生成了副本

2、减少副本数 scale down
# docker service scale web_server=3
# docker service ls
# docker service ps web_server

故障切换 failover

failover 失效备援

swarm 内置了failover策略,swarm会尽力保证我们要求的期望状态

访问容器

将容器公布出去

# docker service rm web_server
删除服务

# docker service create --name web_server --replicas=2 httpd
创建服务并拥有两个副本

# docker service ps web_server
查看服务的信息

# docker ps
在实际运行容器的机器上查看容器

# netstat -antp | grep 80
查看主机监听的端口

# docker exec web_server.2.rt2nabx6qnon874ypzmf5fuuq ifconfig
查看容器的网络信息

# curl 172.17.0.2
访问容器IP地址上的80端口(只能在host上访问容器运行的应用,并未暴露到外部)

# docker service update --publish-add 8080:80 web_server
修改web服务的端口暴露到外部网络

# docker service create --name web_server1 --publish 80:80 --replicas=2 httpd
创建服务时声明服务暴露到外部网络

这样在集群的任何一个节点 访问 publish 映射的端口,都可以访问到服务内容器副本中的应用。

神奇的 routing mesh

swarm的每个节点上都运行着 load balancer 负载均衡器

上述环境下,当我们访问swarm集群的任意节点时,swarm内部的 load balancer 就会将请求转发给web_server其中的一个副本。

这就是 routing mesh 路由网格,所以访问swarm集群的那个节点,即使此节点上没有运行这个服务的副本,最终都可以访问到service

ingress网络

当我们应用 --publish-add 时,swarm 会重新配置service

# docker service ps web_server
查看service内容器的变化

之前的所有副本被shutdown,然后启动了新的副本

# docker exec web_server.2.q9rxkj6q9zk4q6o9uvgx2lu7b ifconfig
再次查看新建容器内部的网络情况
发现相比之前的容器多出一张网卡 10.255.0.7

# docker network ls
# docker network inspect ingress
查看网络的详细信息

观察发现现在的容器副本有两张网卡,eth0为ingress提供,eth1为bridge提供

eth0 连接的是overlay类型的ingress网络,让在不同host上运行的容器可以互相通信

eth1 连接的是bridge类型的docker_gwbridge网络,,让其可以通过host主机访问外网

ingress网络是创建swarm集群,或加入集群时自动创建的overlay网络

通过overlay网络,主机和容器,容器和容器之间可以相互访问;同时 routing mesh 将外部请求路由到不同主机的容器,从而实现了外部网络对service的访问。

service之间的通信

微服务架构的应用由多个service组成。每个service都运行了若干个容器。service之间必然是要通信的。

服务发现

1、将所有service都publish出去,然后通过routing mesh访问。但缺点就是把不应该公布出去的服务也全部公布出去,增加了安全隐患。

如果不采用publish方式,swarm集群就要提供一种满足以下要求的机制
1、让service之间可以简单的方式进行访问
2、当service副本的IP发生改变,不会影响service之间的访问
3、当service副本数发生改变时,不会影响service之间的访问

docker swarm 原生支持服务发现,通过服务发现,service使用者不需要知道service运行在哪,ip多少,几个副本,就能与service通信。

创建overlay网络
要使用服务发现,相互通信的service就要在同一overlay网络下
ingress网络没有提供服务发现的功能,必须手动创建新的overlay网络

# docker network create --driver overlay myapp_net
# docker network ls
# docker network inspect myapp_net
创建一个overlay网络

# docker service create --name my_web --network myapp_net --publish 80:80 --replicas 3 httpd
# docker service create --name util --network myapp_net busybox sleep 10000000
将两个服务运行在指定网络中

# docker service ps util
查看服务的副本运行在那台worker上

# docker exec util.1.r6cur67bppq1us4brhgdpy612 ping -c 4 my_web
尝试ping web服务

ping服务名解析出了一个ip地址,着就是web服务的vip,swarm会对vip的访问负载均衡到每一个副本
对于服务的使用者来说,根本不需要知道my_web副本的ip,也不需要知道my_web的vip,只需要使用service的名字就能访问服务。

Rolling update 滚动更新

滚动更新降低了应用更新的风险,如果某个副本更新失败,整个更新将暂停,其他副本则可以继续提供服务。同时在更新的过程中一直有副本在运行的,因此也保证了业务的连续性。

创建一个服务
# docker service create --name my_web --replicas 3 --network myapp_net --publish 80:80 httpd:2.2.31
# docker service ps my_web
创建一个特定版本的web服务

# docker service update --image httpd:2.2.32 my_web
# docker service ps my_web
将服务的容器副本更新为另一个版本
默认配置下每次只更新一个副本,且副本之间没有等待时间

# docker service update --replicas 6 --update-parallelism 2 --update-delay 1m40s my_web
更新web服务service的设置
将容器拓展为6个副本 每次滚动升级时2个一组,每100秒升级一组
--update-parallelism 设置并行更新的副本数
--update-delay 设置滚动更新的间隔时间

# docker service inspect --pretty my_web
检查web服务service的设置

# docker service ps my_web
查看服务的状态,容器副本数量的变化

# docker service update --image httpd:2.4.16 my_web
# docker service ps my_web
将web服务容器副本滚动升级到2.4

# docker service update --rollback my_web
--rollback 回滚升级
--rollback 只能回滚到上次update的状态,不能无限制的回滚
# docker service ps my_web | grep Run

global mode

searm可以在service创建或运行过程中通过--replicas灵活的增加减少副本数,内部调度器会根据当前集群的资源使用情况在不同的node上启停容器,这就是service默认的replicas mode
service还提供了一个global mode,其作用是强制在每个worker节点上运行一个且最多一个副本,即使之后有新的node加入,swarm也会在新的节点上启动一个副本。

docker service create --mode global --name logspout \
--mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock  \
gliderlabs/logspout

创建一个service,在每个node节点上运行一个副本

# docker service inspect logspout --pretty
查看service的设置 Service Mode:global

Label

精细控制service的运行的位置
1、为每个node定义label
2、设置service运行在指定的node上
label可以灵活的描述node的属性,用户可以任意指定

# docker node update --label-add env=test worker1
给node打标签
# docker node inspect worker1 --pretty
查看节点配置 查看标签信息

# docker node update --label-add env=prod swarm1
# docker node update --label-add env=prod worker2
打标签

# docker service create --constraint node.labels.env==test --replicas 3 --name my_web_test --publish 8080:80 httpd
指定在test标签上的节点运行服务

# docker service ps my_web_test
查看副本运行的节点
# docker service inspect my_web_test --pretty
查看服务约束的设置 --constraint 的设置

# docker service update --constraint-rm node.labels.env==test my_web_test
# docker service update --constraint-add node.labels.env==prod my_web_test
将服务从test环境迁移到prod环境下

Health Check

健康检查
docker 只能容器启动进程的返回代码判断其运行状态,对于容器内部应用的运行状态没有了解。
执行run命令时,通常根据dockerfile的CMD或ENTRYPOINT启动一个进程,这个进程的状态就是docker ps 显示的状态。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容