【docker详解14】-Docker Swarm容器集群编排

目录

一、Docker Swarm介绍

二、集群环境搭建

2.1、实验环境

2.2、安装基础运行环境

2.3、建立swarm集群

2.4、swarm集群管理

(1)、重新生成集群token

(2)、节点权限降级

(3)、节点权限升级

(4)、删除一个集群节点

(5)、其他常用命令

2.5、集群管理常见报错

三、集群高可用演示

3.1、Docker Swarm高可用性介绍

3.2、高可用切换演示

四、通过docker service管理服务

4.1、docker service命令详解

4.2、使用docker service管理服务演示

(1)、创建服务

(2)、扩容或缩容服务


一、Docker Swarm介绍

        官网介绍:Swarm mode overview | Docker Documentation

        docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

        从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。

docker swarm架构图:

    【docker详解14】-Docker Swarm容器集群编排_第1张图片   

docker swarm和k8s本质都是容器编排和管理,两者的对比如下:

        swarm:​内嵌在容器引擎内部,是容器引擎的一部分,与容器深度绑定,swarm偏重的是容器的部署,侧重于容器技术的扩展。

        ​k8s:​独立于docker,与docker是分离的,并完全不依赖于底层的docker,它侧重于​业务应用​的集群部署。k8s对容器的所有操作都渗透着为​应用而服务​的理念。以服务为中心,docker仅仅是其底层技术支撑的一种技术。

swarm与kubernetes对比
Swarm Kubernetes
设计初衷 跨宿主机集群的容器管理 支持分布式、服务化的应用架构
产品理念完善史 2年 15年
GitHub Star 4098+ 18200+
社区主力 Docker Google、Redhat、CoreOS、华为、浙大SEL
核心功能 管理节点、调度任务、服务发现、Rolling update、容器HA、通讯安全 资源调度、服务发现、服务编排、资源逻辑隔离、服务自愈、安全配置管理、Job任务支持、自动回滚、内部域名服务、健康检查、有状态支持、运行监控/日志、扩容缩容、负载均衡、灰度升级、容灾恢复、应用HA
服务发现的实现 通过Consul实现 内置
模型抽象 Pod、Service、Lable、RC、Node
典型案例 SA Home Loans(Docker Datacenter内置) Bugsnag、新浪微博 Pearson、Box、eBay、Yahoo、SAP、OpenAI、wepay、Samsung、The New York Times、华为、中国移动、网易、新浪SAE
优劣势

优势:Docker原厂维护,Swarm API兼容docker API,学习成本低,架构简单,部署运维成本较低,使用简单;

劣势:无法提供集群的更加精细化的管理,网络性能非官方测试只有主机网络性能的70%;如果容器或者容器主机崩溃,swarm没有机制来保证容器的运行;无法满足复杂的调度场景;

优势:容器的高可用性,集群的精细化管理,容器管理可靠性高,可以监控并维持容器的生命,默认使用Flannel和overlay网络,支持复杂的网络场景和容器调度场景;

劣势:学习成本高,部署运维成本高,非Docker原厂维护(Google主力维护);

                如果是小型项目,并且容器管理场景不会很复杂,可以考虑使用docker swarm,单机的话compose就能满足,如果是大型或者复杂使用场景,就需要使用kubernetes,总的来说,kubernetes才是最终归宿。

二、集群环境搭建

2.1、实验环境

主机环境
操作系统 主机名 ip地址 功能
centos7.5  x86_64 node1 192.168.1.50 管理节点,manager node
centos7.5  x86_64 node2 192.168.1.51 工作节点,worker node
centos7.5  x86_64 node3 192.168.1.52 工作节点,worker node
centos7.5  x86_64 node4 192.168.1.53 工作节点,worker node

2.2、安装基础运行环境

(关闭firewalld和selinux)

对4台主机执行如下命令安装docker环境:

#清除老版本docker,确保机器上没有安装docker
yum remove docker docker-client docker-client-lastest docker-common docker-lastest docker-lastest-logrotate docker-logrotate docker-engine

#yum安装gcc相关命令
yum -y install gcc gcc-c++

#安装 yum-utils 包(提供yum-config-manager 实用程序)并设置稳定的存储库
yum install -y yum-utils

#设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新yum软件包索引
yum makecache fast

#安装docker-ce引擎
yum -y install docker-ce docker-ce-cli containerd.io

#检测是否安装成功
docker version 

systemctl start docker
systemctl enable docker

2.3、建立swarm集群

步骤1:

在node1建立swarm管理节点:

docker swarm init --advertise-addr 192.168.1.50

【docker详解14】-Docker Swarm容器集群编排_第2张图片

        如上图,建立管理节点后,会返回从节点加入的命令。

步骤2:

将node2、node3、node4加入管理节点node1:

docker swarm join --token SWMTKN-1-0vnw7qc2r8796e8thdywk7vtjvje366e9e5mscob59ca7lkhb6-bzitohbqihf21jqhxdtoan3bz 192.168.1.50:2377

 步骤3:

在manager管理节点查看集群状态(worker节点是无法查看的):

#在node1 manager节点执行
docker  node  ls

【docker详解14】-Docker Swarm容器集群编排_第3张图片

2.4、swarm集群管理

(1)、重新生成集群token

如果有新的节点需要加入,加入的token忘记了,就需要重新在管理节点生成一个token,如下:

#只能在manager节点生成token
#1、生成manager token
docker swarm join-token manager

#2、生成worker token
docker swarm join-token worker

     【docker详解14】-Docker Swarm容器集群编排_第4张图片

         如上,根据需求选择是以manager身份加入还是worker身份加入;

        如下图,标记为Reachable的为以manager身份接入的节点,空白的是worker节点,Reachable节点权限还是要低于Leader主节点,但是也拥有集群管理权限,比如查看集群状态,生成集群join-token等:

(2)、节点权限降级

比如将node4节点由Reachable管理节点降级为worker节点

在Leader管理节点node1执行如下:

docker node demote node4

【docker详解14】-Docker Swarm容器集群编排_第5张图片

(3)、节点权限升级

比如将node4节点由Worker节点降级为Reachable管理节点

在Leader管理节点node1执行如下命令:

docker node promote node4

【docker详解14】-Docker Swarm容器集群编排_第6张图片

(4)、删除一个集群节点

【说明】:

a、删除集群节点(worker节点),需要被删节点先主动离开集群,然后再由manager节点删除

b、如果删除的是manager节点,则需要先降级为worker节点,再主动离开集群,最后由manager节点删除

  • 删除一个普通worker节点操作如下,以删除node2为例:
#在node2被删节点执行如下:
docker swarm leave -f         #-f参数表示强制离开集群


#在node1管理节点执行如下:
docker node  ls               #观察node1节点状态STATUS是否变为Down
docker node rm node2          #删除node2节点

  • 删除一个Reachable管理节点,以node4为例:
#在node1管理节点操作下面命令:
docker node demote node4        #先将node4降级为worker


#在node4被删节点操作如下:
docker swarm leave              #离开集群


#在node1管理节点操作如下:
docker node rm node4

(5)、其他常用命令

(主要为docker node命令和docker swarm命令,详情可使用docker node --help和docker swarm --help查看所有参数)

#查看集群节点状态,只能在manager节点使用
docker node ls

#查看运行节点的任务列表
docker node ps [NODENAME]

#查看节点详细信息
docker node inspect [NODENAME]

#更新节点
docker node update [NODENAME]

2.5、集群管理常见报错

(1)、存在两个同名swarm节点,导致无法删除

【docker详解14】-Docker Swarm容器集群编排_第7张图片

解决方式:HOSTNAME相同,导致swarm不知道删哪个,但是两者ID号不同,可以使用ID方式删除,如下:

docker node rm 5ka7ksvrnlr1n2wjrtkanpnq3 -f

三、集群高可用演示

3.1、Docker Swarm高可用性介绍

        在Docker Swarm中,Swarm manager负责管理整个集群,包括成规模的众多Docker主机资源。如果这个Swarm manager挂了,你必须创建一个新的来解决中断的服务。

        Docker Swarm具有High Availability的特性,当有一个manager实例出现问题,Docker Swarm可以优雅的进行故障转移-failover。你可以创建一个单独的primary manager实例和多个replica实例来使用这个特性。

        一个primary manager是Docker Swarm集群的主要联系人。你也可以创建replica实例作为次要联系人,并与它进行通信。对于replica收到的请求会被自动的代理到primary manager。如果一个primary manager故障,一个replica会成为leader。通过这种机制,你可以始终保持于集群的联系。

3.2、高可用切换演示

以如下docker集群状态为例,node1为主管理节点、node2和node4为普通管理节点、node3为工作节点:

【docker详解14】-Docker Swarm容器集群编排_第8张图片

 当在node1 Leader节点执行systemctl stop docker,模拟将docker服务挂掉之后,等过一小会儿之后,docker服务会自动被重新启动,并且集群将重新连接,只是主管理节点(Leader)会转移,如下图:

【docker详解14】-Docker Swarm容器集群编排_第9张图片

 【注意】:如果集群没有设置普通管理节点(Reachable),那么当主管理节点(Leader)挂掉再恢复之后,主管理节点(Leader)不会改变,因为没有普通管理节点(Reachable)参与选举。

四、通过docker service管理服务

4.1、docker service命令详解

【docker详解14】-Docker Swarm容器集群编排_第10张图片

【注】:以下命令中,mynginx和nginx更换为对应的服务名和镜像名 

(1)、创建/启动服务

#创建nginx服务
docker service create nginx

#创建nginx服务,并映射80端口
docker service create -p 80:80 nginx

#创建nginx容器,并设置5个运行副本
docker service create --replicas 5 nginx

(2)、查看正在运行的服务

docker service ls

(3)、查看某个服务运行状态

docker service ps mynginx

(4)、增加和删除DNS

docker service update --dns-add 222.222.222.222 mynginx
docker service update --dns-rm 222.222.222.222 mynginx

(5)、增加和删除端口映射

docker service update --publish-add 80:80 xenodochial_ritchie
docker service update --publish-rm 80:80 xenodochial_ritchie

(6)、缩容和扩容

#设置运行副本为2个实例
docker service scale tender_hofstadter=2

#设置运行副本为5个实例
docker service scale tender_hofstadter=5

(7)、显示服务详细信息

docker service inspect mynginx

(8)、获取服务日志

docker service logs mgnginx

(9)、删除一个或多个服务

docker service rm mynginx

(10)、回滚服务

docker service rollback mynginx

(11)、更新服务

docker service update mynginx

4.2、使用docker service管理服务演示

(1)、创建服务

以在swarm集群创建nginx服务为例:

集群节点状态如下:

【docker详解14】-Docker Swarm容器集群编排_第11张图片

创建mynginx服务:

docker service create --name mynginx -p 80:80 nginx

查看docker service:

docker service ls

 如上图,REPLICAS为1表示目前只有一个副本在运行

查看docker service中mynginx的状态和信息:

docker service ps mynginx

如上图, 可以看到mynginx服务只有一个副本在运行,并且是运行在node4节点上,可以在node4节点执行docker ps -a查看到在运行的mynginx容器:

因为现在mynginx已经在swarm集群运行,并且映射了端口,此时通过node1~4任何一个节点的主机ip都可以访问到nginx服务:

【docker详解14】-Docker Swarm容器集群编排_第12张图片

(2)、扩容或缩容服务

 (当web访问量骤增和骤减,这时候就需要动态的对mynginx服务进行扩容和缩容)

#有以下两种方式,2选1即可
#方式1
docker service update --replicas 5 mynginx   #将运行副本数设置为5


#方式2
docker srevice scale mynginx=5               #将运行副本数设置为5

查看扩容/缩容后的服务状态:

docker service ls

docker service ps mynginx

 如上图可以看到,docker service会将所有副本均衡的分布到所有节点上。

你可能感兴趣的:(Docker,linux,docker,swarm,centos)