Docker Swarm 是 Docker 公司的 Docker 編配引擎,最早是在 2014 年 12 月發佈。Docker Swarm 目的即管理多台節點的 Docker 上應用程式與節點資源的排程等,並提供標準的 Docker API 介面當作前端存取入口,因此可以跟現有 Docker 工具與函式庫進行整合,本篇將介紹簡單的建立 Swarm cluster。
Docker Swarm 具備了以下幾個特性:
- Docker engine 原生支援。(Docker 1.12+)。
- 去中心化設計。
- 宣告式服務模型(Declarative Service Model)。
- 服務可擴展與容錯。
- 可協調預期狀態與實際狀態的一致性。
- 多種網路支援。
- 提供服務發現、負載平衡與安全策略。
- 支援滾動升級(Rolling Update)。
基本架構
Docker Swarm 具備基本叢集功能,能讓多個 Docker 組合成一個群組,來提供容器服務。Docker 採用標準 Docker API 來管理容器的生命週期,而 Swarm 最主要核心是處理容器如何選擇一台主機來啟動容器這件事。以下為 Docker Swarm 架構:Docker Swarm 一般分為兩個角色Manager與Worker,兩者主要工作如下:
- Manager: 主要負責排程 Task,Task 可以表示為 Swarm 節點中的 Node 上啟動的容器。同時還負責編配容器與叢集管理功能,簡單說就是 Manager 具備管理 Node 的工作,除了以上外,Manager 還會維護叢集狀態。另外 Manager 也具備 Worker 的功能,當然也可以設定只做管理 Node 的職務。
- Worker: Worker 主要接收來自 Manager 的 Task 指派,並依據指派內容啟動 Docker 容器服務,並在完成後向 Manager 匯報 Task 執行狀態。
預先準備資訊
本教學將以下列節點數與規格來進行部署 Kubernetes 叢集,作業系統可採用Ubuntu 16.x與CentOS 7.x:IP Address | Role | CPU | Memory |
172.16.35.12 | manager | 1 | 2G |
172.16.35.10 | node1 | 1 | 2G |
172.16.35.11 | node2 | 1 | 2G |
這邊 Manager 為主要控制節點,node 為應用程式工作節點。首先安裝前要確認以下幾項都已將準備完成:
- 所有節點彼此網路互通,並且不需要 SSH 密碼即可登入。
- 所有防火牆與 SELinux 已關閉。如 CentOS:
$ systemctl stop firewalld && systemctl disable firewalld $ setenforce 0
- 所有節點需要設定/etc/host解析到所有主機。
- 所有節點需要安裝Docker引擎,安裝方式如下:
$ curl -fsSL "https://get.docker.com/" | sh
不管是在 Ubuntu 或 CentOS 都只需要執行該指令就會自動安裝最新版 Docker。 CentOS 安裝完成後,需要再執行以下指令:
$ systemctl enable docker && systemctl start docker
Manager 節點建置
當我們完成安裝 Docker Engine 後,就可以透過 Docker 指令來初始化 Manager 節點:$ docker swarm init --advertise-addr 172.16.35.12 Swarm initialized: current node (olluuvvz340ze64zhjpw03uke) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0q0ohnexs40lb9z4kmvqb6zcrmp22hul9tmh6zpfztxzv5cv61-73yubitun1ufm0yhwx7h38p85 172.16.35.12:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
當看到上述內容,表示 Manager 初始化完成,這時候可以透過以下指令檢查:
$ docker info $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS olluuvvz340ze64zhjpw03uke * manager Ready Active Leader
接著建立 Docker swarm network 來提供容器跨節點的溝通:
# Deploy network $ docker network create --driver=overlay --attachable cnblogs # Docker flow proxy network $ docker network create --driver overlay proxy
檢查 Docker 網路狀態:
$ docker network ls | grep swarm NETWORK ID NAME DRIVER SCOPE 57nq0rux7akh cnblogs overlay swarm ihyg6uixeiov ingress overlay swarm b8vqturisod8 proxy overlay swarm
Worker 節點建置
完成 Manager 初始化後,就可以透過以下指令來將節點加入叢集:$ docker swarm join --token SWMTKN-1-0q0ohnexs40lb9z4kmvqb6zcrmp22hul9tmh6zpfztxzv5cv61-73yubitun1ufm0yhwx7h38p85 172.16.35.12:2377 This node joined a swarm as a worker.
P.S. 其他節點一樣請用上述指令加入。在Manager節點,查看節點狀態:
$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS cwkta4o37daxed3otrqab9zdq node2 Ready Active olluuvvz340ze64zhjpw03uke * manager Ready Active Leader sfs49249kv8mad2qzr4ev4fy0 node1 Ready Active
(option)將節點改為 Manager:
$ docker node promote
另外降級為docker node demote <hostname> 。
透過指令建立簡單服務
要建立 Docker 服務,可以使用docker service指令來達成,如下指令:$ docker service create --replicas 1 --name ping alpine ping 8.8.8.8 $ docker service logs ping ping.1.auqefe3iq9yk@node2 | PING 8.8.8.8 (8.8.8.8): 56 data bytes ping.1.auqefe3iq9yk@node2 | 64 bytes from 8.8.8.8: seq=0 ttl=61 time=7.042 ms ping.1.auqefe3iq9yk@node2 | 64 bytes from 8.8.8.8: seq=1 ttl=61 time=7.029 ms ping.1.auqefe3iq9yk@node2 | 64 bytes from 8.8.8.8: seq=2 ttl=61 time=7.668 m ...
建立兩份副本數的應用,如以下指令:
$ docker service create --replicas 2 --name redis redis $ docker service ps redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ngtegx9vk4gu redis.1 redis:latest node1 Running Running 43 seconds ago n95vu3dzewu7 redis.2 redis:latest manager Running Running 44 seconds ago
完成後,想要刪除可以使用以下指令:
$ docker service rm ping $ docker service rm redis
部署簡單的 Stack
這邊利用簡單範例來部署應用程式於 Swarm 叢集中,首先新增stack.yml檔案,並加入以下內容:version: '3.2' services: api: image: open-api:latest deploy: replicas: 2 update_config: delay: 5s labels: - com.df.notify=true - com.df.distribute=true - com.df.serviceDomain=api.cnblogs.com - com.df.port=80 networks: - cnblogs - proxy networks: cnblogs: external: true proxy: external: true
完成後,透過以下指令來進行部署:
$ docker stack deploy -c stack.yml openapi
沒有留言:
張貼留言