Docker實踐(六):Docker Swarm
主機名 | 操作系統版本 | 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安裝詳見:
一、簡介
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 services和global 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