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 ,滾動更新