1. 程式人生 > >Docker實踐(六):Docker Swarm

Docker實踐(六):Docker Swarm

apach 功能 進程 默認 數量 tag ted head -o

環境說明:

主機名 操作系統版本 IP地址 docker版本 說明
manager Ubuntu 16.04.5 172.27.9.71 18.09.2 manager管理主機
work01 Ubuntu 16.04.5 172.27.9.75 18.09.2 worker主機01
work02 Ubuntu 16.04.5 172.27.9.76 18.09.2 worker主機02

本文所有測試都在Vmware虛擬機(版本為12.5.2)上完成
ubuntu安裝詳見:Ubuntu16.04.5以lvm方式安裝全記錄
docker安裝詳見:Ubuntu16.04安裝Docker
docker-machine安裝詳見:

docker machine實踐

一、簡介

技術分享圖片

1.Swarm是Docker公司推出的用來管理docker集群的平臺,基於GO語言實現,代碼開源在https://github.com/docker/swarm, 其核心設計是將幾臺安裝Docker的機器組成一個大的集群,相當於變成一個單一的虛擬主機,該集群提供給用戶的管理集群所有容器的操作接口與使用一臺Docker幾乎相同。
?
2.作為容器集群管理器,Swarm最大的優勢之一就是原生支持Docker API,給用戶帶來極大的便利。各種基於標準API的工具如Compose、Docker SDK、各種管理軟件甚至Docker本身都可以很容易的與Swarm集成,這大大方便了用戶將原本基於單節點的系統移植到Swarm上,同時Swarm內置了對Docker網絡插件的支持,用戶也很容易的部署跨主機的容器集群服務。

?
3.Docker Swarm和Docker Compose一樣,都是Docker官方容器編排項目,但不同的是Docker Compose是一個在單個服務器或主機上創建多個容器的工具,而Docker Swarm則可以在多個服務器或主機上創建容器集群服務
?
4.從 Docker 1.12.0 版本開始,Docker Swarm 已經包含在 Docker 引擎中(docker swarm),並且已經內置了服務發現工具,我們就不需要像之前一樣,再配置 Etcd 或者 Consul 來進行服務發現配置了。

二、基本概念

  • Swarm集群 ?Swarm集群(Cluster)為一組被統一管理起來的Docker主機。這些主機通過Docker引擎的Swarm模式相互溝通,其中部分主機作為管理節點(manager)響應外部的管理需求,其他主機作為工作節點(worker)來實際運行Docker容器
  • Node ?節點(Node)是Swarm集群的最小資源單位,每個節點實際上都是一臺Docker主機。節點分為管理節點(manager node)和工作節點(worker node)
  • Service ?服務(Service)由多個Task(任務)組成,每個任務為某個具體的應用,Service的所有Task狀態對等,Service定義了worker node上要執行的任務
  • Task ?任務(Task)是Swarm集群中最小的調度單位,任務是在docekr容器中執行的命令,Manager節點根據指定數量的任務副本分配任務給worker節點,一個任務包含了一個容器及其運行的命令

Node:
技術分享圖片

Service:
技術分享圖片

任務與調度:
技術分享圖片

replicated services和global services:
技術分享圖片

三、功能測試

1. 創建Swarm集群

在管理節點上執行如下命令創建Swarm集群

[email protected]:~# docker swarm init --advertise-addr 172.27.9.71
Swarm initialized: current node (prgucud40k77t38uadcq4rboq) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3fcb2bna1livym0xvq6b4m4re9dewyxm51ie6su9plog7hr3xd-cutz7yabg6k28dsna83mzgwkt 172.27.9.71:2377

To add a manager to this swarm, run ‘docker swarm join-token manager‘ and follow the instructions.

默認情況下管理節點也是work節點,如果希望管理節點專用,即不作為work節點,可以使用‘--availability’參數:

[email protected]:~# docker swarm init --advertise-addr 172.27.9.71 --availability=drain

2. work node加入集群

2.1 查看加入命令

[email protected]:~# docker swarm join-token worker 
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3fcb2bna1livym0xvq6b4m4re9dewyxm51ie6su9plog7hr3xd-cutz7yabg6k28dsna83mzgwkt 172.27.9.71:2377

加入命令可以通過在管理節點執行‘docker swarm join-token worker ’命令查看,也可以直接使用步驟1中創建集群時的命令提示。

2.2 加入集群

在兩個work節點上分別執行如下命令

[email protected]:~# docker swarm join --token SWMTKN-1-3fcb2bna1livym0xvq6b4m4re9dewyxm51ie6su9plog7hr3xd-cutz7yabg6k28dsna83mzgwkt 172.27.9.71:2377
This node joined a swarm as a worker.

與join對應的是leave

[email protected]:~# docker swarm leave 

leave命令會離開集群,node上面的容器也會遷移到其他node

3. 查看集群信息

[email protected]:~# docker node ls
[email protected]:~# docker info

技術分享圖片

4. service創建和刪除

4.1 創建service

[email protected]:~# docker service create --name web-service --replicas 3 nginx

創建service:web-service,參數‘--replicas’指定副本數量。
Swarm集群服務類型有兩種:replicated servicesglobal services。默認為replicated services(復制服務)模式,通過--replicas參數指定副本數量;global service(全局服務)模式,在每個node上運行一個且最多一個副本。

4.2 查看service

[email protected]:~# docker service ls
[email protected]:~# docker service ps web-service 
[email protected]:~# docker service inspect web-service --pretty 

技術分享圖片
可以看到3個副本分布在三個節點上,參數‘--pretty’表示以適合閱讀格式輸出。

4.3 刪除service

[email protected]:~# docker service rm web-service 
web-service

技術分享圖片

5. service擴容與縮容

使用docker service scale命令可以對service進行擴容和縮容操作。

5.1 service擴容

將4.1中創建的service擴容至5個副本。

[email protected]:~# docker service scale web-service=5

技術分享圖片

節點manager和work02上分別新建副本4和副本5。

5.2 service縮容

[email protected]:~# docker service scale web-service=2

技術分享圖片

將service縮容至2個副本。

6. service灰度升級

6.1 新建service

新建service my-web,使用鏡像httpd:2.4,副本數為6。httpd版本查看:https://hub.docker.com/_/httpd?tab=tags

[email protected]:~# docker service  create --name my-web --replicas 6  --update-delay 30s --update-parallelism 2  httpd:2.4

技術分享圖片
技術分享圖片

參數‘--update-delay’指定更新間隔,默認為0,‘--update-parallelism’指定並行更新副本數量,默認為1。

6.2 升級my-web

將my-web由2.4升級至2.4.39

[email protected]:~# docker service update --image httpd:2.4.39  my-web 

技術分享圖片
技術分享圖片
技術分享圖片
my-web升級至2.4.39,並且每次升級兩個副本,間隔30s。

6.3 回滾

[email protected]:~# docker service rollback my-web 

使用docker service rollback命令可以將service回滾到上一個版本。這裏的上一個版本指最近的一個版本,比如httpd服務由2.4升級至2.4.38再升級至2.4.39,第一次rollback會回退至2.4.38,第二次rollback則回退至上一個版本2.4.39而不是2.4,即不能無限回退。
技術分享圖片

7. 外部訪問service

7.1 刪除所有service

[email protected]:~# docker service rm $(docker service ls -q)

7.2 新建service my-httpd

[email protected]:~# docker service create --name my-httpd --replicas 3 --publish 8080:80 httpd

新建三副本的service:my-httpd,使用--publish參數配置容器NAT網絡的端口映射。

7.3 service查看並進入容器

技術分享圖片

7.4 更新apt源

tee /etc/apt/sources.list <<-‘EOF‘
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
EOF

技術分享圖片

7.5 安裝ping和ip命令

[email protected]:/usr/local/apache2#  apt-get install iproute2 -y
[email protected]:/usr/local/apache2# apt-get install iputils-ping -y

7.6 查看ip

技術分享圖片
eth0對應的是ingress network網絡,用於容器之間訪問;eth1對應的是docker_gwbridge,用於容器訪問外網。

三個node節點上對應的eth0網卡ip分別為:10.255.0.6/7/8

  • ingress network 是一個特殊的 overlay 網絡,用於服務節點間的負載均衡。當任何 Swarm 節點在發布的端口上接收到請求時,它將該請求交給一個名為 IPVS 的模塊。IPVS 跟蹤參與該服務的所有IP地址,選擇其中的一個,並通過 ingress 網絡將請求路由到它。
    初始化或加入 Swarm 集群時會自動創建 ingress 網絡,大多數情況下,用戶不需要自定義配置,但是 docker 17.05 和更高版本允許你自定義。

  • docker_gwbridge是一種橋接網絡,將 overlay 網絡(包括 ingress 網絡)連接到一個單獨的 Docker 守護進程的物理網絡。默認情況下,服務正在運行的每個容器都連接到本地 Docker 守護進程主機的 docker_gwbridge 網絡。

7.7 ping測試

技術分享圖片
在manager節點上的容器中分別指定網卡eth0和eth1做ping測試,證實了7.6的結論:eth0用於容器間通訊;eth1用於訪問外網。

7.8 RoutingMesh

分別修改三個節點的index.html主頁內容

tee htdocs/index.html <<-‘EOF‘
<html><body><h1>manager node 172.27.9.71 !</h1></body></html>
EOF

主頁內容為hostname+ip
訪問service

[[email protected] ~]# for i in {1..10};do sleep 1; curl http://172.27.9.71:8080; done 

技術分享圖片
routing mesh會將我們對任何節點的8080端口的訪問通過swarm內部的load balancer將請求以輪詢方式轉發給my-httpd中的每一個副本。
小結:

  • 1.通過端口映射方式實現外部對service訪問;
  • 2.容器內的eth0用於容器間通訊,eth1用於容器訪問外部網絡;;
  • 3.routing mesh會將請求以輪詢方式發送給每一個副本;

8. service間的訪問

8.1 新建overlay network loong

[email protected]:~# docker network create -d overlay loong

需要相互通信的service必須屬於同一個overlay網絡,默認的overlay網絡ingress不提供DNS服務,故創建一個新的overlay網絡loong

8.2 新建service my-web

[email protected]:~# docker service create --name my-web --replicas 3 --network loong  httpd

技術分享圖片
新建service:my-web

8.3修改index.html

分別修改my-web三個副本的index.html:hostname+ip
參見7.8

8.4 新建service centos

[email protected]:~# docker service create --name centos --network loong centos sleep 100000

安裝nslookup命令
技術分享圖片

8.5 service訪問測試

技術分享圖片
小結:將service接入Overlay網絡時,Swarm會給service分配一個VIP,VIP與一個包含service名稱的DNS記錄形成映射關系,這個service的所有container共享這條DNS記錄,Swarm也會創建一個load balance將訪問的VIP流量均衡到所有的副本上。

9. service logs

[email protected]:~# docker service logs my-web 

技術分享圖片
通過docker service logs獲取某個服務或者task的日誌信息。

10. failover

10.1 新建service mybusybox

[email protected]:~# docker service create --name mybusybox --replicas 3 busybox sleep 100000

技術分享圖片
新建三副本的service mybusybox,查看得知mybusybox分布在三個節點上。

10.2 設置節點work01不可用

[email protected]:~# docker node update --availability drain work01

設置節點work01狀態為drain,即可不用

10.3 查看work01狀態

[email protected]:~# docker node inspect work01 --pretty 

技術分享圖片
節點work01狀態為不可用

10.4 查看service

技術分享圖片
可以看到原先在work01上的mybusybox.3處於shutdown狀態,上面的task被遷移至work02

10.5 重置work01為可用

[email protected]:~# docker node update --availability active work01

技術分享圖片
重置work01為active狀態,此時運行在work02的mybusybox.3不會回切

11. 節點角色互換

使用promote/demote命令可以對節點的角色進行管理,方便對Manager節點進行容災處理。

11.1work節點升級為manager

[email protected]:~# docker node promote work01

技術分享圖片
技術分享圖片
將work01節點升級為manager,升級後節點work01可成功運行管理節點命令。

11.2 manager降級為work節點

[email protected]:~# docker node demote manager 

技術分享圖片
將主機manager運行的manager節點降級為work節點,此時該節點已無法運行管理節點命令
技術分享圖片
work01上查看節點狀態,發現manager只有work01

12. service指定node部署

通過設置label,可以靈活描述node的屬性,service可通過lable選擇部署的節點。

12.1 設置lable

[email protected]:~# docker node update --label-add env=manager manager

技術分享圖片
分別設置節點manager、work01、work02的lable為tag=manager、tag=work01、tag=work02,‘tag=manager’等號兩邊都為自定義值。

12.2 指定節點新建service

[email protected]:~# docker service create  --name my_nginx --replicas 3 --constraint  ‘node.labels.tag == work01‘ nginx  

技術分享圖片
新建service my_nginx,指定node為work01

12.3 service節點遷移

[email protected]:~# docker service update --constraint-rm ‘node.labels.tag == work01‘ my_nginx 
[email protected]:~# docker service update --constraint-add ‘node.labels.tag == work02‘ my_nginx

技術分享圖片
將my_nginx由節點work01遷移至work02

12.4 刪除label

[email protected]:~# docker node update --label-add tag2=manager2 manager
[email protected]:~# docker node update --label-rm tag manager

技術分享圖片
一個node上可以有多個label,通過參數‘--label-rm’可以刪除label

Docker實踐(六):Docker Swarm