初探 docker swarm 群集

實驗環(huán)境:

3臺Centos7的虛擬機(1臺管理端,2臺工作端 )

各端的IP如下:

管理端:10.0.18.119

工作端1:10.0.18.120

工作端2:10.0.18.121

實驗過程:

第一步,建立管理端(其中)

docker swarm init--advertise-addr 10.0.18.119

運行以上命令后會生成一段工作端用于加入的命令。

如:

docker swarm join --token SWMTKN-1-1qtym96ffwc9frdawv2d259jjyr1kwp0z8cw47x2qtq43rdczd-erd80po13jorac0hvlse44w2j 10.0.18.119:2377

其后要開通管理端的幾個端口:(2377用于群集管理,7946用于節(jié)點之間的通迅,4789用于容器跨主機的通訊)

firewall-cmd --permanent --add-port=2377/tcp

firewall-cmd --permanent --add-port=7946/tcp

firewall-cmd --permanent --add-port=7946/udp

firewall-cmd --permanent --add-port=4789/udp

firewall-cmd --reload

查看節(jié)點的信息

docker info

圖中的“Is Manager : true”代表此節(jié)點就是管理端

docker node ls

查看當前群集中的節(jié)點數(shù)量


第二步,將節(jié)點加入群集

在其中一個節(jié)點10.0.18.120上執(zhí)行在第一步中生成的加入命令:

docker swarm join --token SWMTKN-1-1qtym96ffwc9frdawv2d259jjyr1kwp0z8cw47x2qtq43rdczd-erd80po13jorac0hvlse44w2j 10.0.18.119:2377

如果你因為某種原因錯過了生成的命令串,可于管理端執(zhí)行以下命令,再次生成:

docker swarm join-token worker

加入群集的執(zhí)行例子如下:

如果管理端的防火墻沒有配置正確,可能會報以下錯誤:

Error response from daemon: rpc error: code = Unavailable desc = grpc: the connection is unavailable


第三步,在群集中部署一個服務

在管理端執(zhí)行:

docker service create --replicas 1 --name helloworld alpine ping docker.com

說明:--replicas 1代理建立一個實例,?alpine ping docker.com代表,在alpine中執(zhí)行ping

以下命令可以,查看運行中的服務:

docker service ls

使用以下命令查看服務的詳細屬性:

docker service inspect --pretty helloworld

使用以下命令查看服務運行于哪些節(jié)點上:

docker service ps helloworld

也可以在運行的節(jié)點上直接查看運行中的容器:

docker ps

還可以增加服務的實例數(shù)量:(將實例數(shù)從1個變成5個)

docker service scale helloworld=5

調整實例數(shù)后,可以使用以下命令查看變化:

docker service ps helloworld


第四步,刪除已部署的服務(和刪除容器一樣間單)

docker service rm helloworld


第五步,動態(tài)升級服務的容器版本

假設現(xiàn)有服務是redis:3.0.6

docker service create \

--replicas 3 \

--name redis \

--update -delay10s \

redis:3.0.6

現(xiàn)在將它升級為3.0.7

docker service update --image redis:3.0.7 redis

可以使用以下命令查看升級前后的服務詳細信息:

docker service inspect --pretty redis

使用以下命令重啟暫停中的實例容器:

docker service update redis


第六步,暫停恢復某些工作端接收服務的實例

暫停,drain

docker node update --availability drain worker1

恢復,active

docker node update --availability active worker1


第七步,群集中的網(wǎng)絡與負載均衡

用一張圖來說明群集中的網(wǎng)絡:


使用內置的routing mesh功能創(chuàng)建nginx服務實例

docker service create \

--name my-web\

published=8080,target=80?

nginx

注意:每個節(jié)點都要先開通防火墻的端口

firewall-cmd --permanent --add-port=8080/tcp

firewall-cmd --reload

routing mesh功能是指所有群集中的節(jié)點都會去監(jiān)聽發(fā)布的端口,此實例中是8080,并自動分配到運行中的服務實例。

如果服務的端口是TCP協(xié)議,則無須特別指明:

docker service create --name dns-cache \

--publishpublished=53, target=53 \

dns-cache

如果是UDP協(xié)議,則須指明協(xié)議:

docker service create--name dns-cache \

--publishpublished=53,target=53 \

--publishpublished=53,target=53,protocol=udp \

dns-cache

也可以不使用routing mesh功能,使到只有運行實例的節(jié)點才去監(jiān)聽服務端口,方法是采用host模式,即在端口定義后面加上mode=host?:

docker service create--name dns-cache \

--publishpublished=53,target=53,protocol=udp,mode=host \

--modeglobal \

dns-cache

當然,也可以使用外置的負載均衡:


HAProxy的配置文件內容如下:

/etc/haproxy/haproxy.cfg

global?

?log /dev/log local0?

?log /dev/log local1 notice

...snip...

# Configure HAProxy to listen on port 80

frontend http_front

bind *:80?

stats uri /haproxy?stats?

?default_backend http_back

# Configure HAProxy to route requests to swarm nodes on port 8080

backend http_back?

?balance roundrobin?

?server node1 192.168.99.100:8080 check?

?server node2 192.168.99.101:8080 check?

?server node3 192.168.99.102:8080 check

當使用外圍的負載均衡時可以將--endpoint-mode設置成dnsrr,從而不使用內置的routing mesh功能

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容