Docker Swarm + Harbor + Portainer 打造高可用,高伸縮,叢集自動化部署,更新。

Net碼畜發表於2023-09-22

Docker Swarm是Docker官方自帶的容器編排工具,Swarm,Compose,Machine合稱Docker三劍客。Docker Swarm對於中小型應用來說,還是比較方便,靈活,當然K8S對於大型專案在各方面有著明顯的優勢。技術選型需要針對公司實際情況選擇,架構往往是一步一步隨著業務變化升級演變而來,本文主要講解Docker Swarm + Harbor + Portainer 一套組合拳打法。

前置條件

安裝Docker:Docker 安裝,常用命令 - Net碼畜 - 部落格園 (cnblogs.com)

安裝Harbor:harbor 搭建和部署 - Net碼畜 - 部落格園 (cnblogs.com)

安裝Portainer:portainer安裝,配置,使用 - Net碼畜 - 部落格園 (cnblogs.com)

Docker Swarm 叢集

Docker Swarm 是 Docker 的叢集管理工具,Swarm叢集的節點分兩種:管理節點(manager node),工作節點(work node),兩者的主要區別是對叢集進行管理需要在管理節點上進行操作,包括叢集建立,配置,服務建立,配置等有關工作。除此之後兩者沒有區別,管理節點和工作節點一樣會執行contarner。

叢集初始化

首先我們準備一臺虛擬主機安裝docker,然後初始化叢集:

docker swarm init

此時當前虛擬機器就成功被始化為叢集管理節點,我們透過以下命令獲取加入叢集的程式碼,這命令僅能在管理節點上使用:

docker swarm join-token worker

命令執行完後,我們將得到類似:docker swarm join --token SWMTKN-1-4omm72rws6flf5icom3w1clqvjtkmwdki8m4hhtxobq3hzwsqe-7vjw75ebdue32yevwirggpk4l 192.168.3.70:2377 的結果,將command複製到其它虛擬機器(己安裝docker)執行,該虛擬機器將以工作節點(worker)的身份加入叢集。重複執行再新增三個工作節點,便可以得到上述截圖四臺虛擬機器組成的docker swarm 叢集。

至此docker swarm叢集搭建就完成了,是不是非常簡單方便。所以說針對中小型應用,docker swarm有著非常小的學習,管理的成本,很合適。下面貼出常用的docker swarm 叢集管理命令:

docker swarm init  //docker swarm init
docker swarm join-token worker //檢視加入woker的命令。
docker swarm join-token manager //檢視加入manager的命令
docker swarm join //加入叢集
docker swarm leave  //退出叢集

docker node ls //檢視叢集節點
docker node rm  //刪除某個節點(-f強制刪除)
docker node inspect //檢視節點詳情
docker node demote  //節點降級
docker node promote //節點升級
docker node update  //更新節點

叢集服務

建立叢集之後便是建立服務,也就是一個叢集可以包括多個服務,也就意味上可以在一個叢集上部署多個專案,建立服務的時候我們就不需要再對節點進行管理,節點的管理歸屬叢集管理。也就是說建立服務是基於當前叢集的節點進行部署,當你需要擴充套件節點的時候,需要先將節點加入叢集,然後再更新服務配置。

docker service create --name testweb --replicas 4 -p 80:80 webapplication2:latest

上面命令是建立一個名稱為:testweb的服務。replicas(副本數)為:4,我們叢集節點也剛好4個,就是說每一個節點都會有一個副本,假如replicas為2,那麼我們的叢集將有兩個節點部署副本,剩餘兩個節點閒置,當然我們也可以透過更新命令重置replicas數量。埠對映為80:80,映象及版本是webapplication2:latest。

至此服務也正式啟動了,無論我們從四個節點那個IP進行訪問,都是可以成功訪問到網站。

下面是管理服務常用的命令:

docker service create   //建立服務
docker service ls       //檢視所有服務
docker service inspect  //檢視詳情
docker service logs     //檢視服務日誌
docker service rm       //刪除服務
docker service scale    //設定服務副本數量
docker service update   //更新服務配置

Portainer管理

手動管理docker swarm叢集是有點繁瑣,以服務建立和更新映象為例,你需要事先在每個節點上面拉取最新的映象,docker swarm在建立服務或更新服務的時候不會主動從倉庫中拉取或更新映象,如果節點或服務多的時候就蛋痛了。一個良好的管理工具就事半功倍來解放你的雙手提高工作效率了。安裝好Portainer 之後我們配置接入管理docker swarm:

API 連線方式,需要配置遠端dcoker節點,dcoker管理節點編輯配置檔案,配置完之後,重啟一下docker。

vi /usr/lib/systemd/system/docker.service

管理節點重啟之後,Portainer 就可以透過API連線並且進行管理,可以看到連線的管理節點。

Portainer連線上之後可以輕鬆管理docker swarm,具體的細節自己摸索一下之後基本就可以拿捏了。簡單建立一個服務,填寫下面紅色框架必填值就可以快速預設值建立一個服務。

自行摸搜一下你會發現Portainer管理非常方便,無論是建立服務,更新映象,Portainer會自動幫你拉取最新映象然後更新,UI動動滑鼠就可以管理docker swarm叢集。

自部化部署

配合Harbor的Webhooks,我們可以實現推送映象之後實現自動化部署。我們建立服務的時候將上圖的綠色框開關開啟就支援Webhooks通知docker swarm叢集更新,當然這個是Portainer的功能而不是docker swarm自帶的功能。

我們進入事先部署的harbor系統,進入專案管理配置webhooks,配置成功之後就可以實現自動化部署了。

OK,我們簡單總結一下自動化部署流程,開發人員打包映象送到至倉庫,倉庫配置"Artifact pushed"事件,在這個事件中配置Webhooks地址,然後harbor會自動觸發提交這個地址通知至Portainer,Portainer開始執行更新叢集映象工作。docker swarm預設值在更新中會提斷不間斷服務,可以放心進行更新,也支援更新後回滾。

高可用

docker swarm實現高可用性機制來確保叢集的穩定性和可靠性。

  • Manager 節點高可用:Docker Swarm 叢集中有一個或多個 Swarm Manager 節點,它們協調叢集中的容器排程和管理。
  • 節點監測:Swarm Manager 定期監測叢集中的節點狀態。
  • 服務冗餘和複製:Docker Swarm 透過建立服務副本來提供容器的冗餘和高可用性。可以指定服務的副本數量,並將它們分佈在叢集的不同節點上。如果某個節點失效,Swarm Manager 會自動將該節點上的任務重新分配到其他可用節點上的副本。
  • 負載均衡:Docker Swarm 叢集可以透過內建的負載均衡機制來分發流量到執行在不同節點上的容器副本。這樣,即使某個節點失效,負載均衡機制仍然可以將流量轉發到其他節點上的容器副本,確保應用程式的連續可用性。
  • 故障恢復:如果一個節點失效並重新加入叢集,Swarm Manager 會自動將該節點重新納入叢集,並分配之前節點上的任務。這種故障恢復機制確保了叢集的穩定性和容錯性。

高伸縮

系統的伸縮性是指系統效能擴大或擴小的容易程度,一個高伸縮的系統可以輕易的擴充套件或減少叢集效能。

  1. Docker Swarm支援使用更新命令設定服務的副本數量來擴充套件副本,需要注意是當副本的數量>叢集節點的數量的時候,再增加副本數對服務的效能提升意義,應該增加叢集節點。
  2. Docker Swarm支援自動擴充套件副本數,可以設定基於CPU,記憶體等指標數的閾值來設定規則自動增加副本數。
  3. 當增加副本數無法有效擴充套件效能時,可以透過命令增加叢集節點,讓更多的機器加入叢集以增加叢集算力提高效能。

Docker Swarm + Harbor + Portainer 的組合拳基本簡單介紹完了,更多命令和細節自己去摸索吧~

相關文章