(通俗易懂~)基于Docker的Etcd叢集環境搭建
-
- 閑言碎語
- Etcd簡介
- 準備環境
-
- 第一步,下載下傳Etc鏡像
- 第二步,建立自定義Docker網絡
- 第三步,建立并啟動Etcd鏡像節點
- 驗證結果
- 完結撒花!
閑言碎語
最近在埋頭苦學Docker相關知識,深深被Docker技術所吸引,Docker牛逼,我愛Docker!也是好久沒寫部落格了,在學習Docker的過程中,今天算是個小小的裡程碑吧,特此紀念。廢話不多說下面進入正文!
Etcd簡介
Etcd是CoreOS團隊于2013年6月發起的開源項目,它的目标是建構一個高可用的分布式鍵值(KEY-VALUE)倉庫,遵循Apache v2許可,基于Go語言實作。主要用于分享配置和服務發現。etcd 的靈感來自于 ZooKeeper 和 Doozer,除了擁有與之類似的功能外,更加注重以下幾個方面:
- 簡單:支援 curl 方式的使用者 API (HTTP+JSON)
- 安全:可選 SSL 用戶端證書認證
- 快速:單執行個體可達每秒 10000 次寫操作
- 可靠:使用 Raft 實作分布式
準備環境
建構思路如下:
節點名 | IP位址 |
---|---|
node1 | 10.2.36.1 |
node2 | 10.2.36.2 |
node3 | 10.2.36.3 |
我們需要三個節點,這三個節點可以分布在不同伺服器,本案例中,以一台伺服器基于Docker運作多個容器來做示範。
第一步,下載下傳Etc鏡像
下載下傳Etcd鏡像
$docker pull quay.io/coreos/etcd:v3.3.1
$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
quay.io/coreos/etcd v3.3.1 d56a5594a28c 2 years ago 39.4MB
第二步,建立自定義Docker網絡
首先建構個自定義網絡,因為我們要給各個節點配置設定IP位址,Docker容器預設網絡隻能自動配IP無法手動配置設定。
##建立一個新的bridge網絡
$docker network create --driver bridge --subnet=10.2.36.0/16 --gateway=10.2.1.1 mynet2
##檢視網絡清單
$docker network ls
NETWORK ID NAME DRIVER SCOPE
d1473128e10f bridge bridge local
ca7490979d9e host host local
64f518b2574c mynet2 bridge local
f2e31afceb6e none null local
第三步,建立并啟動Etcd鏡像節點
建立容器并運作
節點1:
docker run -d \
-p 2479:2379 \
-p 2381:2380 \
--name node1 \
--network=mynet2 \
--ip 10.2.36.1 \
quay.io/coreos/etcd:v3.3.1 \
etcd \
-name node1 \
-advertise-client-urls http://10.2.36.1:2379 \
-initial-advertise-peer-urls http://10.2.36.1:2380 \
-listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 \
-initial-cluster-token etcd-cluster \
-initial-cluster "node1=http://10.2.36.1:2380,node2=http://10.2.36.2:2380,node3=http://10.2.36.3:2380" \
-initial-cluster-state new
節點2:
docker run -d \
-p 2579:2379 \
-p 2382:2380 \
--name node2 \
--network=mynet2 \
--ip 10.2.36.2 \
quay.io/coreos/etcd:v3.3.1 \
etcd \
-name node2 \
-advertise-client-urls http://10.2.36.2:2379 \
-initial-advertise-peer-urls http://10.2.36.2:2380 \
-listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 \
-initial-cluster-token etcd-cluster \
-initial-cluster "node1=http://10.2.36.1:2380,node2=http://10.2.36.2:2380,node3=http://10.2.36.3:2380" \
-initial-cluster-state new
節點3:
docker run -d \
-p 2679:2379 \
-p 2383:2380 \
--name node3 \
--network=mynet2 \
--ip 10.2.36.3 \
quay.io/coreos/etcd:v3.3.1 \
etcd \
-name node3 \
-advertise-client-urls http://10.2.36.3:2379 \
-initial-advertise-peer-urls http://10.2.36.3:2380 \
-listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 \
-initial-cluster-token etcd-cluster \
-initial-cluster "node1=http://10.2.36.1:2380,node2=http://10.2.36.2:2380,node3=http://10.2.36.3:2380" \
-initial-cluster-state new
參數詳解:
參數名 | 說明 |
---|---|
-name | 設定成員節點的别名,建議為每個成員節點配置可識别的命名 |
-advertise-client-urls | 廣播到叢集中本成員的監聽用戶端請求的位址 |
-initial-advertise-peer-urls | 廣播到叢集中本成員的Peer監聽通信位址 |
-listen-client-urls | 用戶端請求的監聽位址清單 |
-listen-peer-urls | Peer消息的監聽服務位址清單 |
-initial-cluster-token | 啟動叢集的時候指定叢集密碼,隻有相同token的幾點才能加入到同一叢集 |
-initial-cluster | 所有叢集節點的位址清單 |
-initial-cluster-state | 初始化叢集狀态,預設為new,也可以指定為exi-string表示要加入到一個已有叢集 |
驗證結果
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
377c7cbe17ff quay.io/coreos/etcd:v3.3.1 "etcd -name node3 -a…" About an hour ago Up About an hour 0.0.0.0:2679->2379/tcp, 0.0.0.0:2383->2380/tcp node3
dcc05aaaf332 quay.io/coreos/etcd:v3.3.1 "etcd -name node2 -a…" About an hour ago Up About an hour 0.0.0.0:2579->2379/tcp, 0.0.0.0:2382->2380/tcp node2
0d7e59766c6f quay.io/coreos/etcd:v3.3.1 "etcd -name node1 -a…" About an hour ago Up About an hour 0.0.0.0:2479->2379/tcp, 0.0.0.0:2381->2380/tcp node1
## 通過etcdctl member list指令可以查詢出所有叢集節點的清單即為成功
$docker exec -it 377 etcdctl member list
2db3381ff302973d: name=node3 peerURLs=http://10.2.36.3:2380 clientURLs=http://10.2.36.3:2379 isLeader=false
f919ac4d9adb687a: name=node1 peerURLs=http://10.2.36.1:2380 clientURLs=http://10.2.36.1:2379 isLeader=true
ffbd0562b8dd25e9: name=node2 peerURLs=http://10.2.36.2:2380 clientURLs=http://10.2.36.2:2379 isLeader=false
## 無論通過哪一叢集節點查詢出來的結果都應相同
$docker exec -it dcc etcdctl member list
2db3381ff302973d: name=node3 peerURLs=http://10.2.36.3:2380 clientURLs=http://10.2.36.3:2379 isLeader=false
f919ac4d9adb687a: name=node1 peerURLs=http://10.2.36.1:2380 clientURLs=http://10.2.36.1:2379 isLeader=true
ffbd0562b8dd25e9: name=node2 peerURLs=http://10.2.36.2:2380 clientURLs=http://10.2.36.2:2379 isLeader=false
$docker exec -it 0d7 etcdctl member list
2db3381ff302973d: name=node3 peerURLs=http://10.2.36.3:2380 clientURLs=http://10.2.36.3:2379 isLeader=false
f919ac4d9adb687a: name=node1 peerURLs=http://10.2.36.1:2380 clientURLs=http://10.2.36.1:2379 isLeader=true
ffbd0562b8dd25e9: name=node2 peerURLs=http://10.2.36.2:2380 clientURLs=http://10.2.36.2:2379 isLeader=false