网站首页 > 技术文章 正文
技能目标:
· 了解Docker Swarm基本特性
· 掌握Doccker Swarm基本架构
· 学会安装部署Docker Swarm群集
8.1 案例分析
8.1.1 案例概述
Docker 自诞生以来,其容器特性以及镜像特性给 DevOps 爱好者带来了诸多方便。然而在很长的一段时间内,Docker 只能在单机上运行,其跨主机部署、运行与管理能力颇受外界诟病。跨主机能力薄弱,直接导致Docker容器与主机的高度耦合。该情况导致Docker 容器的灵活性减弱,很难实现容器的迁移、分组等功能。
于是,Docker 公司在 2014年12月初新发布容器管理工具Swarm。和Swarm一起发布的Docker管理工具还有 Machine以及Compose。
Swarm是一套较为简单的工具,可以用来管理Docker群集。通过Swarm的管理,对外完全可以将群集看成一个单一的物理机或者虚拟机。同时,Swarm 使用标准的Docker API 接口作为其访问入口。换言之,可以以标准的 Docker 命令来管理群集,例如可以直接执行Docker ps命令等等。Swarm几乎全部用Go语言来完成开发,从Github上可以得知,Swarm的发展非常迅速,几乎每隔几天就有代码的更新。功能和特性的变更迭代还非常频繁。Swarm 从设计之初就和 Docker 的其它项目一样,遵循"batteries included but removable"原则。也就是说,Swarm 能够通过简单的部署就能让用户很方便的来管理 Docker群集。同时,群集不管是manager节点还是node节点挂掉,都不会影响已有 Docker 容器的使用。
8.1.2 案例前置知识点
1. Docker Swarm 是什么
Docker Swarm是一个用于创建Docker主机(运行Docker守护进程的服务器)群集的工具,使用Swarm操作群集,会使用户感觉就像是在一台主机上进行操作。
2. Docker Swarm是如何工作的
在Swarm群集中部署镜像创建一个服务时。在一些大的应用上下文环境中需要各种服务配合工作,这样服务通常称之为微服务。服务可能是一个HTTP服务器、数据库、或者分布式环境中运行的任何其他可执行的程序。
在创建服务时,可以指定要使用的容器镜像以及容器中要运行的命令。服务还可以定义下面选项:
· 群集要对外服务的端口
· 在群集中用于服务之间相连的overlay网络
· 滚动更新策略
· 群集总运行的副本数量
1)服务、任务和容器
当将服务部署到群集时,管理者将服务定义视为服务所需状态。然后将服务调度为一个或多个副本任务。这些任务在群集的节点上彼此独立运行。
容器是一个独立的进程。在swarm模型中,每个任务调用一个容器。任务类似于插槽,调度器将容器放入其中。一旦容器运行,调度器认为该任务处于运行状态。如果容器出现健康监测失败或者终止,那么任务也终止。
2)任务和调度
任务是群集内调度的原子单位。当创建或者更新服务声明所需的服务状态时,协调者通过调度任务来实现这些所需的状态。
任务是一个单向机制,通过这些状态单独进行:分配、准备、运行等等。如果任务失败,协调者将删除任务以及容器,然后根据服务指定的所需状态创建一个新的任务来代替它。
Docker swarm模式的基础逻辑是通用调度器和编排器。
群集是如何接受服务创建请求并将任务调度到工作节点上。
3)待处理的服务
一个服务可以这样配置,使得当前群集中的节点不能运行其任务。在这种情况下,服务仍处于待处理状态。
如果所有节点被暂停或Drain,并且你创建一个服务,将被挂起,直到节点可用。实际上,第一个可用的节点将会获得所有的任务,这在生产环境中不是件好事。
可以为服务预留特定数量的内存。如果群集中没有节点满足所需的内存量,则服务将处于待处理状态,知道可用的节点运行其任务。如果指定了非常大的值,则任务将永久挂起,除非确实有一个满足该条件的节点。
可以对服务施加约束,并且可能无法在给定时间履行约束。
此行为说明您的任务的要求和配置与当前的群组状态并不紧密。作为群集管理员,可以声明群集所需状态,并且管理者可以使用群集中的节点来创建该状态。在群集中不需要微管理任务。
如果唯一的目的就是删除部署服务,请将服务扩展为0,而不需要尝试将其配置成保持待处理状态。
4)副本和全局服务
有两种类型的服务部署:副本和全局。
对于副本服务,指定要运行的相同任务的数量,每个副本都是相同的内容。
全局服务是在每个节点上运行一个任务的服务。不需要预先指定任务数量。每当将一个节点添加到群集中,协调者将创建一个任务,并且调度器将任务分配给该新加入的节点。全局服务最好是监控代理、反病毒扫描程序等等想要在群集中每个节点上运行的容器。
3. Docker Swarm 基本特性
Docker群集管理和编排的特性是通过SwarmKit进行构建的, 其中Swarm mode是Docker Engine内置支持的一种默认实现。Docker 1.12以及更新的版本,都支持Swarm mode,我们可以基于Docker Engine来构建Swarm群集,然后就可以将我们的应用服务(Application Service)部署到Swarm群集中。创建Swarm群集的方式很简单,先初始化一个Swarm群集,然后将其他的Node加入到该群集即可。
Docker Swarm具有如下基本特性:
1)群集管理集成进Docker Engine:使用内置的群集管理功能,可以直接通过Docker CLI命令来创建Swarm群集,然后去部署应用服务,而不再需要其它外部的软件来创建和管理一个Swarm群集。
2)去中心化设计:Swarm群集中包含Manager和Worker两类Node,可以直接基于Docker Engine来部署任何类型的Node。而且,在Swarm群集运行期间,既可以对其作出任何改变,实现对群集的扩容和缩容等,如添加Manager Node,如删除Worker Node,而做这些操作不需要暂停或重启当前的Swarm群集服务。
3)声明式服务模型:在实现的应用栈中,Docker Engine使用了一种声明的方式,可以定义所期望的各种服务的状态,例如,创建了一个应用服务栈:一个Web前端服务、一个后端数据库服务、Web前端服务又依赖于一个消息队列服务。
4)协调预期状态与实际状态的一致性:Swarm群集Manager Node会不断地监控群集的状态,协调群集状态使得我们预期状态和实际状态保持一致。例如启动了一个应用服务,指定服务副本为10,则会启动10个Docker容器去运行。如果某个Worker Node上面运行的2个Docker容器挂掉了,则Swarm Manager会选择群集中其它可用的Worker Node,并创建2个服务副本,使实际运行的Docker容器数仍然保持与预期的10个一致。
5)多主机网络:Swarm Manager会给群集中每一个服务分配一个唯一的DNS名称,对运行中的Docker容器进行负载均衡。可以通过Swarm内置的DNS Server,查询Swarm群集中运行的Docker容器状态。
6)负载均衡:在Swarm内部,可以指定如何在各个Node之间分发服务容器(Service Container),实现负载均衡。如果想要使用Swarm群集外部的负载均衡器,可以将服务容器的端口暴露到外部。
7)安全策略:在Swarm群集内部的Node,强制使用基于TLS的双向认证,并且在单个Node上以及在群集中的Node之间,都进行安全的加密通信。可以选择使用自签名的根证书,或者使用自定义的根CA(Root CA)证书。
8)滚动更新:对于服务需要更新的场景,我们可以在多个Node上进行增量部署更新,Swarm Manager支持通过使用Docker CLI设置一个delay时间间隔,实现多个服务在多个Node上依次进行部署,这样可以非常灵活地控制。如果有一个服务更新失败,则暂停后面的更新操作,重新回滚到更新之前的版本。
8.1.3 案例环境
1. 本案例实验环境
本案例实验环境如表8-1所示。
表8-1 Docker Swarm系统环境
2. 案例拓扑
Docker Swarm提供了基本的群集能力,能够使多个Docker Engine组合成一个group,提供多容器服务。Swarm使用标准的Docker API,启动容器可以直接使用docker run命令。Swarm更核心的则是关注如何选择一个主机并在其上启动容器,最终运行服务。Docker Swarm拓扑图如图8.1所示。
图8.1 Docker Swarm拓扑图
3. 案例需求
部署Docker Swarm集群
4. 案例实现思路
1)准备Docker Swarm部署环境。
2)部署Docker Swarm 集群。
8.2 案例实施
8.2.1 Docker Swarm系统环境准备
1. 修改主机名
[root@localhost ~]# hostnamectl set-hostname manager //192.168.168.93
[root@localhost ~]# hostnamectl set-hostname worker01 //192.168.168.94
[root@localhost ~]# hostnamectl set-hostname worker02 //192.168.168.95
2. 修改hosts对应主机名
[root@manager ~]# vim /etc/hosts //每台机器都需要执行
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.168.93 manager
192.168.168.94 worker01
192.168.168.95 worker02
3. 添加外网dns解析地址
[root@manager ~]# vim /etc/resolv.conf //每台机器都需要执行,也可以根据本地的网络环境添加相对应的dns解析地址
nameserver 202.106.0.20
4. 安装必要的依赖软件
//每台机器都需要执行
[root@manager ~]# yum -y install wget telnet lsof vim
[root@manager ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@manager ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@manager ~]# yum -y install docker-ce
[root@manager ~]# systemctl restart docker
//添加免证书验证
[root@manager ~]# cat << EOF > /etc/docker/daemon.json
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
EOF
5. firewalld放行端口
每台机器都需要执行,群集节点之间保证Tcp 2377(群集管理端口)、Tcp/Udp 7946(容器网络发现端口)和Udp 4789(overlay网络通信端口)。
[root@manager ~]# systemctl restart firewalld
[root@manager ~]# firewall-cmd --zone=public --add-port=2377/tcp --permanent
[root@manager ~]# firewall-cmd --zone=public --add-port=7946/tcp --permanent
[root@manager ~]# firewall-cmd --zone=public --add-port=7946/udp --permanent
[root@manager ~]# firewall-cmd --zone=public --add-port=4789/tcp --permanent
[root@manager ~]# firewall-cmd --zone=public --add-port=4789/udp --permanent
[root@manager ~]# firewall-cmd --reload
重启firewalld之后,还需要重启docker服务。
[root@manager ~]# systemctl restart docker
6. 关闭Selinux
[root@manager ~]# setenforce 0 //每台机器都需要操作
8.2.2 Docker Swarm群集部署
1. 创建Swarm群集
创建Swarm群集部署命令,格式如下所示:
docker swarm init --advertise-addr <MANAGER-IP>
在manager Node上,创建一个Swarm群集,执行如下命令:
[root@manager ~]# docker swarm init --advertise-addr 192.168.168.93
上面--advertise-addr选项指定Manager Node会publish它的地址为192.168.168.93,后续Worker Node加入到该Swarm群集,必须要能够访问到Manager的该IP地址。可以看到,下面是上述命令的执行结果。
Swarm initialized: current node (qj6mw4uaqjzuefmylnbhuj8me) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-27wmombuc1w9h0qv48mswupgftou5af9gnvhp22wh0lowp57v5-3xzmsxpp81efgfhntsqjxlb58 192.168.168.93:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
该结果中给出了后续操作引导信息,显示如何将一个Worker Node加入到Swarm群集中。也可以通过如下命令获取该提示信息:
[root@manager ~]# docker swarm join-token worker
在任何时候,如果需要向已经创建的Swarm群集中增加Worker Node,只要新增一个主机(物理机、云主机等都可以),在其上安装好Docker Engine并启动,然后执行上述docker swarm join命令,就可以加入到Swarm群集中。
这时,也可以查看当前Manager Node的基本信息,执行docker info命令,输出信息中可以看到,包含如下关于Swarm的状态信息。
[root@manager ~]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.03.0-ce
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: active
NodeID: qj6mw4uaqjzuefmylnbhuj8me
Is Manager: true
ClusterID: ra042h0yvxw4p9e7cr9z2hyhe
Managers: 1
Nodes: 1
......//省略部分
可以看出,目前Swarm群集只有Manager一个Node,而且状态是active。也可以在Manager Node上执行docker node ls命令查看Node状态,如下所示:
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
qj6mw4uaqjzuefmylnbhuj8me * manager Ready Active Leader 18.03.1-ce
2. 添加worker节点到Swarm群集
接下来,可以根据上面提示信息,分别在worker01、worker02两个Worker Node 上,执行命令将Worker Node加入到Swarm群集中,命令如下所示:
[root@worker01 ~]# docker swarm join --token SWMTKN-1-27wmombuc1w9h0qv48mswupgftou5af9gnvhp22wh0lowp57v5-3xzmsxpp81efgfhntsqjxlb58 192.168.168.93:2377
This node joined a swarm as a worker.
[root@worker02 ~]# docker swarm join --token SWMTKN-1-27wmombuc1w9h0qv48mswupgftou5af9gnvhp22wh0lowp57v5-3xzmsxpp81efgfhntsqjxlb58 192.168.168.93:2377
This node joined a swarm as a worker.
如果成功,可以看到上述成功加入Swarm群集的信息。这时,也可以在Manager Node上,查看Swarm群集的信息,示例如下所示:
[root@manager ~]# docker info
......//省略部分
Swarm: active
NodeID: qj6mw4uaqjzuefmylnbhuj8me
Is Manager: true
ClusterID: ra042h0yvxw4p9e7cr9z2hyhe
Managers: 1
Nodes: 3
3. 查看Swarm群集中全部Node的详细状态信息
可以执行如下所示命令,查看Swarm群集中全部Node的详细状态信。
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
qj6mw4uaqjzuefmylnbhuj8me * manager Ready Active Leader 18.03.1-ce
n8c2ay19vj2jamf2jc8b3t2ey worker01 Ready Active 18.03.1-ce
md3sf2f1eqml785qpjgy0idef worker02 Ready Active 18.03.1-ce
上面信息中,AVAILABILITY表示Swarm Scheduler是否可以向群集中的某个Node指派Task,对应有如下三种状态:
· Active:群集中该Node可以被指派Task。
· Pause:群集中该Node不可以被指派新的Task,但是其他已经存在的Task保持运行。
· Drain:群集中该Node不可以被指派新的Task,Swarm Scheduler停掉已经存在的,Task,并将它们调度到可用的Node上。
查看某一个Node的状态信息,只可以在该Manager Node上执行如下命令:
[root@manager ~]# docker node inspect self
[
{
"ID": "qj6mw4uaqjzuefmylnbhuj8me",
"Version": {
"Index": 9
},
"CreatedAt": "2018-05-21T08:26:13.089684925Z",
"UpdatedAt": "2018-05-21T08:26:13.692484374Z",
"Spec": {
"Labels": {},
"Role": "manager",
"Availability": "active"
},
"Description": {
"Hostname": "manager",
"Platform": {
"Architecture": "x86_64",
"OS": "linux"
},
"Resources": {
"NanoCPUs": 6000000000,
"MemoryBytes": 100953018368
},
"Engine": {
"EngineVersion": "18.03.1-ce",
"Plugins": [
{
"Type": "Log",
"Name": "awslogs"
},
{
"Type": "Log",
"Name": "fluentd"
},
{
"Type": "Log",
"Name": "gcplogs"
},
{
"Type": "Log",
"Name": "gelf"
},
{
"Type": "Log",
"Name": "journald"
},
{
"Type": "Log",
"Name": "json-file"
},
{
"Type": "Log",
"Name": "logentries"
},
{
"Type": "Log",
"Name": "splunk"
},
{
"Type": "Log",
"Name": "syslog"
},
{
"Type": "Network",
"Name": "bridge"
},
{
"Type": "Network",
"Name": "host"
},
{
"Type": "Network",
"Name": "macvlan"
},
{
"Type": "Network",
"Name": "null"
},
{
"Type": "Network",
"Name": "overlay"
},
{
"Type": "Volume",
"Name": "local"
}
]
},
"TLSInfo": {
"TrustRoot": "-----BEGIN CERTIFICATE-----\nMIIBazCCARCgAwIBAgIUCjeUx/696eyT0m2P8JSxGYNCKIowCgYIKoZIzj0EAwIw\nEzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTgwNTIxMDgyMTAwWhcNMzgwNTE2MDgy\nMTAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABMnb9pYxWhs57k/Q+buK3xPibxz1QVEHs263EhVRIowCZJoyMW3Vj7GqBte9\nhZJVVcpb8xpqMZraHxlR2dXNav6jQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBT1mvhGdSn/8uv2gcpMSSYQPfbFQTAKBggqhkjO\nPQQDAgNJADBGAiEA0DbnFSYlB0PirsuQrjgEvZ8FTUc27iWXK7BYPCGaL2ICIQDG\n2eQzyXCSldnbgig5PuKrsU3k53BVy5/Sr2nW15PvPQ==\n-----END CERTIFICATE-----\n",
"CertIssuerSubject": "MBMxETAPBgNVBAMTCHN3YXJtLWNh",
"CertIssuerPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEydv2ljFaGznuT9D5u4rfE+JvHPVBUQezbrcSFVEijAJkmjIxbdWPsaoG172FklVVylvzGmoxmtofGVHZ1c1q/g=="
}
},
"Status": {
"State": "ready",
"Addr": "192.168.168.93"
},
"ManagerStatus": {
"Leader": true,
"Reachability": "reachable",
"Addr": "192.168.168.93:2377"
}
}
]
至此,Docker Swarm群集部署完成。
猜你喜欢
- 2024-10-14 Docker Overlay 网络学习 dockercompose 网络
- 2024-10-14 盘点c++几种常见的设计模式及具体实现
- 2024-10-14 Docker新手福音!这个开源控制面板让你更快上手Docker
- 2024-10-14 Docker-掌握这三种方法,创建自己的docker镜像
- 2024-10-14 docker 基础概念 docker基于什么
- 2024-10-14 小白也能轻松上手,深度体验绿联私有云DX4600 Docker功能
- 2024-10-14 一文带你了解docker常用命令 docker常用命令及参数
- 2024-10-14 Docker最佳实践的反模式 docker反向代理
- 2024-10-14 docker中容器如何实现通信 docker容器之间如何通信
- 2024-10-14 工程化Docker:确保应用程序的可靠性、可扩展性和可维护性
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)