Docker Swarm集群部署


一、系統環境

  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作為通訊的密鑰)  

[root@master ~]# 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 查看集群中的相關信息 

docker info 

.......
Swarm: active
 NodeID: kfi2r4dw6895z5yvhlbyzfck6
 Is Manager: true
 ClusterID: y2zgs373cg0y6559t675yexcj
 Managers: 1
 Nodes: 1
 Orchestration:
  Task History Retention Limit: 5

.......

  

  2)添加節點到swarm集群中

  所有節點執行 

docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377

  在master上查看集群節點的狀態

  

   到此Swarm集群就創建好了

  3)docker  node 命令 

[root@master ~]# 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
   改變集群節點狀態
docker node 命令
[root@master ~]# 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節點排除,不分配任務,只作為管理節點
    
node update命令

 

三、在Swarm中部署服務

  1)創建服務 

[root@master ~]# 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
docker service 
[root@master ~]# docker service create --replicas 1 --name hello busybox

#  --replicas : 副本集個數

# --name:服務名稱

  2)查看服務信息

[root@master ~]# 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的記錄。但是可以為其添加一個任務。 

[root@master ~]# 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:增加參數

  再次查看狀態:

  

  過濾不正常的狀態: 

[root@master ~]# 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,可以增加副本數量

[root@master ~]# 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排除在外

[root@manager ~]# docker node update --availability drain manager

# node update : 更改節點狀態

# --availability : 三種狀態
    
   active: 正常
   pause:掛起
   drain:排除

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

  

 

 四、滾動更新服務

  例如升級服務的鏡像版本 

[root@manager ~]# docker service create \
> --replicas 3 \
> --name redis \
> --update-delay 10s \
> redis:3.0.6


# 啟動3個副本集的redis

# update-delay 10s :每個容器依次更新,間隔10s

  滾動更新:

docker service update --image redis:3.0.7 redis

# --image : 指定版本

  更新完成后新版本和歷史記錄都能查看

  

  查看配置信息:

  

 

 五、服務更新和回滾策略

  1)設置策略  

[root@manager ~]# 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一下,將服務狀態設置為自己想要的

docker service update --rollback-monitor 20s  my-web

docker service update --rollback-max-failure-ratio 0.2 my-web

# 有兩個地方設置數值沒有成功,手動設置

  查看狀態:

  

  

  2)服務更新

[root@manager ~]# docker service update --image nginx:1.13.5 my-web

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

  

   更新完成:

  

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

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

[root@manager ~]# docker service update --rollback my-web

  

  手動回滾成功


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM