天天看點

(通俗易懂~)Docker搭建Etcd叢集

(通俗易懂~)基于Docker的Etcd叢集環境搭建

    • 閑言碎語
    • Etcd簡介
    • 準備環境
      • 第一步,下載下傳Etc鏡像
      • 第二步,建立自定義Docker網絡
      • 第三步,建立并啟動Etcd鏡像節點
      • 驗證結果
    • 完結撒花!

閑言碎語

最近在埋頭苦學Docker相關知識,深深被Docker技術所吸引,Docker牛逼,我愛Docker!也是好久沒寫部落格了,在學習Docker的過程中,今天算是個小小的裡程碑吧,特此紀念。廢話不多說下面進入正文!

Etcd簡介

Etcd是CoreOS團隊于2013年6月發起的開源項目,它的目标是建構一個高可用的分布式鍵值(KEY-VALUE)倉庫,遵循Apache v2許可,基于Go語言實作。主要用于分享配置和服務發現。etcd 的靈感來自于 ZooKeeper 和 Doozer,除了擁有與之類似的功能外,更加注重以下幾個方面:

  1. 簡單:支援 curl 方式的使用者 API (HTTP+JSON)
  2. 安全:可選 SSL 用戶端證書認證
  3. 快速:單執行個體可達每秒 10000 次寫操作
  4. 可靠:使用 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
           

完結撒花!