Docker swarm mode初探

    Docker從1.12引入了swarm模式,swarm mode用來管理集羣化的docker engines,被稱作swarm。可以使用docker CLI來創建swarm,給swarm上部署應用,管理swarm的行爲等等。。你可以創建一個集羣包含一個或者多個docker engines,這個被叫做swarm mode。一個swarm包含了多個node,node可以是物理機、虛擬機等等。node包含了兩個角色:managers、workers

manager node:

  1. 維護集羣狀態
  2. 調度服務
  3. 服務swarm模式下的HTTP API

    manager之間採用raft協議通訊,所以可以通過部署多臺managers建立manager的高可用,但是manager必須是奇數個

worker node:

  1.  work nodes就是docker engine實例,唯一的用途就是執行容器。你可以創建一個只有一個manager的swarm,但是不能創建一個只有一個node,確沒有manager的swarm集羣。

在部署一個app容器鏡像到docker的swarm模式的時候,一般是創建一個service。當你創建一個service的時候,你要指定那個鏡像會被使用,並且要在鏡像裏面執行上面命令,你也可以指定這個服務的一些其他選項:

  1. 在swarm模式下,這個service對外暴露的端口
  2. 一個overlay網絡用來連接到swarm下的其他service
  3. cpu和mem的使用配額限制
  4. 一個滾動升級策略
  5. 這個鏡像在運行時的副本個數

有兩種類型的service部署模式:replicated和global

  1. 在replicated service模式下,你可以指定該service你想有多少個task在運行,比如,你可以指定一個http服務有三個replicas,每個都提供相同的內容
  2. 在global service模式下,該service在每一個node上運行一個task,這裏不需要預先設定task的數量,任何時候只要你在集羣裏面加入新的node,調度系統都會在該新node上自動部署該服務,這種場景適合在機器上部署監控客戶端等等。

docker允許你創建service,service可以運行tasks,一個service是一個描述的最終狀態,task是工作的work,work通過swarm來調度到node節點上,服務創建使用的是下面的流程:

  1. 使用docker service create創建服務
  2. 請求到達Docker manager節點上
  3. Docker manager節點調度該請求運行到一個workers node上
  4. 每個service可以啓動多個tasks實例
  5. 每個tasks實例都有自己的生命週期

一個task會一直運行到它的任務完成,如果一個task停止了,該task是不會再次運行的。task會通過一系列狀態最終完成或者失敗,task一般有以下狀態:

  • NEW    初始化task
  • PENDING    阻塞狀態
  • ASSIGNED    分配到node狀態
  • ACCEPTED    被node接收狀態
  • PREPARING    準備狀態
  • STARTING    啓動狀態
  • RUNNING    運行狀態
  • COMPLETE    正常運行完畢狀態
  • FAILED    運行失敗狀態
  • SHUTDOWN    docker關閉該task狀態
  • REJECTED    work node拒絕該task狀態
  • ORPHANED    node節點宕機太長狀態
  • REMOVE

當你第一次安裝並啓動docker engine時,swarm模式是默認被禁止的。當swarm模式打開後,你可以通過swarm service來管理services,有兩種方式可以運行在swarm模式:

  • 創建一個新的swarm
  • 加入現有的swarm

docker engine創建swarm的流程:

  1. 交換當前node到swarm模式
  2. 創建一個名爲default的swarm
  3. 指定當前node爲當前swarm的leader manager
  4. 命名該node的名稱爲該主機名
  5. 配置manager監聽在本機的2377端口
  6. 設置當前node爲active狀態,這意味這該node可以接收集羣調度來的tasks
  7. 啓動一個內部的分佈式數據存儲系統
  8. 默認生成一個自簽名的CA證書
  9. 生成一個tokens,爲後面的worker和manager加入到該swarm
  10. 創建一個名爲ingress的overlay網絡,對外暴露swarm上的服務

    manager node使用advertise地址來接受其他node訪問Swarmkit API and overlay networking的請求,其他在swarm集羣中的node,必須可以訪問manager的advertise地址 ,如果你不指定advertise地址,docker會自動檢查系統是否有一個單ip地址,如果有,則監聽在該地址的2377端口。如果該系統有多個ip地址,你必須通過--advertise-addr來指定一個地址。

    新的node需要一個token才能加入現有swarm集羣,worker node使用的token不同於manager node使用的token,node只有使用join-token才能加入swarm,當Rotating join token的時候,是不會影響已經加入swarm集羣的node的,rotation token可以確保老的token不能被所有的新node使用來加入swarm集羣。

下面是swarm的一些關鍵點:

  1. 一個swarm包含了多個運行在swarm mode下的docker host,分別由manager和workers組成。manager來管理成員和授權,worker來運行swarm service。一個docker host可以是一個manager,也可以是一個worker,或者即是manager也是worker。還有一個大的優勢是,如果swarm service中的容器是standalone模式的,你可以在修改service的配置後(networks、volumes) 不用重啓service。docker會自動處理這些。
  2. 當一個docker host運行在swarm模式,你照樣可以運行standalone模式的容器,但是swarm只能管理swarm service。
  3. node 一個docer engine就是一個node,當你需要部署應用到swarm的時候,需要在manager node上提交部署作業,manager node會派遣task到worker node上。manager node也有編排功能。worker nodes接收並執行task。
  4. service 一個service是定義好的在worker node上執行的task,swarm系統是一箇中心結構的系統,當你定義好一個service的時候,你需要制定使用的鏡像以及在鏡像裏面執行的命令。 在replicated services模式下,swarm manager分配定義好的replica task的副本數量的task在worker node上 在global services模式下,swarm service只運行一個task在worker node上
  5. tasks 一個task包括一個docker容器和在容器裏面運行的命令。task會被swarm自動調度。manager分配task到worker上。一旦task被分配到一個node上,該task就不能移動到其他node上了,除非該node fail。
  6. Load balancing swarm使用 ingress load balancing,swarm manager可以設置一個PublishedPort給service,如果不指定PublishedPort,則是在30000-32767這個範圍內自動選擇。外部的請求,例如LB,可以通過PublishedPort來訪問服務,但是這個LB的服務必須在node集羣上,swarm集羣中的所有節點都會連接到正在運行的service上,而不論該node上是不是有運行該service服務。在swarm內部有一個DNS,可以自動的分片在swarm中每個service的entry,swarm manager使用內部LB來分發請求到集羣內部的service上

 

 

 

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