1. 程式人生 > >docker swarm ,滾動更新

docker swarm ,滾動更新

prefix RoCE images 來講 const 鏡像 isoc gist img

一、Docker swarm

Swarm 是 Docker 公司在 2014 年 12 月初發布的一套較為簡單的工具,用來管理 Docker 集群,它將一群 Docker 宿主機變成一個單一的,虛擬的主機。Swarm 使用標準的 Docker API接口作為其前端訪問入口,換言之,各種形式的 Docker Client(docker client in go, docker_py,docker 等)均可以直接與 Swarm 通信。Swarm 幾乎全部用 Go 語言來完成開發。Swarm deamon 只是一個調度器(Scheduler)加路由器(router),Swarm 自己不運行容器,它只是接受 docker 客戶端發送過來的請求,調度適合的節點來運行容器,這意味著,即使Swarm 由於某些原因掛掉了,集群中的節點也會照常運行,當 Swarm 重新恢復運行之後,它會收集重建集群信息。

技術分享圖片




swarm create
Swarm 中 swarm create 命令用於創建一個集群標誌,用於 Swarm 管理 Docker 集群時,Docker Node 的節點發現功能。發起該命令之後,Swarm 會前往 Docker Hub 上內建的發現服務中獲取一個全球唯一的token,用以唯一的標識 Swarm 管理的 Docker 集群。

swarm manage
Swarm 中 swarm manage 是最為重要的管理命令。一旦 swarm manage 命令在 Swarm 節點上被觸發,則說明用戶需要 swarm 開始管理 Docker 集群。從運行流程的角度來講,swarm 經歷的階段主要有兩點:啟動 swarm、接收並處理 Docker 集群管理請求。


Swarm 啟動的過程包含三個步驟:
發現 Docker 集群中的各個節點,收集節點狀態、角色信息,並監視節點狀態的變化;初始化內部調度(scheduler)模塊;創建並啟動 API 監聽服務模塊;


第一個步驟,Swarm 發現 Docker 集群中的節點。發現(discovery)是 Swarm 中用於維護Docker 集 群 狀 態 的 機 制 。 既 然 涉 及 到 發 現 ( discovery ) , 那 在 這 之 前 必 須 先 有 註 冊(register)。Swarm 中有專門負責發現(discovery)的模塊,而關於註冊(register)部分,不同的 discovery 模式下,註冊(register)也會有不同的形式。

目 前 , Swarm 中 提 供 了 5 種 不 同 的 發 現 ( discovery ) 機 制 : Node Discovery 、 FileDiscovery、Consul Discovery、EtcD Discovery 和 Zookeeper Discovery。
Hosted Discovery with Docker Hub,Docker Hub 提供的發現服務,需要連接外網。
docker run -d -p <manager_port>:2375 swarm manage token://<cluster_id>
基於 KV 分布式存儲系統,支持 etcd,consul,zookeeper
swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix>
靜態文件描述
swarm manage -H tcp://<swarm_ip:swarm_port> file:///tmp/my_cluster
靜態 IP 列表
swarm manage -H <swarm_ip:swarm_port> nodes://<node_ip1:2375>,<node_ip2:2375>


第二個步驟,Swarm 內部的調度(scheduler)模塊被初始化。swarm 通過發現機制發現所有註冊的 Docker Node,並收集到所有 Docker Node 的狀態以及具體信息。此後,一旦Swarm 接收到具體的 Docker 管理請求,Swarm 需要對請求進行處理,並通過所有 DockerNode 的狀態以及具體信息,來篩選(filter)決策到底哪些 Docker Node 滿足要求,並通過一定的策略(strategy)將請求轉發至具體的一個 Docker Node。


第三個步驟,Swarm 創建並初始化 API 監聽服務模塊。從功能的角度來講,可以將該模塊抽象為 Swarm Server。需要說明的是:雖然 Swarm Server 完全兼容 Docker 的 API,但是有不少 Docker 的命令目前是不支持的,畢竟管理 Docker 集群與管理單獨的 Docker 會有一些區別。當 Swarm Server 被初始化並完成監聽之後,用戶即可以通過 Docker Client 向 Swarm發送 Docker 集群的管理請求。



Swarm 的 swarm manage 接收並處理 Docker 集群的管理請求,即是 Swarm 內部多個模塊協同 合 作 的 結 果 。 請 求 入 口 為 Swarm Server , 處 理 引 擎 為 Scheduler , 節 點 信 息 依 靠Disocovery。


swarm join
Swarm 的 swarm join 命令用於將 Docker Node 添加至 Swarm 管理的 Docker 集群中。從這點也可以看出 swarm join 命令的執行位於 Docker Node,因此在 Docker Node 上運行該命令,首先需要在 Docker Node 上安裝 Swarm,由於該 Swarm 只會執行 swarm join 命令,故可以將其當成 Docker Node 上用於註冊的 agent 模塊。功能而言,swarm join 可以認為是完成 Docker Node 在 Swarm 節點處的註冊(register)工作,以便 Swarm 在執行 swarm manage 時可以發現該 Docker Node。然而,上文提及的 5 種discovery 模式中,並非每種模式都支持 swarm join 命令。不支持的 discovery 的模式有 Node Discovery 與 File Discovery。


Docker Node 上 swarm join 執行之後,標誌著 Docker Node 向 Swarm 註冊,請求加入 Swarm管理的 Docker 集群中。Swarm 通過註冊信息,發現 Docker Node,並獲取 Docker Node 的狀態以及具體信息,以便處理 Docker 請求時作為調度依據。


swarm list
Swarm 中的 swarm list 命令用以列舉 Docker 集群中的 Docker Node。


Docker Node 的信息均來源於 Swarm 節點上註冊的 Docker Node。而一個 Docker Node 在Swarm 節點上註冊,僅僅是註冊了 Docker Node 的 IP 地址以及 Docker 監聽的端口號。


使用 swarm list 命令時,需要指定 discovery 的類型,類型包括:token、etcd、file、zk 以及<ip>。而 swarm list 並未羅列 Docker 集群的動態信息,比如 Docker Node 真實的運行狀態,或者 Docker Node 在 Docker 集群中扮演的角色信息。


實驗環境 rhel7

Server1 192.168.122.21 manager

Server2 192.168.122.22 node

Server3 192.168.122.23 node


安裝docker服務

技術分享圖片


開啟服務

[root@server1 ~]# systemctl start docker


查看版本

技術分享圖片


集群搭建

創建docker swarm集群:

[root@server1 ~]# docker swarm init

技術分享圖片

加入集群

其它兩臺運行 使其加入集群

docker swarm join \ --token SWMTKN-1-4shsvq36kx6b0f8h4yma6wnmtkgewqhlbjmi284b223kxa0hdr-bqnj0zo8gbss6hgdbveesfqut \ 192.168.122.21:2377

技術分享圖片

[root@server1 ~]# docker node --help

技術分享圖片



三個節點均導入

[root@server1 ~]# docker load -i nginx.tar

[root@server1 ~]# docker service create --name web -p 80:80 --replicas 2 nginx


[root@server1 ~]# docker node ls #查看節點

技術分享圖片


[root@server1 ~]# docker service ls #查看服務狀態

技術分享圖片


[root@server1 ~]# docker service ps web #查看web狀態

技術分享圖片


瀏覽器訪問

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



[root@server1 ~]# docker service scale web=4 #設置服務數量


技術分享圖片


添加可視圖形界面

[root@server1 ~]# docker load -i visualizer.tar

技術分享圖片


[root@server1 ~]# docker service create \

> --name=viz \

> --publish=8080:8080/tcp \

> --constraint=node.role==manager \

> --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \

> dockersamples/visualizer


技術分享圖片


技術分享圖片


二、滾動更新(灰度更新)


先從物理機導出鏡像,分別發送到個結點

導出鏡像 [root@foundation12 ~]# docker save -o apache.tar rhel7:v2

各個節點導入


[root@server1 ~]# docker load -i apache.tar

技術分享圖片


[root@server1 ~]# docker service update --image rhe7:v2 --update-parallelism 2 --update-delay 2s web

#2秒更新一次,每次更新2


技術分享圖片


訪問

技術分享圖片


192.168.122.21/22/23

技術分享圖片


寫入頁面

技術分享圖片


分別拷入到容器裏

[root@server1 ~]# docker cp index.html 5694899fc975:/usr/share/nginx/html


技術分享圖片


測試 實現負載均衡

瀏覽器訪問IP,頁面切換



docker swarm ,滾動更新