Docker Swarm

本文依照書籍(Docker企業應用實戰教程) 編寫

Docker Swarm

1. Basic Knowledge

1. Docker swarm 號稱三劍客中之一,Docker Swarm 是一個爲 IT 運維團隊提供集羣和調度能力的編排具。用戶可以把集羣中所有 Docker Engine 整合進一個「虛擬 Engine」的資源池,在靈活的調度策略下,IT 團隊可以更好地管理可用的主機資源,保證應用容器的高效運行。

2. Docker 1.12 Swarm mode 已經內嵌入 Docker 引擎,成爲了 docker 子命令 docker swarm。請注意與舊的 Docker Swarm 區分開來,

3.Swarm mode 內置 kv 存儲功能,提供了衆多的新特性,比如:具有容錯能力的去中心化設計、內置服務fa發現、負載均衡、路由網格、動態伸縮、滾動更新、安全傳輸等。使得 Docker 原生的 Swarm 集羣具備Mesos、Kubernetes競爭的實力。


2. Why Choose Swarm

Swarm 優勢:虛擬化,vmware

1.高性能: 經過測試,Swarm 可拓展性的極限是在 1000 個節點上運行 50000 個部署容器,每個容器的啓動時間爲亞秒級,同時性能無減損;

2.靈活的容器調度 :Swarm 幫助 IT 運維團隊在有限條件下將性能表現和資源利用最優化。Swarm 的內置調器(scheduler)支持多種過濾器,包括:節點標籤,親和性和多種容器部策略如 binpack、spread、random 等等。權重值:cpu 利用率、內存、存儲空間;

3.服務的可持續性 :Docker Swarm 由 Swarm Manager 提供高可用性,通過創建多個 Swarm master 節點制定主 master 節點宕機時的備選策略。如果一個 master 節點宕機,那麼一個 slave 節點就會被升格爲 master 節點,直到原來的 master 節點恢復正常;

4.和DockerAPI 及整合支持的兼容性 :Swarm 對 DockerAPI 完全支持,這意味着它能爲使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和UCP)的用戶提供無縫銜接的使用體驗;

綜上所述,Docker Swarm 提供了一套高可用 Docker 集羣管理的解決方案,完全支持標準的 DockerAPI,方便管理調度集羣 Docker 容器,合理充分利用集羣主機資源。


3. Swarm Framework

3.1 Framwork

圖1

Manager: 接收客戶端服務定義,將任務發送到 worker 節點;維護集羣期望狀態和集羣管理功能及 Leader 選舉。默認情況下 manager 節點也會運行任務,也可以配置只做管理任務。

Worker: 接收並執行從管理節點分配的任務,並報告任務當前狀態,以便管理節點維護每個服務期望狀態。

3.2 Swarm Characteristic

  1. Docker Swarm 採取集羣管理,統一部署
  2. 彈性伸縮:可以通過策略的方式隨意增加、刪減容器數量
  3. 多主機網絡:Swarm內置多主機網絡,實現多主機中的容器間互通。(overlay 網絡)
  4. 服務發現:可以通過 Swarm 內置的 DNS 服務器查詢集羣中每個運行的容器。
  5. 負載均衡:實現服務副本負載均衡,提供入口訪問。也可以將服務入口暴露給外部負載

均衡器再次負載均衡。Docker swarm

  1. 滾動更新:升級時,逐步將應用服務更新到節點,如果出現問題,可以將任務回滾到先

前版本

  1. 安全傳輸:Swarm 中的每個節點使用驗證方式加入集羣,確保安全的其他節點通信

3.3 Two Points

  1. 任務(Task) :任務是 Swarm 中最小的調度單位,目前來說就是單一的容器。
  2. 服務(Services) :服務是指一組任務的集合,服務定義了任務的屬性,服務有兩種模式
    1. replicated services (複製): 按照一定規則在各個工作節點上運行指定個數的任務
    2. global services: 每個工作節點上運行一個任務

兩種模式通過 docker service create 的 --mode 參數指定。下圖展示了容器、任務、服務的關係。

圖2


4. Swarm Combat

4.1 Prerequisite

  • Swarm 集羣由管理節點和工作節點組成
  • 集羣節點之間保證 TCP 2377、TCP/UDP 7946 和 UDP 4789 端口通信
    • 2377 (TCP) – 集羣管理
    • 7496 (TCP 與 UDP) – 節點通信
    • 4789 (TCP 與 UDP) – 覆蓋網絡流量(overlay)

4.2 Combat

4.2.1 swarm init

##1. 管理節點初始化
    docker swarm init  --advertise-addr string (format:<ip|interface[:port])

##2. 工作節點加入swarm
    docker swarm join —token 令牌環

## 3.查看docker swarm 節點
    docker node  ls

4.2.2 join-token

##1. 查看swarm worker 的連接令牌
- docker swarm join-token worker

## 2. 查看swarm manager 的連接令牌
- docker swarm join-token manager

## 3.使舊令牌無效並生成新令牌
- docker swarm  join-token --rotate

4.2.3 deploy services && common commands

    1. 命令
    • docker service --help
    • docker service create --help
    1. 創建服服
    • docker service create—replicas 2 --name test1 wordpress:latest
    • replicas 參數是指運行實例個數
    1. 查看容器
    • docker service ps test1
    1. 刪除服務
    • docker service rm test1
    1. 查看服務詳細信息

      docker service inspect —pretty test1

    1. 容器的彈性擴大與縮減
    • docker service scale test1=3
    • docker service scale test1=1
    1. 查看日誌
    • docker service logs test1
    1. 查看服務任務
    • docker service ps --filter desired-state=[accepted | running | shutdown] test1
  • 滾動更新服務

    • docker service update --image nginx:1.14 test1

    • docker service ps test1

    • docker service ps --filter desired-state=shutdown test1

4.3 Update Strategy

--update-delay duration Delay between updates (ns\ us\ ms\ s\ m\ h) 更新之間的延遲(ns / us / ms / s / m / h)(默認爲0)
--update-failure-action string Action on update failure ("pause"|"continue"|"rollback") 更新失敗的動作(暫停/繼續),默認暫停
--update-max-failure-ratio float Failure rate to tolerate during an update 更新期間容忍的故障率
--update-monitor duration Duration after each task update to monitor for failure (ns|us|ms|s|m|h) 每次更新任務後的持續時間以監控故障(ns / us / ms / s / m / h)(默認爲0)
--update-order string Update order ("start-first"|"stop-first") 默認 stop-first
--update-parallelism uint Maximum number of tasks updated simultaneously (0 to update all at once) 同時更新的最大任務數(0表示一次更新所有任務),默認是一個

4.3.1 啓動服務時設定更新策略

docker service  create  --name my_web1 --replicas 10 --update-delay 10s --update-parallelism 2 --update-failure-action continue  nginx:1.12

4.3.2 啓動服務時設定回滾策略

docker service create --name my_web2 --replicas 10 --rollback-parallelism 2 --rollback-monitor 20s --rollback-max-failure-ratio 2 nginx:1.12

4.3.3 服務更新

docker service  update  --image  nginx:1.13 my_web1

4.3.4 服務回滾

docker service  rollback my_web1

4.3.5 指定節點更新

指定service的某個節點排滿狀態此後,將不會再在 worker1 上面分派任務

  • $ docker node update --availability drain(耗盡、排滿) worker1【節點名稱】

  • $ docker node update --availability active(啓用,恢復) worker1【節點名稱】

4.36 指定服務約束(—constraint)

可以通過定義約束表達式來限制可用於任務調度的節點。多個約束查找節點時,需要滿足每個表達式(AND匹配)。約束 可以匹配節點或docker engine的lables,如下:

節點屬性 匹配 示例
node.id 節點 ID node.id == 2ivku8v2gvtg4
node.hostname 節點 hostname node.hostname != node02
node.role 節點 角色: manager node.role == manager
node.labels 用戶自定義節點labels node.labels.security == high
engine.labels Docker Engine labels engine.labels.operatingsystem == ubuntu 14.04
engine.lables 匹配docker engine 的lables,如操作系統,驅動等。集羣管理員通過使用docker node update命令來添加node.labels以更好使用節點。

​ 指定容器限定在哪個節點

    docker service create --constraint 'node.hostname==docker' --name website website:7.7 

5. NetWork

5.1 Basic Knowledge

5.1.1 作用(Effect)

    1. 不同主機間的容器互連
    1. 容器間網絡隔離

5.1.2 產生兩種不同流量原因

    1. 控制和管理計劃流量:這包括羣集管理消息,例如請求加入或離開羣集。這個流量總是加密的。
  • 2.應用程序數據流量:這包括來自外部客戶端的集裝箱運輸和流量。
    讓不同主機之上的運行的容器彼此實現對接,惟一的方式就是使用覆蓋網絡。大家可將其視爲一套構建於另一網絡(在本示例中爲物理主機網絡)之上的容器網絡。Docker Swarm 模式提供一套默認覆蓋網絡,其負責配合 libnetwork 與 libkv 實現一套基於VxLAN 的解決方案。當然,大家也可以選擇 Flannel、Calico 或者 Weave 等其它覆蓋網絡驅動方案,但需要執行額外的安裝步驟
    在 Docker Engine Swarm 模式當中,*大家可以單純立足管理節點創建一套覆蓋網絡,,而且其不需要 etcd、consul 或者 Zookeeper 等額外的鍵值存儲機制。

5.2 Network Concept

    1. Overlay networks: 管理參與集羣的Docker守護進程之間的通信。你可以創建 overlay networks,就像用戶定義的獨立容器網絡一樣。您可以將服務附加到一個或多個現有的覆蓋網絡,啓用service - to - service溝通。Overlay networks 是使用Overlay networks驅動程序的Docker網絡
    1. ingress(進入、入口) network:是一種特殊的覆蓋網絡,它有助於在服務節點之間實現負載平衡。當任何羣集節點接收已發佈端口上的請求時。它將請求發送給一個名爲IPVS的模塊。IPVS跟蹤參與該服務的所有IP地址,選擇其中一個,並將請求路由到它,over the ingress network。當您初始化或加入一個集羣時,ingress網絡會自動創建。大多數用戶不需要定製它的配置,但是Docker 17.05和更高版本允許您這樣做。
    1. docker_gwbridge:是一個bridge network連接Overlay networks (includingthe ingress network)對於單個Docker守護進程的物理網絡,默下,一個服務正在運行的每個容器都連接到它的本地Docker守護進程主機的docker_gwbridge網絡。docker_gwbridge網絡是在初始化或加入集羣時自動創建的。大多數用戶不需要定製它的配置,但是Docker允許您這樣做配置。

5.3 Network Deploy Combat

5.3.1 overlay network setup

- 1. docker network  create  --driver  overlay  --scope swarm  --subnet 172.17.0.0/24  --ip-range 172.17.0.0/24 --gateway 172.17.0.1 my_net

- 2. docker network  inspect  my_net 

5.3.2 use overlay network

-1. 使用my_net網絡創建服務
    - docker service  create  --name my_net --network my_net --replicas 5 --update-delay 10s --update-failure-action rollback --update-parallelism 2  --rollback-parallelism .2 --rollback-monitor 20s --rollback-max-failure-ratio 2 wordpress:latest

-2. 查看VIP
    - docker service  inspect  my_net

-3. 查看每個容器的IP,然後測試ping

-4. 將網絡更新到已存在的服務中
    - docker service  create  --name my_test --replicas 2 wordpress:latest
    - docker service  update --network-add  my_net my_test 
    - docker service  inspect my_test

5.4 Load Balancing

5.4.1 概述(summary)

  • Swarm 模式內置 DNS 組件,可以自動爲集羣中的每個服務分配 DNS 記錄。Swarmmanager 使用內部負載均衡,根據服務的 DNS 名稱在集羣內的服務之間分發請求。
  • Swarm manager 使用 ingress load blancing 暴露你想從外部訪問集羣提供的服務。Swarm manager 自動爲服務分配一個範圍 30000-32767 端口的 Published Port,也可以爲該服務指定一個 Published Port。
  • ingress network 是一個特殊的 overlay 網絡,便於服務的節點直接負載均衡。當任何swarm 節點在已發佈的端口上接收到請求時,它將該請求轉發給調用的 IPVS 模塊,IPVS跟蹤參與該服務的所有容器 IP 地址,選擇其中一個,並通過 ingress network 將請求路由給它。

    5.4.2 swarm 網絡負載方式

    **1. vip 同 dnsrr 兩個的區別在於 VIP 在進行 IP 輪詢方式的時候,也可以進行端口查找,dnsrr 只能進行 ip 輪詢。**
    
    **2. DNS負載均衡與vip負載不一樣,它主要依賴的用戶自定義的overlay網絡,例如本實驗中的mysql如何確定是創建支持dns或者是vip方式的負載均衡服務,主要是由參數--endpoint-mode決定,例如:**
## dns方式是不允許有-p這個參數的,同時vip是默認模式,所以創建VIP類型,也可以不加--endpoint-mode參數。
- 1.dns
    - docker service  create --name nginx --network my_net --replicas 3 --endpoint-mode=dnsrr  nginx:1.12

- 2.vip
    - docker service  create  --name lnmp --network my_net  --replicas 4 -p 80:80  --endpoint-mode vip richarvey/nginx-php-fpm
- 3.獲取VIP
    - docker service inspect -f '{{json .Endpoint.VirtualIPs}}' [服務名稱]
    - docker service inspect -f '{{json .Endpoint.VirtualIPs}}' lnmp

6. Docker Swarm 數據持久化

6.1 Summary

swarm集羣中我們可以創建本地卷或者全局捲來掛載到容器用來保存數據

  1. 全局卷可以被掛載在swarm集羣的任意節點, 所以不管你的服務容器啓動在哪個節點, 都可以訪問到數據. 不過docker目前還沒有默認的全局卷驅動支持, 你可以安裝一些插件驅動來實現全局卷例如Flocker, Portworx等.
  2. 本地卷就只存在與某個節點本地的一個掛載卷
  3. 使用 NFS 共享存儲作爲數據卷

6.2 Volume 類型

6.2.1 創建數據卷

Docker volume create my-volumes

####6.2.2 將本地目錄掛載至服務中

- 1. 讀寫掛載
    - docker service create --name my-volume –mount type=volume,src=my-volumes,dst=/root/my-volume --network my-net --replicas 2 wordpress:latest
- 2. 只讀掛載
    - docker service create --name my-volume –mount type=volume,src=my-volumes,dst=/root/my-volume,readonly --network my-net --replicas 2 wordpress:latest   (只讀權限)

6.2.3 查看數據卷詳細信息

docker volume inspect <VOLUME-NAME>


6.3 Bind 類型

-1. 讀寫掛載 local node
    - docker service create --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH> --name myservice <IMAGE>
- 2.只讀掛載
    - docker service create --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH>,readonly --name myservice <IMAGE>
- 3.案例
    - docker service create --name bind --mount type=bind,src=/root/db_data,dst=/root/db_data,readonly --network mynet --replicas 2 wordpress:latest

6.4 爲原有的服務添加 volume 卷

docker service update my-volume --mount-add type=volume,source=data,target=/var/lib/data

7. Docker swarm 管理節點高可用

7.1 Framwork

圖3

爲了利用 swarm 模式的容錯功能,應保持集羣中奇數管理員來支持manager 節點故障。當 leader 故障時,會選舉新的 leader.

7.2 方案(programme)

- 1. manager 節點數必須是奇數
- 2. 三臺服務器,分別是one.firstleap.cn;two.firstleap.cn;three.firstleap.cn
- 3.假設已經把one.firstleap.cn設置爲 Leader, 那麼執行以下兩行命令即可
    - 1. docker node promote two.firstleap.cn
    - 2. docker node promote three.firstleap.cn
- 4. 節點降級,將three移出管理節點
    - docker node demote three.firstleap.cn

8. 配置文件存儲

  1. 生成一個Nginx的配置文件
site.conf
server {
listen 80;
server_name localhost; location / {
root /usr/share/nginx/html; index index.html index.htm; }
}
  1. 將 site.conf 保存到 docker 配置 中

    1. docker config create site.conf site.conf
    2. docker config ls
  2. 創建 一個 Nginx 並應用這個配置

    docker service create --name nginx --config site.conf --publish 8080:80 nginx:latest
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章