Docker Swarm
1.简介
Docker Swarm包含2个核心组件:安全集群/编排引擎
企业级安全集群 | 编排引擎 | |
---|---|---|
使用 | 1.1/多个docker节点连接,用户以集群方式管理 | 1.将应用定义在声明式配置文件中使用原生docker命令完成微服务应用部署等操作 |
内置 | 2.内置分布式集群存储/加密网络/公用TLS/接入令牌/数字证书管理PKI | 2.提供一套丰富的API部署和管理 |
单位 | 节点(管理节点/工作节点) | 服务(在API中是一个对象元素,基于容器封装了高级特性),当容器封装在服务中时被称为一个任务/副本 |
此外,docker swarm已经从基于引擎之上的独立产品转变成集成于docker引擎中的产品
2.详解
实例地址:
2.1 Docker Swarm初步介绍
-
组成:一个Swarm可以由1个或多个节点组成,这些节点可以是虚拟机/物理服务器/树莓派/云实例
-
依赖:节点之间需要有可靠网络保证其运行
Swarm架构中最主要的处理部分是Swarm节点,Swarm管理的对象是Docker Cluster,Docker Cluster由多个Docker Node组成,负责给Swarm发送请求的是Docker Client
2.2 Swarm 集群搭建
0. 搭建前提
需要在路由器和防火墙中开放以下端口
- 2377/tcp:用于客户端于Swarm进行安全通信
- 7946/tcp与7946/udp:用于控制面gossip分发
- 4789/udp:用于基于VXLAN的覆盖网络
1. 初始化管理节点
单引擎模式节点:不包含在任何Swarm中的docker节点
Swarm模式:已经加入集群的docker节点
-
切换命令:docker swarm init:将单引擎模式节点切换为swarm模式,创建新的Swarm,将自身设置为第一个管理节点
-
切换实例
docker swarm init \ --advertise-addr 10.0.0.1:2377 \ --listen-addr 10.0.0.1:2377
–advertise-addr:指定其他节点用来连接当前管理节点的IP和端口
–listen-addr:指定用于承载Swarm流量的IP和端口,一般与前者一致
2377为默认端口
docker node ls //列出Swarm中的节点
2.加入额外的管理节点
-
在当前管理节点获取添加新节点的Swarm命令和Token(一个节点会成为管理还是工作完全取决于使用什么token)
docker swarm join-token manager
-
在未加入的主机上输入命令将节点添加至集群
docker swarm join\ --token <token str> \ 10.0.0.1:2377 \ #分配token的管理节点的ip和端口 --advertise-addr 10.0.0.2:2377 \ --listen-addr 10.0.0.2:2377
-
在任意一个管理节点使用docker node ls命令查看Swarm节点
在输出的信息中,会出现所有节点的信息,其中: 1.当前执行命令的主机ID后使用*标识 2.manager status列:非管理节点为空,管理节点分为主管理(Leader),从管理(reachable)
3.加入工作节点
-
在当前管理节点获取添加新节点的Swarm命令和Token
docker swarm join-token worker
此时会输出分配的Token和添加节点的命令
-
在未加入的主机上输入命令将节点添加至集群
docker swarm join\ --token <token str> \ 10.0.0.1:2377 \ #管理节点的ip和端口 --advertise-addr 10.0.0.2:2377 \ --listen-addr 10.0.0.2:2377
后两个参数是自选的,但是每次清晰的指定自己的IP总是好的
-
在任意一个管理节点使用docker node ls命令查看Swarm节点
4.Swarm管理器的高可用性(HA)
-
如上图所示,1.远程客户端发送命令 2.非主节点将命令转发给主节点 3.主节点对集群执行命令。
-
Swarm实现了一种主从方式的多管理节点的HA,这意味着多个管理节点中只有唯一leader处于活动状态,负责任务分发及变更配置,如果备用管理节点收到命令,会转发给主节点。
-
基于共识算法的管理节点HA支持策略:
-
**部署奇数个管理节点:**当网络需要分区时,不会出现每个分区拥有相同数目的节点的情况,可以使掌握多个管理节点的分区继续对集群进行管理。管理节点在接到命令后只有确定本方网络拥有大多数才会执行。
-
**部署3/5个管理节点:**更多的参与节点意味着需要花费更多的时间来达成共识
-
5.Swarm内置安全机制
5.1 锁定Swarm
-
为什么:旧的管理节点重启后接入集群网络会得到Raft数据库(支持共识算法的)长时间的访问权,如果进行备份恢复还可能抹除集群中较新的节点配置,所以要加个验证机制证明操作者的权限,禁止非法接入
-
怎么做:
1.新建集群时:docker swarm init --autolock=true 2.更新集群配置:docker swarm update --durolock=true 3.以上操作会给出一个登录凭证(key) #以一个管理节点的重启为例: service docker restart docker node ls #此时显示这个节点未接入集群 docker swarm unlock #使用这个命令解锁,输入保存的登录凭证
2.3 Swarm服务部署
Swarm中最小的调度单位为服务,把容器进行了封装,仍能够提供常规的比如端口映射等服务,同时还增加了额外的特性,比如声明服务需要几个副本,docker会自动在Swarm中的节点上进行相对均衡的部署
1.创建新服务
docker service create --name web-fe \
-p 8080:8080 \ 入站模式端口映射
-publish published=80,target=80,mode=host\ 主机模式端口映射
--replicas 5 \
nigepoluation/plur-docker-client #服务要使用的镜像,来自于应用容器化得到的image
--name:容器的名字
--replicas:告知docker需要几个此服务的副本同时运行
最后一行告诉docker服务需要拉取使用哪个镜像
启动后Swarm中会实例化5个副本,分配到任务的节点将拉取指定的镜像,以此为例,并会运行一个开放8080端口的容器。Swarm会不断监视5个副本的状态,如果出现某个副本宕机的状况,docker将会立刻实例化一个其他的副本以保持状态,这一特性十分强大,使服务具有了一定的自愈能力
-p 8080:8080会建立Swarm集群范围内的网络流量映射。到达Swarm任何节点的8080端口的流量都会映射到任何服务副本的内部8080端口
此处有两个模式可选:
- 入站模式(Ingress Mode):在集群中所有节点开放端口,所有节点都配置有映射,没有副本的节点接到请求会转发给有副本的节点处理
- 主机模式(host Mode):仅在有副本的主机上开放端口
2.查看服务及副本列表以及副本状态
#查看服务
docker service ls
#查看副本及状态
docker service ps <service-name>
#查看服务详细信息
docker inspect --pretty <service-name>
3.副本模式or全局模式
-
副本模式:部署时均匀的将副本分配在整个集群中
-
全局模式:每个节点仅部署一个副本
docker service create --mode global
4.服务的扩容与删除
#扩容
docker service scale <service-name>=number
#删除
docker service rm <service-name>
5.滚动升级
当服务拥有多个副本时,手动更新每个副本所依赖的镜像是十分繁琐的,Swarm为我们提供了滚动升级特性
1.创建服务
同上,主要看一下端口映射的知识
2.滚动升级
需要进行业务升级,已升级的业务代码以及容器化,因此服务的容器副本需要替换掉目前所依赖运行的镜像
docker service update \
--image image:v2
--update-parallelism 2\
--update-delay 20s <service-name>
- –image:需要替换的镜像
- –update-parallelism:每次滚动替换的更新的副本数
- –update-delay :每次替换的间隔
- 所升级服务的名称
2.4 故障排除
docker service logs
--follow:跟踪
--tail:只查看最近的日志
--details:查看细节
3.命令
命令 | 用途 |
---|---|
docker swarm init | 初始化集群 |
docker swarm join-token <manager/worker> | 申请加入所需的命令和token |
docker node ls | 列出集群的所有节点 |
docker service create | 创建服务 |
docker service ls | 列出服务 |
docker service ps | 查看服务副本信息 |
docker service inspect | 查看服务详细信息 |
docker service scale | 服务扩容 |
docker service update | 更新服务属性,滚动升级等 |
docker service logs | 查看日志 |
docker service rm | 删除服务 |