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