1. 程式人生 > >Docker(二十)-Docker Swarm叢集部署

Docker(二十)-Docker Swarm叢集部署

介紹

Swarm 在 Docker 1.12 版本之前屬於一個獨立的專案,在 Docker 1.12 版本釋出之後,該專案合併到了 Docker 中,成為 Docker 的一個子命令。目前,Swarm 是 Docker 社群提供的唯一一個原生支援 Docker 叢集管理的工具。它可以把多個 Docker 主機組成的系統轉換為單一的虛擬 Docker 主機,使得容器可以組成跨主機的子網網路。

Swarm 是目前 Docker 官方唯一指定(繫結)的叢集管理工具。Docker 1.12 內嵌了 swarm mode 叢集管理模式。

Swarm 關鍵概念

1)Swarm

叢集的管理和編排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化時啟動 swarm 模式或者加入已存在的 swarm

2)Node

一個節點(node)是已加入到 swarm 的 Docker 引擎的例項 當部署應用到叢集,你將會提交服務定義到管理節點,接著 Manager

管理節點排程任務到 worker 節點,manager 節點還執行維護叢集的狀態的編排和群集管理功能,worker 節點接收並執行來自

manager 節點的任務。通常,manager 節點也可以是 worker 節點,worker 節點會報告當前狀態給 manager 節點

3)服務(Service)

服務是要在 worker 節點上要執行任務的定義,它在工作者節點上執行,當你建立服務的時,你需要指定容器映象

4)任務(Task)

任務是在 docekr 容器中執行的命令,Manager 節點根據指定數量的任務副本分配任務給 worker 節點

docker swarm:叢集管理,子命令有 init, join, leave, update。(docker swarm –help 檢視幫助)

docker service:服務建立,子命令有 create, inspect, update, remove, tasks。(docker service–help 檢視幫助)

docker node:節點管理,子命令有 accept, promote, demote, inspect, update, tasks, ls, rm。(docker node –help 檢視幫助)

node 是加入到 swarm 叢集中的一個 docker 引擎實體,可以在一臺物理機上執行多個 node,node 分為:manager nodes管理節點,worker nodes工作節點。

 一、系統環境

  1)伺服器環境

節點名稱 IP 作業系統 核心版本
manager 172.16.60.95 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-01 172.16.60.96 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-02 172.16.60.97 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-03 172.16.60.98 CentOs7 4.16.1-1.el7.elrepo.x86_64

  2)前提條件

  • Docker版本1.12+
  • 叢集節點之間保證TCP 2377、TCP/UDP 7946和UDP 4789埠通訊   

    TCP埠2377叢集管理埠

    TCP與UDP埠7946節點之間通訊埠

    TCP與UDP埠4789 overlay網路通訊埠

二、叢集部署

  1)master建立Swarm(要儲存初始化後token,因為在節點加入時要使用token作為通訊的金鑰)  

1 2 3 4 5 6 7 8 [[email protected] ~] # docker swarm init --advertise-addr 172.16.60.95 Swarm initialized: current node (kfi2r4dw6895z5yvhlbyzfck6)  is  now a manager.   To add a worker to this swarm, run the following command:        docker swarm join  - - token SWMTKN - 1 - 3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8 - 0mocmawzvm3xge6s37n5a48fw  172.16 . 60.95 : 2377   To add a manager to this swarm, run  'docker swarm join-token manager'  and  follow the instructions. 

  注:上面命令執行後,該機器自動加入到swarm叢集。這個會建立一個叢集token,獲取全球唯一的 token,作為叢集唯一標識。後續將其他節點加入叢集都會用到這個token值。 其中,--advertise-addr引數表示其它swarm中的worker節點使用此ip地址與manager聯絡。命令的輸出包含了其它節點如何加入叢集的命令。

  使用docker info 或者 docker node ls 檢視叢集中的相關資訊 

1 2 3 4 5 6 7 8 9 10 11 12 13 docker info   ....... Swarm: active   NodeID: kfi2r4dw6895z5yvhlbyzfck6   Is Manager: true   ClusterID: y2zgs373cg0y6559t675yexcj   Managers:  1   Nodes:  1   Orchestration:    Task History Retention Limit:  5   .......

  

  2)新增節點到swarm叢集中

  所有節點執行 

1 docker swarm join  - - token SWMTKN - 1 - 3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8 - 0mocmawzvm3xge6s37n5a48fw  172.16 . 60.95 : 2377

  在master上檢視叢集節點的狀態

  

   到此Swarm叢集就建立好了

  3)docker  node 命令 

複製程式碼
[[email protected] ~]# docker node --help

Usage:    docker node COMMAND

Manage Swarm nodes

Options:


Commands:
  demote      Demote one or more nodes from manager in the swarm
  inspect     Display detailed information on one or more nodes
  ls          List nodes in the swarm
  promote     Promote one or more nodes to manager in the swarm
  ps          List tasks running on one or more nodes, defaults to current node
  rm          Remove one or more nodes from the swarm
  update      Update a node


# demote
   將管理節點降級為普通節點
# inspect
    檢視節點的詳細資訊
# ls
   列出節點
# promote
   將普通節點升級為管理節點
# ps
   檢視執行的任務
# rm
   從swarm叢集中刪除節點
# update
   改變叢集節點狀態
複製程式碼 複製程式碼
[[email protected] ~]# docker node update --help

Usage:    docker node update [OPTIONS] NODE

Update a node

Options:
      --availability string   Availability of the node ("active"|"pause"|"drain")
      --label-add list        Add or update a node label (key=value)
      --label-rm list         Remove a node label if exists
      --role string           Role of the node ("worker"|"manager")


# 主要使用availability string

# active
    節點狀態正常
# pause
    節點掛起、暫停
# drain
    排除節點,比如將master節點排除,不分配任務,只作為管理節點
    
複製程式碼

 

三、在Swarm中部署服務

  1)建立服務 

複製程式碼
[[email protected] ~]# docker service --help

Usage:    docker service COMMAND

Manage services

Options:


Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated service
複製程式碼  
1 2 3 4 5 [[email protected] ~] # docker service create --replicas 1 --name hello busybox   #  --replicas : 副本集個數   # --name:服務名稱

  2)檢視服務資訊

1 2 3 [[email protected] ~] # docker service ls ID                   NAME                MODE                REPLICAS            IMAGE               PORTS kosznwn4ombx        hello               replicated           0 / 1                  busybox:latest

  從REPLICAS中能看出這個 hello服務並沒有啟動起來,0/1 表示 1計劃啟動的副本數,0實際啟動的數量。所以啟動失敗  

 

  

  3)新增引數

  在hello服務中busybox只是一個基礎映象,並沒有一個持續執行的任務,所以manager會不斷重啟hello這個服務,所以有好多shutdown的記錄。但是可以為其新增一個任務。 

1 2 3 4 5 6 7 8 9 10 [[email protected] ~] # docker service update --args "ping www.baidu.com" hello hello overall progress:  1  out of  1  tasks 1 / 1 : running   [ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >] verify: Service converged     # update:更新狀態   # --args:增加引數

  再次檢視狀態:

  

  過濾不正常的狀態: 

1 2 3 4 5 6 [[email protected] ~] # docker service ps -f "desired-state=running" hello ID                   NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS yxyivio4mzlg        hello. 1              busybox:latest      master              Running             Running  4  minutes ago      # -f "desired-state=running" : 狀態為runngin的服務

  4)為服務擴容(縮融)scale

  剛才設定的replicas=1,可以增加副本數量

1 2 3 4 5 6 7 8 9 10 11 12 [[email protected] ~] # docker service scale hello=4   hello scaled to  4 overall progress:  4  out of  4  tasks 1 / 4 : running   2 / 4 : running   3 / 4 : running   4 / 4 : running   verify: Service converged     # scale : 指定服務的數量

  

 

  5)工作節點排除manager,manager只作為管理節點

  上圖中manager也運行了一個服務,將manager排除在外

1 2 3 4 5 6 7 8 9 [[email protected] ~] # docker node update --availability drain manager   # node update : 更改節點狀態   # --availability : 三種狀態           active: 正常     pause:掛起     drain:排除

  排除manager後,其上面執行的服務會轉移到其他節點 

  

 

 四、滾動更新服務

  例如升級服務的映象版本 

1 2 3 4 5 6 7 8 9 10 [[email protected] ~] # docker service create \ - - replicas  3  \ - - name redis \ - - update - delay  10s  \ > redis: 3.0 . 6     # 啟動3個副本集的redis   # update-delay 10s :每個容器依次更新,間隔10s

  滾動更新:

1 2 3 docker service update  - - image redis: 3.0 . 7  redis   # --image : 指定版本

  更新完成後新版本和歷史記錄都能檢視

  

  檢視配置資訊:

  

 

 五、服務更新和回滾策略

  1)設定策略  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [[email protected] ~] # docker service create \ - - name my - web \ - - replicas  10  \ - - update - delay  10s  \ - - update - parallelism  2  \ - - update - failure - action  continue  \ - - rollback - parallelism  2  \ - - rollback - monitor  20s  \ - - rollback - max - failure - ratio  0.2  \ nginx: 1.12 . 1     # --update-parallelism 2  : 每次允許兩個服務一起更新   #--update-failure-action continue : 更新失敗後的動作是繼續   # --rollback-parallelism 2  :  回滾時允許兩個一起   # --rollback-monitor 20s  :回滾監控時間20s   # --rollback-max-failure-ratio 0.2 : 回滾失敗率20%

  如果執行後檢視狀態不是設定的,可以在update一下,將服務狀態設定為自己想要的

1 2 3 4 5 docker service update  - - rollback - monitor  20s   my - web   docker service update  - - rollback - max - failure - ratio  0.2  my - web   # 有兩個地方設定數值沒有成功,手動設定

  檢視狀態:

  

  

  2)服務更新

1 [[email protected] ~] # docker service update --image nginx:1.13.5 my-web

  和上述策略一致,兩兩更新

  

   更新完成:

  

  3)手動回滾(策略是失敗會回滾,現在沒有失敗)

  剛才nginx版本已經是1.13.5了,現在將其還原到1.12.1 

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

  

  手動回滾成功