解讀docker swarm能力,實戰演練Docker Swarm集羣編排

背景

    以前寫過<<docker-compose真香>> 和《docker-compose、docker stack前世此生》兩篇博客, 回顧一下思路:html

① docker-compose是docker引擎頂層的容器編排工具(Python實現),須要單獨安裝; docker stack 是docker引擎原生支持的容器編排技術(Go實現)node

② 二者都支持最新docker-compose.yml 版本3容器編排文件,部分指令有差別。nginx

③ docker-compose 能現場Build鏡像,更適用於開發、測試時候單機迭代部署;docker stack須預先準備鏡像,具有生產環境諸多特性。web

昨天docker-compose編排的單機多容器忽然崩潰,爲提升項目服務可用性評價值(SLA), 決心切換到docker stack生產部署。docker

Docker Swarm優點

Docker Swarm is native clustering for Docker. It turns a pool of Docker hosts into a single, virtual Docker host.json

Docker Swarm是Docker平臺原生內置的集羣編排技術,它將Docker主機池變成了 單個虛擬主機。網絡

有不少理由促使你採用容器集羣解決方案。隨着應用程序的增加,將面臨新的強制要求:例如可伸縮性,可管理性和高可用性。架構

Docker Swarm 直接優點:app

  1. Native  Clustering負載均衡

  2. Production Grade

  3. Work out of the box

  4. Easy to setup and use

  5. Active Community

高可用支撐生產業務

  Stack、Service、Container 金字塔模型定義了一個完整的生產應用架構:

  • task是Docker Swarm中最小部署單位,task與容器Container是一對一的關係
  • service是一個或一組容器在生產環境的預期狀態(也可說是一組task的集合),在Worker節點上執行;有兩種模式(對應下面docker-stack.yml-deploy-mode配置節)

    • (默認)replicated: 指定容器數量
    • global: 每一個節點一個容器(容器數量由可用節點決定) 
  • stack 是一組服務,協做支撐整個業務

部署策略

  還支持 副本集、滾動更新、更新和回滾策略,以上配置均可以在docker-compose.yml 版本3官方文檔找到對應的配置字段:

deploy:
  endpoint_mode: 服務發現的方式: vip,dnsrr
 labels: 爲服務指定的標籤
 mode:replicated (指定數量的容器)   global(每一個節點一個容器)
 replicas: 實例數量
 resources: 配置資源
 restart_policy:  重啓策略
 update_config:  服務更新策略
   parallelism: 同時更新容器數量
   delay: 容器組更新的間隔時間
   failure_action:  更新失敗的操做:continue、rollbak,pause(默認)
   monitor: 監視更新失敗的等待時間
   max_failure_ratio: 更新的失敗容錯率
   order:操做策略:stop-first(先中止某容器,再建立新容器)、start-first (先建立新容器,因此會與即將消滅的容器有時間重疊)
  rollback_config: 回滾策略
    ...同上...

集羣多節點部署

  Docker Swarm在以多主機模型支撐業務,對於開發者/部署者來講, 一個節點或多節點部署的配置流程是相似的。

  有兩種形式節點: managers,workers

managers節點

  • 維護集羣狀態  

使用Raft協議保持集羣內部一致性;

測試目的,可使用單個manager運行swarm;(單manager fail, 服務繼續運行)

  • 調度服務
  • 支撐swarm mode  HTTP endpoints

workers節點

      workers節點的惟一目的是執行容器,workers節點不參與Raft distributed state, make scheduling decisions, or serve the swarm mode HTTP API.

能夠建立只有一個manager的羣集,可是若是沒有一個manager節點,則不可能有一個工做節點。

默認狀況下,全部manager也是worker。在單個manager節點集羣中,您能夠運行諸如docker service create之類的命令,而調度程序會將全部任務放在本地引擎上。

  

Load Balancing

 + https://docs.docker.com/engine/swarm/key-concepts/#services-and-tasks

ingress load balancing

做用在外部要訪問的服務上,通常服務會對外暴露一個port,(若是你沒有指定的話,swarm manager會自動給這個服務分配一個PublishedPort )

外部Clients能在集羣任一節點的PublishedPort 上訪問服務(不論這個節點當前是否有這個服務的running task)。

 服務發現(這裏天然說的是Docker Stack中某個對外暴露的服務),有兩種模式(對應docker-stack.yml: deploy---->endpoint_mode)

  • vip:  Docker Swarm爲服務分配1個虛擬ip,服務後有多少節點、服務請求到哪一個節點容器對於客戶端是透明的。  默認
  • dnsrr: Docker Swarm 爲服務創建DNS記錄,返回可用容器的ip列表, 客戶端直接請求其中一個ip, 這種方式通常用於自建負載均衡器

internal load balancing:

做用在每一個服務上,swarm內部有一個DNS組件(自動爲每一個服務分配dns條目),swarm manager使用依據DNS名稱分發請求。

Docker Swarm網絡模型

①  overlay network:覆蓋物網絡,顧名思義是附着在主機底層網絡之上的網絡, 這個網絡保證了不一樣主機之間容器通訊

②  ingress network:進入網絡,顧名思義是外部客戶端訪問服務時,服務節點間負載均衡(節點在開放端口上收到請求,上交給IPVS,選擇容器),是一種特殊的overlay網絡。

③  docker-gwbridge: 將overlay網絡鏈接到docker宿主機的網絡,默認: 服務正在運行的每一個容器都鏈接到其本地Docker守護程序主機的docker_gwbridge網絡

在初始化或剛加入Swarm集羣時,會建立一個Ingress和 docker-gwbridge網絡 

單機走向集羣部署

本次將<<docker-compose真香>> 3容器改造目標:

  • 三個服務---->nginx----> receiver------>app,服務容器經過名爲webnet 的overlay網絡通訊;

  • nginx開放外部訪問端口80和8080,關注ingress網絡

  • receiver, app服務須要訪問宿主機上搭建的Redis, 關注docker-gwbridge網絡

通常兩個步驟: ① 搭建集羣   ② 發佈服務

  搭建Docker Swarm集羣

單節點/多節點的初始化方式,可參考 docker swarm  -- help指令; 集羣節點的管理可參考 docker  node --help指令

$ docker swarm --help Usage: docker swarm COMMAND Manage Swarm Commands: ca Display and rotate the root CA init Initialize a swarm join Join a swarm as a node and/or manager join-token Manage join tokens, 若是忘記Token,能夠執行這個參數 leave Leave the swarm unlock Unlock swarm unlock-key Manage the unlock key update Update the swarm

  發佈服務

 可以使用docker service create方式建立服務,我比較喜歡使用docker stack deploy搭配docker-stack.yml文件

 下面是生產部署中追加的production.yml,建立了一個名爲eqidstack_webnet的overlay網絡

version: "3.7"
services:
  proxy:
    networks:
      - webnet
  receiver:
    deploy:
      replicas: 1 
      restart_policy:
        condition: on-failure
    networks:
      - webnet
    volumes:
      - type: bind
        source: /home/eqidmanager/receiver.secrets.json
        target: /app/appsettings.secrets.json
  app:
    deploy: replicas: 2
      restart_policy:
        condition: on-failure
      update_config:
        parallelism: 1
        delay: 5s
        order: stop-first
    networks:
      - webnet
    volumes:
      - type: bind
        source: /home/eqidmanager/appsettings.secrets.json
        target: /app/appsettings.secrets.json
networks: webnet: 
# docker stack不加載同目錄下的.env環境變量文件,原有適用於docker-compose工具的yml文件可採用變通方法
docker stack deploy -c <(docker-compose -f docker-stack.yml -f production.yml config) eqidstack

服務部署效果:

#docker stack ls:
NAME           SERVICES     ORCHESTRATOR
eqidstack      3       Swarm

#docker service ls:

ID        NAME            MODE      REPLICAS   IMAGE                   PORTS (服務對外暴露的端口
jml6ecfa330r eqidstack_app       replicated    2/2      12205599/eqidmanager:master
3381stpkirgj eqidstack_proxy      replicated   1/1      nginx:latest              *:80->80/tcp, *:8080->8080/tcp
vhz4ef8p4ffp eqidstack_receiver   replicated   1/1      12205599/eqidreceiver:master

可經過 

docker network inspect ingress 驗證容器eqidstack_proxy.1 鏈接到ingress網絡;

docker network inspect eqidstack_webnet 驗證有4個容器鏈接到 overlay網絡

不停服更新/不停服擴容

 手動更新服務配置:docker service update  [opton]  {some_service_name}

咱們來爲以上名爲{eqidstack_proxy}的服務添加 [重啓策略]

  手動擴容:docker service scale [option] {service=replicas}

爲名爲{eqidstack_proxy}的服務擴容爲2容器

 可經過docker service  inspect eqidstack_proxy驗證操做結果

總結

docker service 定義某個(副本集)容器在生產環境下的狀態,通常業務含義上的服務相關;

docker stack 定義一組服務,服務間協做、調用,支撐整個業務架構;

docker swarm 管理一組服務在集羣節點上的的部署

本文以 重難點解讀+實戰演練的方式記錄Docker Swarm生產部署的過程,但願能和你們查缺補漏,共同探討。 

https://docs.docker.com/compose/compose-file/

https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/#manager-nodes

https://docs.docker.com/engine/swarm/key-concepts/#services-and-tasks

https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/

相關文章
相關標籤/搜索