溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Docker自發(fā)現(xiàn)注冊(cè)服務(wù)基礎(chǔ)etcd的部署及使用方法

發(fā)布時(shí)間:2021-10-12 09:26:36 來源:億速云 閱讀:516 作者:柒染 欄目:云計(jì)算

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Docker自發(fā)現(xiàn)注冊(cè)服務(wù)基礎(chǔ)etcd的部署及使用方法,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1. 背景

自發(fā)現(xiàn)服務(wù)基礎(chǔ)需要一個(gè)高可用鍵值存儲(chǔ)系統(tǒng), 很容易聯(lián)想到redis, memcached等KV內(nèi)存數(shù)據(jù)庫(kù), 但是我最后選擇了etcd, 主要是因?yàn)樗焐褪菫榧夯O(shè)計(jì)的, 并且生來就是用作conf的節(jié)點(diǎn)數(shù)據(jù)同步.

1) etcd為coreos的一個(gè)基礎(chǔ)部件, 也是用于保存配置信息, 在這里我們主要討論非coreos系統(tǒng)的etcd部署及使用

2) 目前etcd最新版本為: v2.3.6, 測(cè)試版為: v3.x, 我們基于v2版本進(jìn)行演練

2. 注意

我的所有docker鏡像都是基于alpine 3.x版本進(jìn)行構(gòu)建, 如果需要其他版本請(qǐng)自行修改

3. 準(zhǔn)備

1) etcd官方地址

https://github.com/coreos/etcd

2) Linux最新版本下載地址

https://github.com/coreos/etcd/releases/download/v2.3.6/etcd-v2.3.6-linux-amd64.tar.gz

3) 構(gòu)建基于alpine的etcd docker鏡像

FROM alpine:3.3
MAINTAINER Etcd Maintainers "kekuer@gmail.com"

RUN ETCD_VER=2.3.6 && \ 
  echo "http://127.0.0.1:8098/main" > /etc/apk/repositories && \
  apk --update add curl && \
  mkdir src && \
  cd src && \
  curl -O http://127.0.0.1:8080/etcd-v${ETCD_VER}-linux-amd64.tar.gz && \
  tar xzvf etcd-v${ETCD_VER}-linux-amd64.tar.gz && \
	cd etcd-v${ETCD_VER}-linux-amd64 && \
	cp etcd etcdctl /usr/bin/ && \
	apk --update del curl && \
	rm -rf /var/cache/apk/* /src
		
ENTRYPOINT ["/usr/bin/etcd"]

注意:  
根據(jù)自己的alpine 鏡像地址修改repository地址, 構(gòu)建自己的alpine本地鏡像, 請(qǐng)參考我的另外一篇文章: Alpine Linux Repository本地鏡像制作

我在這里做了一個(gè)文件池, 放在一臺(tái)服務(wù)器上, 如果你們相應(yīng)的文件池服務(wù)器, 修改etcd下載地址為: https://github.com/coreos/etcd/releases/download/v${ETCD_VER}/etcd-v${ETCD_VER}-linux-amd64.tar.gz

4. 概念

1) 靜態(tài)配置和自發(fā)現(xiàn)

a) 靜態(tài)配置: 通過initial-cluster啟動(dòng)參量來啟動(dòng)etcd服務(wù), 用于已經(jīng)預(yù)知集群地址

-initial-cluster infra0=http://172.0.1.10:2380,http://172.0.1.11:2380,infra2=http://172.0.1.12:2380 \
-initial-cluster-state new

或者使用環(huán)境變量

ETCD_INITIAL_CLUSTER="infra0=http://172.0.1.10:2380,infra1=http://172.0.1.11:2380,infra2=http://172.0.1.12:2380"
ETCD_INITIAL_CLUSTER_STATE=new

b) 自發(fā)現(xiàn)模式: 通過指定discovery發(fā)現(xiàn)服務(wù)token地址來自動(dòng)配置集群服務(wù)

可以使用官方地址: https://discovery.etcd.io/new?size=3, 當(dāng)然在國(guó)內(nèi)最好還是自己構(gòu)建一個(gè)etcd-discovery服務(wù), 使用之前構(gòu)建的etcd鏡像, 跑一個(gè)docker container, 并放開discovery端口, 我這里使用的是80端口, container內(nèi)部端口是2379

docker run --name etcd-discovery -d --restart=always --log-opt max-size=100m -p 80:2379 -v /docker/mount/etcd-discovery/:/etcd funwun.io/etcd:1.4 \
  -data-dir /etcd \
 -snapshot-count=100 \
  -listen-client-urls http://0.0.0.0:2379 \
  -advertise-client-urls http://0.0.0.0:2379

注意:
recover etcd數(shù)據(jù)是一件比較繁瑣的事情, 所以盡量把data掛載到host上, 如果是EC2的話, 最好是重新掛載一個(gè)EBS來作為所有docker的掛載盤 (我的習(xí)慣, 你們也可以提出自己的意見和建議)

snapshot-count的改小, 是因?yàn)槲业臋C(jī)器都是1G內(nèi)存的輕量host, 所以我要保證內(nèi)存的使用情況


2) etcd節(jié)點(diǎn)

由于etcd采用Raft算法, 因此在做決策時(shí)需要多數(shù)節(jié)點(diǎn)的投票, 所以一般部署為奇數(shù)節(jié)點(diǎn): 3, 5, 7

3) etcd四個(gè)主要概念

a) listen-peer-urls

用于節(jié)點(diǎn)與節(jié)點(diǎn)之間數(shù)據(jù)交換, 因此需要監(jiān)聽在其他節(jié)點(diǎn)可以訪問的IP地址上

默認(rèn)端口為: 2380 & 7001 (7001不推薦使用, 已基本廢棄, 主要用于兼容老服務(wù))

b) listen-client-urls

用戶客戶機(jī)訪問etcd數(shù)據(jù), 一般監(jiān)聽在本地, 如果需要集中管理, 可以監(jiān)聽在管理服務(wù)器可以訪問的IP地址上

默認(rèn)端口為: 2379 & 4001 (4001不推薦使用, 已基本廢棄, 主要用于兼容老服務(wù))

c) initial-advertise-peer-urls

該參數(shù)表示節(jié)點(diǎn)監(jiān)聽其他節(jié)點(diǎn)同步信號(hào)的地址

默認(rèn)端口為: 2380 & 7001 (7001不推薦使用, 已基本廢棄, 主要用于兼容老服務(wù))

d) advertise-client-urls

在加入proxy節(jié)點(diǎn)后, 會(huì)使用該廣播地址, 因此需要監(jiān)聽在一個(gè)proxy節(jié)點(diǎn)可以訪問的IP地址上

默認(rèn)端口為: 2379 & 4001 (4001不推薦使用, 已基本廢棄, 主要用于兼容老服務(wù))

5. 使用

1) 創(chuàng)建一個(gè)discovery服務(wù)配置信息

TOKEN=test-1
curl -X PUT http://127.0.0.1/v2/keys/discovery/${TOKEN}/_config/size -d value=3

在這里, 我們使用的是test-1作為token, 你可以UUID一個(gè)來作為token

注意:
生產(chǎn)環(huán)境請(qǐng)注意該名稱, 我不建議使用UUID來做token, 因?yàn)檎Z(yǔ)義不明, 最好起一個(gè)自己能記住的名稱, 方便以后辨識(shí)

2) 在3個(gè)節(jié)點(diǎn)服務(wù)器上分別啟動(dòng)etcd服務(wù)

a) 獲取本地IP (此為舉例, 我使用EC2, 因此以下shell已經(jīng)足夠, 如果網(wǎng)絡(luò)配置較復(fù)雜的服務(wù)器上, 根據(jù)自行條件獲取對(duì)應(yīng)的對(duì)外IP)

IP=$(hostname --all-ip-addresses | awk '{print $1}') && echo $IP

b) 在3個(gè)服務(wù)器上啟動(dòng)etcd節(jié)點(diǎn)

docker run --name etcd -d --log-opt max-size=100m -p 2379:2379 -p 2380:2380 -v /docker/mount/etcd:/etcd funwun.io/etcd:1.4 \
 -name ${IP} \
 -data-dir /etcd \
 -snapshot-count=1000 \
 -listen-client-urls http://0.0.0.0:2379 \
 -advertise-client-urls http://${IP}:2379 \
 -listen-peer-urls http://0.0.0.0:2380 \
 -initial-advertise-peer-urls http://${IP}:2380 \
 -discovery http://172.0.0.1/v2/keys/discovery/test-1

c) 在集群初始化為3個(gè)節(jié)點(diǎn)的話, 必須湊齊3個(gè)節(jié)點(diǎn), 服務(wù)才能正常運(yùn)行, 超出部分將啟動(dòng)為proxy節(jié)點(diǎn), 因此在第4個(gè)服務(wù)器上, 我們應(yīng)該將節(jié)點(diǎn)啟動(dòng)為proxy

docker run --name etcd -d --log-opt max-size=100m --net=host -v /docker/mount/etcd:/etcd funwun.io/etcd:1.4 \
 -name ${IP} \
 -data-dir /etcd \
 -snapshot-count=1000 \
 --proxy on \
 -listen-client-urls http://0.0.0.0:2379 \
 -discovery http://172.31.16.100/v2/keys/discovery/test-1

注意:
name必須是唯一的, etcd是用這個(gè)來確定節(jié)點(diǎn)的, 如果使用--initial-cluster, 我們還會(huì)使用該名稱作為集群的節(jié)點(diǎn)名稱 (一般使用節(jié)點(diǎn)IP來作為名稱, 你也可以使用hostname)

discovery地址修改為你的discovery服務(wù)地址

上述就是小編為大家分享的Docker自發(fā)現(xiàn)注冊(cè)服務(wù)基礎(chǔ)etcd的部署及使用方法了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI