1. 程式人生 > >DockerSwarm 叢集環境搭建

DockerSwarm 叢集環境搭建

一、簡介

1. 什麼是docker swarm?

Swarm 在 Docker 1.12 版本之前屬於一個獨立的專案,在 Docker 1.12 版本釋出之後,該專案合併到了 Docker 中,成為 Docker 的一個子命令。目前,Swarm 是 Docker 社群提供的唯一一個原生支援 Docker 叢集管理的工具。它可以把多個 Docker 主機組成的系統轉換為單一的虛擬 Docker 主機,使得容器可以組成跨主機的子網網路。

Docker Swarm 是一個為 IT 運維團隊提供叢集和排程能力的編排工具。使用者可以把叢集中所有 Docker Engine 整合進一個「虛擬 Engine」的資源池,通過執行命令與單一的主 Swarm 進行溝通,而不必分別和每個 Docker Engine 溝通。在靈活的排程策略下,IT 團隊可以更好地管理可用的主機資源,保證應用容器的高效執行。

Swarm的基本架構如下圖所示:

2. Docker Swarm 優點

任何規模都有高效能表現
對於企業級的 Docker Engine 叢集和容器排程而言,可拓展性是關鍵。任何規模的公司——不論是擁有五個還是上千個伺服器——都能在其環境下有效使用 Swarm。
經過測試,Swarm 可拓展性的極限是在 1000 個節點上執行 50000 個部署容器,每個容器的啟動時間為亞秒級,同時效能無減損。

靈活的容器排程

Swarm 幫助 IT 運維團隊在有限條件下將效能表現和資源利用最優化。Swarm 的內建排程器(scheduler)支援多種過濾器,包括:節點標籤,親和性和多種容器部策略如 binpack、spread、random 等等。

服務的持續可用性

Docker Swarm 由 Swarm Manager 提供高可用性,通過建立多個 Swarm master 節點和制定主 master 節點宕機時的備選策略。如果一個 master 節點宕機,那麼一個 slave 節點就會被升格為 master 節點,直到原來的 master 節點恢復正常。
此外,如果某個節點無法加入叢集,Swarm 會繼續嘗試加入,並提供錯誤警報和日誌。在節點出錯時,Swarm 現在可以嘗試把容器重新排程到正常的節點上去。

和 Docker API 及整合支援的相容性

Swarm 對 Docker API 完全支援,這意味著它能為使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的使用者提供無縫銜接的使用體驗。

Docker Swarm 為 Docker 化應用的核心功能(諸如多主機網路和儲存卷管理)提供原生支援

開發的 Compose 檔案能(通過 docker-compose up )輕易地部署到測試伺服器或 Swarm 叢集上。Docker Swarm 還可以從 Docker Trusted Registry 或 Hub 裡 pull 並 run 映象。

二、相關概念

1. 節點

有兩種型別的節點: managers 和 workers.

管理節點(managers)

管理節點用於 Swarm 叢集的管理,docker swarm 命令基本只能在管理節點執行(節點退出叢集命令 docker swarm leave 可以在工作節點執行)。一個 Swarm 叢集可以有多個管理節點,但只有一個管理節點可以成為 leader,leader 通過 raft 協議實現。

為了利用swarm模式的容錯功能,Docker建議您根據組織的高可用性要求實現奇數個節點。當您擁有多個管理器時,您可以從管理器節點的故障中恢復而無需停機。

  • N個管理節點的叢集容忍最多損失 (N-1)/2 個管理節點。
  • Docker建議一個叢集最多7個管理器節點。

重要說明:新增更多管理節點並不意味著可擴充套件性更高或效能更高。一般而言,情況正好相反。

工作節點(workers)

工作節點是任務執行節點,管理節點將服務 (service) 下發至工作節點執行。管理節點預設也作為工作節點。你也可以通過配置讓服務只執行在管理節點。下圖展示了叢集中管理節點與工作節點的關係。

2. 服務和任務

任務 (Task)是 Swarm 中的最小的排程單位,目前來說就是一個單一的容器。
服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:

  • replicated services (複製服務)按照一定規則在各個工作節點上執行指定個數的任務。
  • global services (全域性服務)每個工作節點上執行一個任務。

兩種模式通過 docker service create 的 --mode 引數指定。下圖展示了容器、任務、服務的關係。

三、Swarm 叢集

準備工作

  • 三個可以通過網路進行通訊的Linux主機或虛擬機器,並安裝了Docker,或者使用docker-machine 建立三臺虛擬機器。
  • 已安裝Docker Engine 1.12或更高版本
  • 在主機之間開啟埠(2377、7946、4789)

建立一個叢集

1. 建立虛擬機器(已經有Linux主機或虛擬機器的跳過此步)

本文通過docker-machine使用VirtualBox驅動程式建立3個VM (已經有Linux主機或虛擬機器的跳過此步):

docker-machine create --driver virtualbox myvm-1
docker-machine create --driver virtualbox myvm-2
docker-machine create --driver virtualbox myvm-3

列出虛擬機器並獲取其IP地址:

docker-machine ls

以下是此命令的示例輸出:

$docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER           ERRORS
myvm-1   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.1-beta2   
myvm-2   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.09.1-beta2   
myvm-3   -        virtualbox   Running   tcp://192.168.99.102:2376           v18.09.1-beta2  

2. 初始化swarm

把第一臺機器myvm-1充當管理節點,第二臺myvm-2 、第三臺myvm-3為工作節點。

使用 docker-machine ssh 連線 myvm-1,Linux主機直接ssh連線就行。

docker-machine ssh myvm-1 

初始化swarm

docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (4a8mo8cekpe0vpk0ze963avw9) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

上面輸出的這一段就是工作節點加入叢集的命令:

docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377

如果你的 Docker 主機有多個網絡卡,擁有多個 IP,必須使用 --advertise-addr 指定 IP。
執行 docker swarm init 命令的節點自動成為管理節點。

命令 docker info 可以檢視 swarm 叢集狀態:

Server Version: 18.09.1-beta2
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active
 NodeID: ib1498ex2q18i7gznb2zgicqq
 Is Manager: true
 ClusterID: fbyxxjzrtcxc53op35jnyzl7t
 Managers: 3
 Nodes: 3
 Default Address Pool: 10.0.0.0/8  

命令 docker node ls 可以檢視叢集節點資訊:

$docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ib1498ex2q18i7gznb2zgicqq *   myvm-1              Ready               Active              Leader              18.09.1-beta2

3. 工作節點加入 swarm 叢集

連線機器myvm-2

docker-machine ssh myvm-2

加入 swarm 叢集

$docker swarm join \
    --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u \
    192.168.99.100:2377

This node joined a swarm as a worker.

節點myvm-3,執行myvm-2相同的操作加入叢集。

叢集的大部分命令需要在管理節點中才能執行

我們進入管理節點 myvm-1 ,檢視叢集的節點資訊。

docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ib1498ex2q18i7gznb2zgicqq *   myvm-1              Ready               Active              Leader              18.09.1-beta2
vels0fe3eh5s5cxj1s573v9wx     myvm-2              Ready               Active                                  18.09.1-beta2
obxnnqelh4p16wajrwvyn6j8v     myvm-3              Ready               Active                                  18.09.1-beta2

為了高可用,我們升級工作節點為管理節點。

docker node promote myvm-2
docker node promote myvm-3

這時我們再看叢集的節點資訊

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ib1498ex2q18i7gznb2zgicqq *   myvm-1              Ready               Active              Leader              18.09.1-beta2
vels0fe3eh5s5cxj1s573v9wx     myvm-2              Ready               Active              Reachable           18.09.1-beta2
obxnnqelh4p16wajrwvyn6j8v     myvm-3              Ready               Active              Reachable           18.09.1-beta2

myvm-2、myvm-3的 叢集狀態變為 Reachable(選舉者),因為叢集中節點Leader只能有一個,這個類似zookeeper,只不過zookeepers用的演算法是paxos,Swarm用的演算法是raft。

4. 退出 Swarm 叢集

如果 Manager 想要退出 Swarm 叢集, 在 Manager Node 上執行如下命令:

docker swarm leave

如果叢集中還存在其它的 Worker Node,還希望 Manager 退出叢集,則加上一個強制選項,命令列如下所示:

docker swarm leave --force

工作節點進行退出叢集,需要在工作節點上執行命令:

docker swarm leave

退出後的節點,依然可以使用 上面的 docker swarm join --token 重新加入叢集。

叢集上部署應用

命令

$ docker service create --replicas 1 --name 別名  映象ID

replicas 指定執行服務的數量。

例項1

建立一個alpine服務(alpine是一個小型liunx系統)

#執行一個alpine映象,並執行ping命令
docker service create --replicas 1 --name test1 alpine ping docker.com

檢視叢集上的服務

$docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
rnu10rprrwzv        test1               replicated          1/1                 alpine:latest

例項2

以下命令將nginx容器中的埠80釋出到群集中任何節點的埠8080

docker service create \
  --name my-web \
  --publish published=8080,target=80 \
  --replicas 2 \
  nginx

檢視叢集上的服務

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
q6wfiizzosmd        nginx               replicated          3/3                 nginx:latest        *:8080->80/tcp
rnu10rprrwzv        test1               replicated          1/1                 alpine:latest 

service 通過 ingress load balancing 來發布服務,且 swarm 叢集中所有 node 都參與到 ingress 路由網格(ingress routing mesh) 中,訪問任意一個 node+PublishedPort 即可訪問到服務。

當訪問任何節點上的埠8080時,Docker將您的請求路由到活動容器。在群節點本身,埠8080可能並不實際繫結,但路由網格知道如何路由流量,並防止任何埠衝突的發生。

路由網格在釋出的埠上監聽分配給節點的任何IP地址。對於外部可路由的IP地址,該埠可從主機外部獲得。對於所有其他IP地址,只能從主機內部訪問。

所以訪問 192.169.99.100:8080、192.169.99.101:8080、192.169.99.102:8080 ,都可以訪問到nginx,這樣就實現了負載均衡。因為我們指定--replicas 3 啟動了3個執行nginx的容器 ,所以三個節點myvm-1、myvm-2、myvm-3 上都運行了一個 nginx 的容器,可以通過改其中一個節點上的nginx的歡迎頁 ,然後再訪問,來檢查是否實現了負載均衡。

可以通過scale 來指定執行容器的數量。

 docker service scale nginx=2

我通過docker service ls 可以看出 nginx 的副本變成了2個

$docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
q6wfiizzosmd        nginx               replicated          2/2                 nginx:latest        *:8080->80/tcp

overlay 網路

1. 概述

初始化swarm或將Docker主機加入現有swarm時,會在該Docker主機上建立兩個新網路:

  • ingress:稱為覆蓋網路ingress,處理與群集服務相關的控制和資料流量。建立群組服務並且不將其連線到使用者定義的覆蓋網路時,ingress 是預設連線的網路。
  • docker_gwbridge:稱為橋接網路docker_gwbridge,它將各個Docker守護程式連線到參與該群集的其他守護程序。

在管理節點上檢視網路

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
cb0ccb89a988        bridge              bridge              local
0174fb113496        docker_gwbridge     bridge              local
541b62778c0e        host                host                local
8n7xppn5z4j2        ingress             overlay             swarm
369d459f340d        none                null                local

overlay網路驅動程式會建立多個Docker守護主機之間的分散式網路。該網路位於(覆蓋)特定於主機的網路之上,允許連線到它的容器(包括群集服務容器)安全地進行通訊。Docker透明地處理每個資料包與正確的Docker守護程式主機和正確的目標容器的路由。

2. 自定義 overlay 網路

建立用於swarm服務的overlay網路,使用如下命令:

docker network create -d overlay my-overlay

我們再次檢視網路,發現可以看到自定義 overlay了。

$docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
cb0ccb89a988        bridge              bridge              local
0174fb113496        docker_gwbridge     bridge              local
541b62778c0e        host                host                local
8n7xppn5z4j2        ingress             overlay             swarm
a23htz7n0pvp        my-overlay          overlay             swarm
369d459f340d        none                null                local

叢集中部署了兩個服務 nginx、alpine,現在我們進入alpine,去訪問nginx。

 docker exec -it test1.1.oonwl8c5g4u3p17x8anifeubi bash
/ # ping nginx
ping: bad address 'nginx'
wget 192.168.99.100:8080
Connecting to 192.168.99.100:8080 (192.168.99.100:8080)
index.html           100% |*************************************************************************************************************|   612   0:00:00 ETA

我們發現叢集中的各個服務不能用名稱訪問的,只能用叢集服務發現的路由網路訪問,那麼叢集中的服務怎麼能通過名稱進行訪問呢,這就需要用到上面自定義的 overlay 網路。

刪除我們啟動的服務,重新建立指定使用自定義網路的服務。

docker service rm nginx test1
docker service create --name nginx -p 8080:80 --network my-overlay --replicas 3 nginx
docker service create --name test1 --network my-overlay alpine ping www.baidu.com

進入test1容器中,重新測試下:

/ # ping nginx
PING nginx (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.120 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.094 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.108 ms
/ # wget nginx
Connecting to nginx (10.0.0.2:80)
index.html           100% |*************************************************************************************************************|   612   0:00:00 ETA

發現可以通過名稱進行叢集中的容器間的訪問了。




歡迎掃碼或微信搜尋公眾號《程式設計師果果》關注我,關注有驚喜~

相關推薦

DockerSwarm 叢集環境搭建

一、簡介 1. 什麼是docker swarm? Swarm 在 Docker 1.12 版本之前屬於一個獨立的專案,在 Docker 1.12 版本釋出之後,該專案合併到了 Docker 中,成為 Docker 的一個子命令。目前,Swarm 是 Docker 社群提供的唯一一個原生支援 Docker 叢集

Redis單機和叢集環境搭建

一、安裝單機版redis  1、可以自己去官網下載,當然也可以用課程提供的壓縮包 # yum install gcc # wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz # tar -xzvf tcl8.6.1-s

Hyperledger Fabric v1.1 單機多節點叢集環境搭建

Fabric v1.1 1.環境安裝 1).安裝go 1.9.x 下載地址 http://golang.org/dl/ 配置環境 #go的安裝根目錄 export GOROOT=/usr/local/go #go的工作路徑根目錄 export GOPAT

zookeeper-3.4.10分散式叢集環境搭建

初始叢集狀態 機器名 IP 作用 linux系統 master 192.168.218.133   CentOS-6.9-x86_64-bin-D

centos7中kafka叢集環境搭建部署

一、前期準備 1、下載kafka安裝包 官方下載地址:http://kafka.apache.org/downloads.html kafka_2.11-2.0.0.tgz   2、準備好要安裝的叢集環境的目標機器(3檯安裝centos7系統) 3、將下載好的壓縮包

MongoDB分散式叢集環境搭建

第一節分片的概念   分片(sharding)是指根據片鍵,將資料進行拆分,使其落在不同的機器上的過程。如此一來,不需要功能,配置等強大的機器,也能儲存大資料量,處理更高的負載。   第二節分片的原理和思想   MongoDB分片的基本思想就是將集合切分成小塊。這些塊分散到

Eureka高可用叢集環境搭建

註冊中心叢集 在微服務中,註冊中心非常核心,可以實現服務治理,如果一旦註冊出現故障的時候,可能會導致整個微服務無法訪問,在這時候就需要對註冊中心實現高可用叢集模式。 Eureka叢集相當簡單:相互註冊 Eureka高可用實際上將自己作為服務向其他服務註冊中心註冊自己,這樣就可以形成一組相互註冊的服務註冊

kafaka叢集環境搭建

伺服器環境準備 使用vm虛擬三個linux主機:192.168.128.139,192.168.128.140,192.168.128.141 Zookeeper叢集環境搭建 1.每臺伺服器節點上安裝jdk1.8環境  使用java version命令測試 2

Windows 下 Redis 叢集環境搭建

Redis 可以支援單機多例項方式的部署,這樣為叢集環境的搭建提供了方便。 Windows下搭建Redis叢集需要的環境準備包括,Redis,Ruby語言執行環境,Redis的Ruby驅動redis-xxxx.gem、建立Redis叢集的工具redis-trib.rb。 1. Redis Wind

Elasticsearch叢集環境搭建

單節點環境搭建參考:https://blog.csdn.net/qq_38270106/article/details/84309702 建議先搭建好單伺服器,再clone兩個伺服器 環境準備:三臺虛擬機器 node-1----------192.168.128.156

Spark叢集環境搭建

本文作者:賀聖軍,叩丁狼高階講師。原創文章,轉載請註明出處。 現在在大資料的生態圈的離線的處理主要使用的是MapReduce和Hive技術,但是對於實時處理分析,越來越多的企業使用的Spark作為企業的記憶體處理計算框架,相對於MapReduce,Spark主要有以下一些特

Spark叢集環境搭建中所遇到的問題

1. 安裝好JDK後,檢視java版本出現以下提示:         解決方法:在終端輸入以下兩條命令:       (1)  sudo update-alternatives --install /usr/bin/javac javac /home/fhb/spark

大資料作業(一)基於docker的hadoop叢集環境搭建

主要是根據廈門大學資料庫實驗室的教程(http://dblab.xmu.edu.cn/blog/1233/)在Ubuntu16.04環境下進行搭建。 一、安裝docker(Docker CE) 根據docker官網教程(https://docs.docker.

Hadoop叢集環境搭建(雲伺服器,虛擬機器都適用)

為了配置方便,為每臺電腦配置一個主機名: vim /etc/hostname 各個節點中,主節點寫入:master , 其他從節點寫入:slavexx 如果這樣修改不能生效,則繼續如下操作 vim /etc/cloud/cloud.cfg 做preserve_hostname: true 修改 reb

hadoop叢集環境搭建之偽分散式叢集環境搭建

搭建叢集的模式有三種 1.偽分散式:在一臺伺服器上,啟動多個執行緒分別代表多個角色(因為角色在叢集中使用程序表現的) 2.完全分散式:在多臺伺服器上,每臺伺服器啟動不同角色的程序,多臺伺服器構成叢集 node01:NameNode node02:

Hadoop最完整分散式叢集環境搭建

分散式環境搭建之環境介紹 之前我們已經介紹瞭如何在單機上搭建偽分散式的Hadoop環境,而在實際情況中,肯定都是多機器多節點的分散式叢集環境,所以本文將簡單介紹一下如何在多臺機器上搭建Hadoop的分散式環境。 我這裡準備了三臺機器,IP地址如下: 192.16

zookeeper叢集環境搭建(純zookeeper)

1.首先在三臺機子上放上zookeeper的解壓包,解壓。  然後的話zookeeper是依賴於jdk的,那麼也應該安裝jdk,這裡不詳細說明了。   mv zookeeper-3.4.5 zookeeper  修改節點為zookeeper  

zookeeper叢集環境搭建(使用kafka的zookeeper搭建zk叢集

---恢復內容開始--- 使用kafka的zookeeper來搞叢集的話和單純用zk的其實差不了多少。 0.說在前頭,搭建kafka叢集之前請把每個伺服器的jdk搞起來。 1.安裝kafka wget http://mirrors.hust.edu.cn/apache/kafka/2.0.0/kafk

Hive叢集環境搭建之本地模式(多使用者模式)

搭建叢集的模式有三種 1. 原始碼包下載及解壓 2. 叢集的環境 … Active NameNode Standby NameNode DataNode Zookeeper ZKFC JournalNode ResourceManage NodeM

hadoop分散式叢集環境搭建

參考 http://www.cnblogs.com/zhijianliutang/p/5736103.html   1 wget http://mirrors.shu.edu.cn/apache/hadoop/common/hadoop-2.9.2/hadoop-2