docker-swarm架構與組成
swarm號稱docker三劍客之一,用來實現docker的叢集服務。
docker swarm對於docker來說是一個本地化叢集,它把多個的docker hosts聚集在一起,對外只提供一個虛擬化的docker主機,由於docker swarm遵從標準的dockerAPI,任何可以與dockers組合的應用都可以用swarm透明的擴充套件多個服務。
(Docker Swarm is native clustering for Docker. It turns a pool of Docker hosts into a single, virtual Docker host. Because Docker Swarm serves the standard Docker API, any tool that already communicates with a Docker daemon can use Swarm to transparently scale to multiple hosts. )
本文將介紹docker swarm的基本架構,以及各個模組的功能
swarm架構
最上層的對外介面包括:
docker API用於管理映象的生命週期。
swarm CLI 用於叢集管理。
LeaderShip提供叢集的HA(high avaliable),防止單點故障,具體實施請參見官網(High avilability for docker swarm)
discovery service是warm的發現服務,它會在每個node中註冊一個angent將各個節點的IP埠上報,manager會從發現服務讀取各節點資訊,發現服務的實現方式有四種:
Hosted Discovery with Docker Hub,Docker Hub提供的發現服務,需要連線外網。
docker run -d -p <manager_port>:2375 swarm manage token://<cluster_id>
基於KV分散式儲存系統,支援etcd,consul,zookeeper
swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix>
靜態檔案描述
swarm manage -H tcp://<swarm_ip:swarm_port> file:///tmp/my_cluster
靜態IP列表
swarm manage -H <swarm_ip:swarm_port> nodes://<node_ip1:2375>,<node_ip2:2375>
schedule排程模組,用於容器排程時選擇最優節點,主要分如下兩步(filter和strategy)。
filter(過濾),當建立或執行容器時,它會告訴排程器哪些節點是可用的(符合要求的)。filter可以分為兩類,節點過濾和基於容器配置的過濾。
節點過濾:
Constraints,約束過濾器,可以根據當前作業系統型別、核心版本、儲存型別等條件進行過濾,當然也可以自定義約束,在啟動Daemon的時候,通過Label來指定當前主機所具有的特點。Health filter,會根據節點狀態進行過濾,會去除故障節點。
基於容器配置的過濾:
Affnity,親和性過濾器,支援容器親和性和映象親和性,比如一個web應用,我想將DB容器和Web容器放在一起,就可以通過這個過濾器來實現。Dependency,依賴過濾器。如果在建立容器的時候使用了–volume-from/–link/–net某個容器,則建立的容器會和依賴的容器在同一個節點上。
Ports filter,會根據埠的使用情況過濾。
strategy 根據策略選擇最優節點:
Binpack,在同等條件下,選擇資源使用最多的節點,通過這一個策略,可以將容器聚集起來。
Spread,在同等條件下,選擇資源使用最少的節點,通過這一個策略,可以將容器均勻分佈在每一個節點上。
Random,隨機選擇一個節點。