Swarm是Docker公司自研發(fā)的容器集群管理系統(tǒng)湾笛,Swarm在早期是作為一個獨立服務(wù)存在蝶俱,在Docker Engine v1.12中集成了Swarm的集群管理
和編排功能÷肱ⅲ可以通過初始化Swarm或加入現(xiàn)有Swarm來啟用Docker引擎的Swarm模式逛薇。
Docker Engine CLI和API包括了管理Swarm節(jié)點命令,比如添加外里、刪除節(jié)點邑飒,以及在Swarm中部署和編排服務(wù)。
也增加了服務(wù)棧(Stack)级乐、服務(wù)(Service)疙咸、任務(wù)(Task)概念
功能特點:
a.與Docker Engine集成的集群管理:
使用Docker Engine CLI創(chuàng)建一組Docker引擎,您可以在其中部署應(yīng)用程序服務(wù)风科。您不需要其他編排軟件來創(chuàng)建或管理群集撒轮。
b.節(jié)點分散式設(shè)計:
Docker Engine不是在部署時處理節(jié)點角色之間的差異,而是在運行時處理角色變化贼穆。您可以使用Docker Engine部署兩種類型的節(jié)點题山,管理節(jié)點和工作節(jié)點。這意味著您可以從單個服務(wù)器構(gòu)建整個群集故痊。
c.聲明性服務(wù)模型:
Docker Engine使用聲明性方法來定義應(yīng)用程序堆棧中各種服務(wù)的所需狀態(tài)顶瞳。例如,您可以描述由具有消息隊列服務(wù)和數(shù)據(jù)庫后端的Web前端服務(wù)組成的應(yīng)用程序愕秫。
d.可擴容與縮放容器:
對于每個服務(wù)慨菱,您可以聲明要運行的任務(wù)數(shù)。當您向上或向下縮放時戴甩,swarm管理器通過添加或刪除任務(wù)來自動適應(yīng)符喝,以保持所需的任務(wù)數(shù)量來保證集群的可靠狀態(tài)。
e.容器容錯狀態(tài)協(xié)調(diào):
群集管理器節(jié)點不斷監(jiān)視群集狀態(tài)甜孤,并協(xié)調(diào)您表示的期望狀態(tài)的實際狀態(tài)之間的任何差異协饲。例如,如果設(shè)置一個服務(wù)以運行容器的10個副本缴川,并且托管其中兩個副本的工作程序計算機崩潰茉稠,則管理器將創(chuàng)建兩個新副本以替換崩潰的副本。 swarm管理器將新副本分配給正在運行和可用的worker節(jié)點上把夸。
f.多主機網(wǎng)絡(luò):
您可以為服務(wù)指定覆蓋網(wǎng)絡(luò)而线。當swarm管理器初始化或更新應(yīng)用程序時,它會自動為覆蓋網(wǎng)絡(luò)上的容器分配地址。
g.服務(wù)發(fā)現(xiàn):
Swarm管理器節(jié)點為swarm中的每個服務(wù)分配唯一的DNS名稱吞获,并負載平衡運行的容器况凉。您可以通過嵌入在swarm中的DNS服務(wù)器查詢在群中運行的每個容器谚鄙。
h.負載平衡:
您可以將服務(wù)的端口公開給外部負載平衡器各拷。在內(nèi)部,swarm允許您指定如何在節(jié)點之間分發(fā)服務(wù)容器闷营。
m.缺省安全:
群中的每個節(jié)點強制執(zhí)行TLS相互驗證和加密烤黍,以保護其自身與所有其他節(jié)點之間的通信。您可以選擇使用自簽名根證書或來自自定義根CA的證書傻盟。
n.滾動更新:
在已經(jīng)運行期間速蕊,您可以增量地應(yīng)用服務(wù)更新到節(jié)點。 swarm管理器允許您控制將服務(wù)部署到不同節(jié)點集之間的延遲娘赴。如果出現(xiàn)任何問題规哲,您可以將任務(wù)回滾到服務(wù)的先前版本。
我的三臺測試機
IP | 角色 |
---|---|
172.16.10.85 | manager |
172.16.10.86 | worker |
172.16.10.87 | worker |
創(chuàng)建集群
在創(chuàng)建集群前诽表,如果開啟了防火墻唉锌,請確認三臺主機的防火墻能讓swarm需求的端口開放,需要打開主機之間的端口竿奏,以下端口必須可用袄简。在某些系統(tǒng)上,這些端口默認為打開泛啸。
- 2377:TCP端口2377用于集群管理通信
- 7946:TCP和UDP端口7946用于節(jié)點之間的通信
- 4789:TCP和UDP端口4789用于覆蓋網(wǎng)絡(luò)流量
可以直接禁用系統(tǒng)防火墻來讓這些端口通信不受限制绿语,一般測試環(huán)境我們都會禁用防火墻
systemctl stop firewalld(立即生效)
systemctl disable firewalld(重啟生效)
docker環(huán)境自行安裝
常用命令
在Docker Swarm中經(jīng)常使用的主要有docker swarm、docker node候址、docker service吕粹、docker stack。
docker swarm
管理swarm岗仑,添加節(jié)點
Commands:
init Initialize a swarm
join Join a swarm as a node and/or manager
join-token Manage join tokens
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm
docker node
用于管理節(jié)點
Commands:
demote Demote one or more nodes from manager in the swarm
inspect Display detailed information on one or more nodes
ls List nodes in the swarm
promote Promote one or more nodes to manager in the swarm
ps List tasks running on one or more nodes, defaults to current node
rm Remove one or more nodes from the swarm
update Update a node
docker service
管理service
Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
scale Scale one or multiple replicated services
update Update a service
docker stack
與docker-compose結(jié)合的命令昂芜,可以方便地在集群中部署應(yīng)用。
Commands:
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack
初始化swarm:
docker swarm init --advertise-addr 172.16.10.85(本機IP)
在其它兩臺worker主機上執(zhí)行加入swarm:
[root@swarm-m ~]# docker swarm init --advertise-addr 172.16.10.85
Swarm initialized: current node (mclobj2doj65sek345mjkklfo) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-42w2dmkv2u18k9d6vi65rhqggjcqcc31iijnecd4bbi43bmom2-b3o89g28thkcken0v3qxtczuj 172.16.10.85:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
如果后續(xù)我們有新的主機被當做manager赔蒲、worker節(jié)點想要加入到集群中來泌神,但要不記得當時創(chuàng)建集群時的token,在manager主機上執(zhí)行以下命令:
docker swarm join-token manager
docker swarm join-token worker
查看swarm的節(jié)點
[root@swarm-m ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
mclobj2doj65sek345mjkklfo * swarm-m.nahong.com.cn Ready Active Leader 18.06.1-ce
oyrkdwj3da9r275jxsj0lyqxe swarm-node01.nahong.cm.cn Ready Active 18.06.1-ce
f295ymtj2t3vjojdbuwclykva swarm-node02.nahong.com.cn Ready Active 18.06.1-ce
AVAILABILITY列的說明:
- Active 意味著調(diào)度程序可以將任務(wù)分配給節(jié)點舞虱。
- Pause 意味著調(diào)度程序不會將新任務(wù)分配給節(jié)點欢际,但現(xiàn)有任務(wù)仍在運行。
- Drain 意味著調(diào)度程序不會向節(jié)點分配新任務(wù)矾兜。調(diào)度程序關(guān)閉所有現(xiàn)有任務(wù)并在可用節(jié)點上調(diào)度它們损趋。
MANAGER STATUS列的說明
顯示節(jié)點是屬于manager或者worker
- 沒有值 表示不參與群管理的工作節(jié)點。
- Leader 意味著該節(jié)點是使得群的所有群管理和編排決策的主要管理器節(jié)點椅寺。
- Reachable 意味著節(jié)點是管理者節(jié)點正在參與Raft共識浑槽。如果領(lǐng)導(dǎo)節(jié)點不可用蒋失,則該節(jié)點有資格被選為新領(lǐng)導(dǎo)者。
- Unavailable 意味著節(jié)點是不能與其他管理器通信的管理器桐玻。如果管理器節(jié)點不可用篙挽,您應(yīng)該將新的管理器節(jié)點加入群集,或者將工作器節(jié)點升級為管理器镊靴。
升級或降級節(jié)點
您可以將工作程序節(jié)點提升為manager角色铣卡。這在管理器節(jié)點不可用或者您希望使管理器脫機以進行維護時很有用。 類似地偏竟,您可以將管理器節(jié)點降級為worker角色煮落。
無論您升級或降級節(jié)點,您應(yīng)該始終在群中維護奇數(shù)個管理器節(jié)點踊谋。
要升級一個節(jié)點或一組節(jié)點蝉仇,請從管理器節(jié)點運行docker node promote:
[root@swarm-m ~]# docker node promote swarm-node01.nahong.cm.cn
Node swarm-node01.nahong.cm.cn promoted to a manager in the swarm.
[root@swarm-m ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
mclobj2doj65sek345mjkklfo * swarm-m.nahong.com.cn Ready Active Leader 18.06.1-ce
oyrkdwj3da9r275jxsj0lyqxe swarm-node01.nahong.cm.cn Ready Active Reachable 18.06.1-ce
f295ymtj2t3vjojdbuwclykva swarm-node02.nahong.com.cn Ready Active 18.06.1-ce
要降級一個節(jié)點或一組節(jié)點,請從管理器節(jié)點運行docker node demote:
[root@swarm-m ~]# docker node demote swarm-node01.nahong.cm.cn
Manager swarm-node01.nahong.cm.cn demoted in the swarm.
[root@swarm-m ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
mclobj2doj65sek345mjkklfo * swarm-m.nahong.com.cn Ready Active Leader 18.06.1-ce
oyrkdwj3da9r275jxsj0lyqxe swarm-node01.nahong.cm.cn Ready Active 18.06.1-ce
f295ymtj2t3vjojdbuwclykva swarm-node02.nahong.com.cn Ready Active 18.06.1-ce
創(chuàng)建自定義的overlay網(wǎng)絡(luò):
docker network create --driver overlay --subnet 10.10.10.0/16 my-overlay-network
查詢swarm網(wǎng)絡(luò) docker network ls
[root@docker01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
24de50a56f99 bridge bridge local
a4e5dcbfd6b8 docker_gwbridge bridge local
a261cf27e5bb host host local
l5abdspoesd9 ingress overlay swarm
lp2f4kze0osc my-overlay-network overlay swarm
d625b46d604a none null local
創(chuàng)建一個nginx service
先摘取docker鏡像
docker pull linuxserver/nginx
執(zhí)行命令創(chuàng)建service:
docker service create --name webapp-nginx --replicas 3 --network my-overlay-network --publish 8089:80 linuxserver/nginx
docker service create中的參數(shù):
- --name 服務(wù)名
- --replicas 是創(chuàng)建的副本的數(shù)量
- --network 是使用的網(wǎng)絡(luò)
- --publish 是服務(wù)公開的端口 <Publish-Port>:<Target-Port>
查看webapp-nginx服務(wù)任務(wù)分配到的節(jié)點 docker service ps webapp-nginx
[root@swarm-m ~]# docker service ps webapp-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
sv6y9jedbetw webapp-nginx.1 linuxserver/nginx:latest swarm-node02.nahong.com.cn Running Running about a minute ago
k26fewhj9lzq webapp-nginx.2 linuxserver/nginx:latest swarm-m.nahong.com.cn Running Running about a minute ago
jnr2t0msnumy webapp-nginx.3 linuxserver/nginx:latest swarm-node01.nahong.cm.cn Running Running 52 seconds ago
外部訪問公開端口8089
- http://172.16.10.85:8089
- http://172.16.10.86:8089
-
http://172.16.10.87:8089
都會訪問成功殖蚕,這里就出一個85的截圖
o01.png
查看manager主機上的docker容器
[root@swarm-m ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d412b3ce543e linuxserver/nginx:latest "/init" 4 minutes ago Up 4 minutes 80/tcp, 443/tcp webapp-nginx.2.k26fewhj9lzqpva03zv6mgtpm
查看manager節(jié)點容器網(wǎng)絡(luò)
[root@swarm-m ~]# docker exec d412b3ce543e ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:FF:00:08
inet addr:10.255.0.8 Bcast:10.255.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
eth1 Link encap:Ethernet HWaddr 02:42:0A:0A:0A:08
inet addr:10.10.10.8 Bcast:10.10.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
eth2 Link encap:Ethernet HWaddr 02:42:AC:12:00:03
inet addr:172.18.0.3 Bcast:172.18.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:648 (648.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
eth0轿衔、eth1、eth2網(wǎng)卡分別:
- eth0:10.255.0.8 屬于docker的ingress網(wǎng)絡(luò)
- eth1:10.10.10.8 屬于overlay的自定義網(wǎng)絡(luò)my-overlay-network
- eth2:172.18.0.3 屬于docker_gwbridge網(wǎng)絡(luò)
ingress網(wǎng)絡(luò)會用于容器間的負載均衡嫌褪,docker_gwbridge網(wǎng)絡(luò)用于容器連接外網(wǎng)呀枢。
到另外兩臺查看網(wǎng)絡(luò):
[root@swarm-node01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34dd665161bd linuxserver/nginx:latest "/init" About an hour ago Up About an hour 80/tcp, 443/tcp webapp-nginx.3.jnr2t0msnumyd6znib3smcdj7
[root@swarm-node01 ~]# docker exec 34dd665161bd ifconfig | grep -A 1 eth1
eth1 Link encap:Ethernet HWaddr 02:42:0A:0A:0A:06
inet addr:10.10.10.6 Bcast:10.10.10.255 Mask:255.255.255.0
[root@swarm-node02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba325bc18b97 linuxserver/nginx:latest "/init" About an hour ago Up About an hour 80/tcp, 443/tcp webapp-nginx.1.sv6y9jedbetw3lbxebtneqhf6
[root@swarm-node02 ~]# docker exec ba325bc18b97 ifconfig | grep -A 1 eth1
eth1 Link encap:Ethernet HWaddr 02:42:0A:0A:0A:07
inet addr:10.10.10.7 Bcast:10.10.10.255 Mask:255.255.255.0
三個容器自定義IP分別是:
- 10.10.10.8 manager主機的nginx容器
- 10.10.10.6 worker主機的nginx容器
- 10.10.10.7 worker主機的nginx容器
在容器10.10.10.6上ping 10.10.10.8
[root@swarm-node02 ~]# docker exec ba325bc18b97 ping 10.10.10.8
PING 10.10.10.8 (10.10.10.8): 56 data bytes
64 bytes from 10.10.10.8: seq=0 ttl=64 time=0.965 ms
64 bytes from 10.10.10.8: seq=1 ttl=64 time=0.600 ms
64 bytes from 10.10.10.8: seq=2 ttl=64 time=0.710 ms
64 bytes from 10.10.10.8: seq=3 ttl=64 time=0.587 ms
64 bytes from 10.10.10.8: seq=4 ttl=64 time=0.706 ms
64 bytes from 10.10.10.8: seq=5 ttl=64 time=0.555 ms
Swarm還內(nèi)置了DNS服務(wù)。將service name作為service的DNS笼痛,就可以訪問到這個service了
創(chuàng)建另一個服務(wù):
[root@swarm-m ~]# docker service create --name webapp-test --replicas 1 --network my-overlay-network --publish 9089:80 linuxserver/nginx
a7557hfsyh60t2km2g839irvy
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
[root@swarm-m ~]# docker service ps webapp-test
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kdhw9ykrmxo3 webapp-test.1 linuxserver/nginx:latest swarm-m.nahong.com.cn Running Running 26 seconds ago
查看現(xiàn)有的服務(wù) docker service ls
[root@swarm-m ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
n9bg26g83dd9 webapp-nginx replicated 3/3 linuxserver/nginx:latest *:8089->80/tcp
a7557hfsyh60 webapp-test replicated 1/1 linuxserver/nginx:latest *:9089->80/tcp
在webapp-test容器ping 服務(wù)名webapp-nginx
[root@swarm-m ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30ef88e05ed4 linuxserver/nginx:latest "/init" 3 minutes ago Up 3 minutes 80/tcp, 443/tcp webapp-test.1.kdhw9ykrmxo36i7ldu4a43uaz
d412b3ce543e linuxserver/nginx:latest "/init" About an hour ago Up About an hour 80/tcp, 443/tcp webapp-nginx.2.k26fewhj9lzqpva03zv6mgtpm
[root@swarm-m ~]# docker exec 30ef88e05ed4 ifconfig | grep -A 1 eth1
eth1 Link encap:Ethernet HWaddr 02:42:0A:0A:0A:0A
inet addr:10.10.10.10 Bcast:10.10.10.255 Mask:255.255.255.0
[root@swarm-m ~]# docker exec 30ef88e05ed4 ping webapp-nginx
PING webapp-nginx (10.10.10.5): 56 data bytes
64 bytes from 10.10.10.5: seq=0 ttl=64 time=0.259 ms
64 bytes from 10.10.10.5: seq=1 ttl=64 time=0.149 ms
64 bytes from 10.10.10.5: seq=2 ttl=64 time=0.153 ms
64 bytes from 10.10.10.5: seq=3 ttl=64 time=0.137 ms
64 bytes from 10.10.10.5: seq=4 ttl=64 time=0.135 ms
可以看到它們使用了同一個自定義網(wǎng)絡(luò) 10.10.10.10裙秋,但是webapp-nginx解析的IP和之前的不一樣,這應(yīng)該是swarm內(nèi)部負載均衡的機制
負載均衡
負載均衡分為兩種:Swarm集群內(nèi)的service之間的相互訪問需要做負載均衡缨伊,稱為內(nèi)部負載均衡(Internal LB)摘刑;從Swarm集群外部訪問服務(wù)的公開端口,也需要做負載均衡刻坊,稱外部部負載均衡(Exteral LB or Ingress LB)
Internal LB
內(nèi)部負載均衡就是集群內(nèi)部通過DNS訪問service時枷恕,Swarm默認通過VIP(virtual IP)、iptables谭胚、IPVS轉(zhuǎn)發(fā)到某個容器
Exteral LB(Ingress LB)
外部負載均衡和Ingress網(wǎng)絡(luò)有關(guān)徐块。Swarm網(wǎng)絡(luò)要提供對外訪問的服務(wù)就需要打開公開端口,并映射到宿主機灾而。Ingress LB就是外部通過公開端口訪問集群時做的負載均衡胡控。
上圖是三個節(jié)點的Swarm集群,app服務(wù)公開了8000端口旁趟,并且有兩個副;雖然服務(wù)只有兩個副本昼激,分別在A、B兩臺主機上,但是訪問C主機的8000端口橙困,ingress網(wǎng)絡(luò)會通過IPVS將請求轉(zhuǎn)到A瞧掺、B之一的容器中處理,依然可以對外提供服務(wù)這就是 routing mesh 的作用凡傅。