Docker 集羣之(swarm)

什麼是 Docker 集羣?

Swarm 將一個或多個 Docker 【節點】組織起來,使得用戶能夠以集羣方式管理它們;

  • 這些節點可以是物理服務器、虛擬機、樹莓派(Raspberry Pi)或雲實例;
  • 節點會被配置爲管理節點(Manager)或工作節點(Worker)。
  1. 管理節點負責集羣控制面(Control Plane),進行諸如監控集羣狀態、分發任務至工作節點等操作。
  2. 工作節點接收來自管理節點的任務並執行。

【集羣搭建的注意事項】

  • 安全性:要求所有節點通過可靠的網絡相連;搭建 Swarm 集羣時將不可避免地使用 TLS(安全傳輸層協議),因爲它被 Swarm 緊密集成。在安全意識日盛的今天,這樣的工具值得大力推廣。Swarm 使用 TLS 進行通信加密、節點認證和角色授權。自動密鑰輪換(Automatic Key Rotation)更是錦上添花!其在後臺默默進行,用戶甚至感知不到這一功能的存在。

 

爲什麼要使用 Docker 集羣?

docker 在單機(單節點)環節下面,部署兩個容器分別是 nginx 和 netcore ,假如 docker 主機宕機,意味着其上面的容器服務也隨之不可用,再從客戶端角度看,客戶端的訪問數量是不確定性的,隨時都可能增多,而相對於單節點的 docker 主機,提供服務的負載能力也有上限,不能滿足高併發場景,最終導致容器服務不可用,總結爲以下兩點:

  1. 單節點 docker 主機不能提供服務的高可用性;
  2. 單節點 docker 主機不能滿足高併發服務訪問;

針對以上面臨的問題,因此需要對單節點 docker 主機進行集羣,集羣展示如下:

 

docker 集羣解決的問題(提供服務的高可用):

  1. 提高併發量;
  2. 解決單點故障問題;

【swarm 如何管理 docker 集羣】

 以上環節中,docker swarm 通過角色(manager-worker)配置實現 docker 主機集羣,同樣管理節點(manager)也可以多個節點集羣。

  • manager :
  1. 集羣配置;
  2. 容器服務管理;
  3. 負載均衡;
  4. 集羣其他配置;
  • worker:
  1. 提供容器服務

類似 redis 中的主(mastere)從(slaver)配置;

 

Docker Swarm 集羣工具

  • Swarm 是 Dcoker 官方提供的一款集羣管理工具,其主要作用是把若干臺 Docker 主機抽象爲一個整體,並且通過一個入口統一管理這些 Docker 主機上的各種 Docker 資源;
  • Swarm 和 Kubernetes 比較類似,但是更加輕,具有的功能也較 kubernetes 更少一些;
  • Docker Swarm 包含兩方面:1.企業級的 Docker 安全集羣 & 2.微服務應用編排引擎;
  • Swarm 的配置和狀態信息保存在一套位於所有管理節點上的分佈式 etcd 數據庫中。該數據庫運行於內存中,並保持數據的最新狀態。關於該數據庫最棒的是,它幾乎不需要任何配置,作爲 Swarm 的一部分被安裝,無須管理;
  • Swarm 默認內置有加密的分佈式集羣存儲(encrypted distributed cluster store)、加密網絡(Encrypted Network)、公用TLS(Mutual TLS)、安全集羣接入令牌 Secure Cluster Join Token)以及一套簡化數字證書管理的 PKI(Public Key Infrastructure)。我們可以自如地添加或刪除節點;
  • Swarm 提供了一套豐富的 API 使得部署和管理複雜的微服務應用變得更加方便。通過將應用定義在聲明式配置文件中,就可以使用原生的 Docker 命令完成部署。甚至還可以執行滾動升級、回滾以及擴縮容操作;

關於應用編排,Swarm 中的最小調度單元是服務;它是隨 Swarm 引入的,在 API 中是一個新的對象元素,它基於容器封裝了一些高級特性,是一個更高層次的概念。當容器被封裝在一個服務中時,我們稱之爲一個任務或一個副本,服務中增加了諸如擴縮容、滾動升級以及簡單回滾等特性。

 

如何搭建 Docker 集羣?

通過service,task,stack去配置容器;

  • service =》docker 不同主機(工作節點)容器的集合;
  • task =》供 service 啓動集羣環境容器;
  • stack =》多個 service 的集合;

docker 集羣準備:

  1. 兩臺雲主機或VM,分別安裝docker;
  2. docker-swarm;

備註:在哪裏操作哪個就是管理節點,所有操作只需在管理節點處理,工作節點無需擔心;

上面我們對docker集羣的原理做了簡單的介紹,接下來我們實踐操作,【docker-swarm】集羣的搭建過程;

【Swarm集羣搭建過程】

  • 初始化一個集羣工作節點 =》docker swarm init --advertise-addr [localhost] 默認爲管理節點,
  • 如果該節點已經存在,刪除節點 =》docker swarm leave -f 

  • 另外一臺docker主機加入集羣節點(work工作節點)

  • 查看節點詳細列表信息 =》docker --info

【集羣環境中如何配置services(容器)集合】

  • 鏡像倉庫準備所需的部署的鏡像,比如:nginx 和 netcore

  • 創建service =》docker service create --replicas 1 --name netcoreservice 參數 --replicas 指定集羣數量,--name 爲service取名;

  • 查看【rmcoreservice】在哪個 docker 主機節點運行 =》docker service ps rmcoreservice

  • 查看容器列表信息 =》docker container ls -a

  • 刪除rmcoreservice服務 =》docker service rm rmcoreservice

 備註:所有service的操作,全在管理節點操作,管理節點刪除service 集羣的工作節點也隨之刪除,證明:在worker工作節點查看 service 列表=》docker serice ls 工作節點無權操作,顯示如下:

  • 從鏡像 rmcore 創建服務,指定兩個工作節點,並暴露服務端口(映射) =》docker service create --replicas 2 --name rmcoreservice --publish 6066:80 rmcore

【集羣中 stack 創建兩個 service】

 【deploy可選參數配置詳解】

endpoint_mode:訪問集羣服務的方式。
	endpoint_mode: vip 
	# Docker 集羣服務一個對外的虛擬 ip。所有的請求都會通過這個虛擬 ip 到達集羣服務內部的機器。
	endpoint_mode: dnsrr
	# DNS 輪詢(DNSRR)。所有的請求會自動輪詢獲取到集羣 ip 列表中的一個 ip 地址。
labels:在服務上設置標籤。可以用容器上的 labels(跟 deploy 同級的配置) 覆蓋 deploy 下的 labels。

mode:指定服務提供的模式。
	replicated:複製服務,複製指定服務到集羣的機器上。
    global:全局服務,服務將部署至集羣的每個節點。	
replicas:mode 爲 replicated 時,需要使用此參數配置具體運行的節點數量。

resources:配置服務器資源使用的限制,例如上例子,配置 redis 集羣運行需要的 cpu 的百分比 和 內存的佔用。避免佔用資源過高出現異常。

restart_policy:配置如何在退出容器時重新啓動容器。

condition:可選 none,on-failure 或者 any(默認值:any)。
	delay:設置多久之後重啓(默認值:0)。
	max_attempts:嘗試重新啓動容器的次數,超出次數,則不再嘗試(默認值:一直重試)。
	window:設置容器重啓超時時間(默認值:0)。
	rollback_config:配置在更新失敗的情況下應如何回滾服務。

parallelism:一次要回滾的容器數。如果設置爲0,則所有容器將同時回滾。
	delay:每個容器組回滾之間等待的時間(默認爲0s)。
	failure_action:如果回滾失敗,該怎麼辦。其中一個 continue 或者 pause(默認pause)。
	monitor:每個容器更新後,持續觀察是否失敗了的時間 (ns|us|ms|s|m|h)(默認爲0s)。
	max_failure_ratio:在回滾期間可以容忍的故障率(默認爲0)。
	order:回滾期間的操作順序。其中一個 stop-first(串行回滾),或者 start-first(並行回滾)(默認 stop-first )。
	update_config:配置應如何更新服務,對於配置滾動更新很有用。

parallelism:一次更新的容器數。
	delay:在更新一組容器之間等待的時間。
	failure_action:如果更新失敗,該怎麼辦。其中一個 continue,rollback 或者pause (默認:pause)。
	monitor:每個容器更新後,持續觀察是否失敗了的時間 (ns|us|ms|s|m|h)(默認爲0s)。
	max_failure_ratio:在更新過程中可以容忍的故障率。
	order:回滾期間的操作順序。其中一個 stop-first(串行回滾),或者 start-first(並行回滾)(默認stop-first)
  • 管理節點創建 stack 目錄 =》mkdir stack
  • 查看當前目錄列表,切換到 compose

  • 如果管理節點不存在 docker-compose.yml 文件就創建一個 =》 vi docker-compose.yml 創建文件並且進入編輯

  • 管理節點的 stack 目錄中創建的 docker-compose.yml 文件配置編輯信息如下:

  • Stack 命令 =》docker stack --help

  • 通過 docker-compose.yml 中的 deploy 配置信息,使用 stack 管理命令啓動 =》docker stack deploy -c docker-compose.yml rmstack 創建的stack標識爲rmstack
  • 查看 stack 創建的列表目錄信息 =》docker stack ls

  • 查看 stack 中創建的 service =》docker service ls 創建的服務 rmstack_nginx, rmstack_rmcore

  • 再次查看容器列表目錄 =》docker container ls

以上過程就完成 stack 的集羣配置;

  • 刪除 stack 配置 =》docker stack rm rmstack

 備註:管理節點創建和刪除集羣操作,工作節點也隨之刪除。

【docker-swarm命令集合】

  • 查看 swarm 工具管理命令  =》docker swarm --help
指令 說明
ca 顯示CA證書
init 初始化swarm 集羣,並創建管理節點
join 將其他docker節點加入集羣,創建工作節點,被管理節點管理
join-token 將其他docker節點加入集羣,創建工作節點,被管理節點管理[這個是管理節點令牌]
leave 離開集羣
unlock 打開集羣
unlock-key 管理解鎖鍵key
update 更新羣集羣

 

【swarm缺陷】

  1. 無法監控某一個docker節點(主機)=》解決方案 k8s
  2. 安裝docker主機耗時;每安一次OS環境都需要對應的配置一次docker主機,比如:10臺linux系統,需要安裝10個docker主機 =》docker-machine(關鍵),參考:https://www.cnblogs.com/sparkdev/p/7066789.html
  3. 集羣容器如何做數據持久化? =》volums 數據卷(關鍵)
  4. 當service的work節點容器宕機,無法監控和感知;

 針對以上【swarm缺陷】的解決方案 =》【k8s/Kubermetes】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章