二進位制部署etcd叢集(企業級)

官網:https://etcd.io/docs/
Etcd是一款分散式儲存中介軟體,使用Go語言編寫並透過Raft一致性演算法處理和確保分散式一致性解決了分散式系統中資料一致性的問題。
Etcd常用於微服務架構中的服務註冊與發現中心,相較於Zookeeper部署更簡單,而且具有資料持久化、支援SSL客戶端安全認證的獨特優勢;
Etcd是目前非常熱門的雲原生儲存元件,自2018年底加入CNCF並於2020年11月畢業。

環境說明

主機規劃

本文件使用說明:全域性將IP修改為自己環境的地址,其它版本亦可參照本文,操作步驟大體類似。

高可用叢集的三種形式

  • 靜態配置
預先已經知道etcd叢集有哪些節點,在啟動時透過--initial-cluster引數直接指定好etcd的各個節點地址。
  • etcd動態發現
透過已經搭建好的etcd來輔助搭建新的etcd叢集,已有的etcd叢集作為資料互動點,然後在擴充套件新的叢集時,實現透過已有叢集進行服務發現的機制,如官方提供的:discovery.etcd.io
  • DNS動態發現
透過DNS查詢方式獲取其它節點地址資訊。

一、主機初始化

對每個etcd節點主機進行初始配置操作:

1.1 配置/etc/hosts

$

cat

<<

EOF >> /etc/hosts

192.168.2.51 etcd1

192.168.2.52 etcd2

192.168.2.53 etcd3

EOF


1.2 安裝cfssl證書工具

使用cfsll工具生成叢集需要的證書檔案,其中一臺master節點安裝即可!
$ wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl_1.6.0_linux_amd64 -O /usr/local/bin/cfssl
$ wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssljson_1.6.0_linux_amd64 -O /usr/local/bin/cfssljson
$ wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl-certinfo_1.6.0_linux_amd64 -O /usr/local/bin/cfssl-certinfo
$ chmod +x /usr/local/bin/cfssl*
cfssljson:將從cfssl和multirootca等獲得的json格式的輸出轉化為證書格式的檔案(證書,金鑰,CSR和bundle)進行儲存;

cfssl-certinfo:可顯示CSR或證書檔案的詳細資訊;可用於證書校驗。

1.3 建立工作目錄

$ mkdir -p /etc/etcd/cert
  • /etc/etcd/為etcd工作目錄;
  • /etc/etcd/cert為etcd相關證書存放目錄;

1.4 關閉SELinux、firewalld

firewalld開啟會導致etcd服務啟動失敗。
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
$ systemctl status firewalld.service
$ systemctl disable --now firewalld.service

二、製作證書

2.1 建立證書頒發機構(CA)

1)建立配置檔案

$ cfssl

print

-defaults

config

> /etc/etcd/cert/ca-

config

.json #生成預設配置檔案

$ cat <<EOF > /etc/etcd/cert/ca-

config

.json

{

"signing"

: {

"default"

: {

"expiry"

:

"87600h"

},

"profiles"

: {

"etcd"

: {

"expiry"

:

"87600h"

,

"usages"

: [

"signing"

,

"key encipherment"

,

"server auth"

,

"client auth"

]

}

}

}

}

EOF

引數解析:
default

.expiry:預設證書有效期(單位:h)

profiles.etcd:為服務使用該配置檔案頒發證書的配置模組;

signing:簽署,表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=

TRUE

key

encipherment:金鑰加密;

profiles:指定了不同角色的配置資訊;可以定義多個 profiles,分別指定不同的過期時間、使用場景等引數;後續在簽名證書時使用某個 profile。

server auth:伺服器身份驗證;表示 client 可以用該 CA 對 server 提供的證書進行驗證;

client auth:客戶端身份驗證;表示 server 可以用該 CA 對 client 提供的證書進行驗證;

2)生成並配置csr請求檔案
類似於申請表,表中填寫申請者的資訊(證書籤名請求檔案)
$

cfssl print

-defaults

csr > /etc/etcd/cert/ca

-csr

.json

$cat

<<EOF > ca

-csr

.json

{

"CN"

:

"etcd"

,

"key"

: {

"algo"

:

"rsa"

,

"size"

:

2048

},

"names"

: [

{

"C"

:

"CN"

,

"ST"

:

"BeiJing"

,

"L"

:

"BeiJing"

,

"O"

:

"etcd"

,

"OU"

:

"system"

}

]

}

EOF

引數解析:
**hosts**

:包含的授權範圍,不在此範圍的的節點或者服務使用此證書就會報證書不匹配錯誤,證書如果不包含可能會出現無法連線的情況;

**Key:**

指定使用的加密演算法,一般使用rsa非對稱加密演算法(algo:rsa;size:2048)

**CN**

:Common Name,從證書中提取該欄位作為請求的使用者名稱 (User Name);瀏覽器使用該欄位驗證網站是否合法;CN是域名,也就是你現在使用什麼域名就寫什麼域名。

**C**

:國家(CN中國)

**ST**

:類似省份(如湖南省等)

**L**

:城市(如北京市)

**O**

:Organization,從證書中提取該欄位作為請求使用者所屬的組 (Group);

3)建立ca證書
建立CA證書並放入/etc/etcd/cert/

$ cfssl gencert -initca /etc/etcd/cert/ca-csr

.json

| cfssljson -bare /etc/etcd/cert/etcd-ca

2022

/

12

/

2815

:

34

:

42

[INFO] generating a

new

CA key

and

certificate from CSR

2022

/

12

/

2815

:

34

:

42

[INFO]

generate

received request

2022

/

12

/

2815

:

34

:

42

[INFO] received CSR

2022

/

12

/

2815

:

34

:

42

[INFO] generating key: ecdsa-

256
2022

/

12

/

2815

:

34

:

42

[INFO] encoded CSR

2022

/

12

/

2815

:

34

:

42

[INFO]

signed

certificate

with

serial number

235381723861351140457367252786107821197429045799

$ ls /etc/etcd/cert/etcd-ca*

/etc/etcd/cert/etcd-ca

.csr

/etc/etcd/cert/etcd-ca-key

.pem

/etc/etcd/cert/etcd-ca

.pem

2.2 頒發etcd證書

使用剛才的證書機構,根據提供的請求檔案向etcd頒發證書。
1)配置etcd請求csr檔案

$ cfssl print-defaults csr >

/etc/

etcd/cert/etcd-csr.

json

$ cat <<

EOF

>

/etc/

etcd/cert/etcd-csr.

json

{

"CN"

:

"etcd"

,

"hosts"

: [

"127.0.0.1"

,

"192.168.2.51"

,

"192.168.2.52"

,

"192.168.2.53"

],

"key"

: {

"algo"

:

"rsa"

,

"size"

:

2048

},

"names"

: [

{

"C"

:

"CN"

,

"ST"

:

"BeiJing"

,

"L"

:

"BeiJing"

,

"O"

:

"etcd"

,

"OU"

:

"system"

}

]

}

EOF

  • hosts:所有etcd節點的地址列表和本地迴環地址;
2)生成etcd證書
生成etcd證書並放入到/etc/etcd/cert/
$

cfssl gencert -ca=/etc/etcd/cert/etcd-ca.pem \

-ca-key=/etc/etcd/cert/etcd-ca-key.pem \

-config=/etc/etcd/cert/ca-config.json -profile=etcd \

/etc/etcd/cert/etcd-csr.json | cfssljson -bare /etc/etcd/cert/etcd


# 輸出:

2022/12/28 15:49:13 [INFO] generate received request

2022/12/28 15:49:13 [INFO] received CSR

2022/12/28 15:49:13 [INFO] generating key: rsa-2048

2022/12/28 15:49:13 [INFO] encoded CSR

2022/12/28 15:49:13 [INFO] signed certificate with serial number 456751516901369921492152169340720764647499480668

$ ls /etc/etcd/cert/

ca-config.json ca-csr.json etcd-ca.csr etcd-ca-key.pem etcd-ca.pem etcd.csr etcd-csr.json etcd-key.pem etcd.pem

# etcd.csr、etcd-key.pem、etcd.pem為新生成的證書檔案

引數解析
-

ca

-

key:指定

CA證書機構的私鑰;
-

config:指定

CA證書策略;
-

profile:指定使用

CA證書策略中的哪個模組

,即

CA配置檔案中的signing

.profiles.etcd引數;

etcd.pem:公鑰

etcd

-

key.pem:私鑰

2.3 證書分發

2.1和2.2操作均在etcd1節點操作,需要將相關的證書檔案分發到其它etcd節點。
$

scp /etc/etcd/cert/{etcd-ca.pem,etcd.pem,etcd-key.pem}

192.168

.

2.52:/etc/etcd/cert/
$

scp /etc/etcd/cert/{etcd-ca.pem,etcd.pem,etcd-key.pem}

192.168

.

2.53:/etc/etcd/cert/

三、部署etcd叢集

預設的2379埠為客戶端訪問埠,2380為etcd節點間通訊的埠。

3.1 下載二進位制包

$ wget -c https://github.com/etcd-io/etcd/releases/download/v3.5.5/etcd-v3.5.5-linux-amd64.tar.gz -k
$ tar -xf etcd-v3.5.5-linux-amd64.tar.gz
$ cp -p etcd-v3.5.5-linux-amd64/{etcd,etcdctl,etcdutl} /usr/local/bin/
$ ls /usr/local/bin/

etcd etcdctl etcdutl

$ etcd -version

etcd Version: 3.5.5

Git SHA: 19002cfc6

Go Version: go1.16.15

Go OS/Arch: linux/amd64

  • etcd:服務端;
  • etcdctl:etcd客戶端工具;
  • etcdutl:資料恢復工具,舊版是使用etcdctl完成資料的備份和恢復;

3.2 建立etcd配置檔案

1)etcd1節點配置檔案

$ cat /etc/etcd/etcd.conf

# Member(成員):

ETCD_NAME=

"etcd-1"

ETCD_DATA_DIR=

"/etc/etcd/etcd-data"

ETCD_SNAPSHOT_COUNT=

"5000"

ETCD_HEARTBEAT_INTERVAL=

"100"

ETCD_ELECTION_TIMEOUT=

"500"

ETCD_LISTEN_PEER_URLS=

"https://192.168.2.51:2380"

ETCD_LISTEN_CLIENT_URLS=

"https://192.168.2.51:2379,https://127.0.0.1:2379"
# Clustering(叢集):

ETCD_INITIAL_ADVERTISE_PEER_URLS=

"https://192.168.2.51:2380"

ETCD_INITIAL_CLUSTER_STATE=

"new"

ETCD_INITIAL_CLUSTER=

"etcd-1=https://192.168.2.51:2380,etcd-2=https://192.168.2.52:2380,etcd-3=https://192.168.2.52:2380"

ETCD_INITIAL_CLUSTER_TOKEN=

"etcd-cluster-1"

ETCD_ADVERTISE_CLIENT_URLS=

"https://192.168.2.51:2379"
# Security(安全):

ETCD_CLIENT_CERT_AUTH=

"true"

ETCD_CERT_FILE=

"/etc/etcd/cert/etcd.pem"

ETCD_KEY_FILE=

"/etc/etcd/cert/etcd-key.pem"

ETCD_TRUSTED_CA_FILE=

"/etc/etcd/cert/etcd-ca.pem"

ETCD_PEER_CLIENT_CERT_AUTH=

"true"

ETCD_PEER_CERT_FILE=

"/etc/etcd/cert/etcd.pem"

ETCD_PEER_KEY_FILE=

"/etc/etcd/cert/etcd-key.pem"

ETCD_PEER_TRUSTED_CA_FILE=

"/etc/etcd/cert/etcd-ca.pem"

2)etcd2節點配置檔案

$ cat /etc/etcd/etcd.conf

# [Member]成員

ETCD_NAME=

"etcd-2"

ETCD_DATA_DIR=

"/etc/etcd/etcd-data"

ETCD_SNAPSHOT_COUNT=

"5000"

ETCD_HEARTBEAT_INTERVAL=

"100"

ETCD_ELECTION_TIMEOUT=

"500"

ETCD_LISTEN_PEER_URLS=

"https://192.168.2.52:2380"

ETCD_LISTEN_CLIENT_URLS=

"https://192.168.2.52:2379,https://127.0.0.1:2379"
# Clustering(叢集)

ETCD_INITIAL_ADVERTISE_PEER_URLS=

"https://192.168.2.52:2380"

ETCD_INITIAL_CLUSTER_STATE=

"new"

ETCD_INITIAL_CLUSTER=

"etcd-1=https://192.168.2.51:2380,etcd-2=https://192.168.2.52:2380,etcd-3=https://192.168.2.53:2380"

ETCD_INITIAL_CLUSTER_TOKEN=

"etcd-cluster-1"

ETCD_ADVERTISE_CLIENT_URLS=

"https://192.168.2.52:2379"
# Security(安全)

ETCD_CLIENT_CERT_AUTH=

"true"

ETCD_CERT_FILE=

"/etc/etcd/cert/etcd.pem"

ETCD_KEY_FILE=

"/etc/etcd/cert/etcd-key.pem"

ETCD_TRUSTED_CA_FILE=

"/etc/etcd/cert/etcd-ca.pem"

ETCD_PEER_CLIENT_CERT_AUTH=

"true"

ETCD_PEER_CERT_FILE=

"/etc/etcd/cert/etcd.pem"

ETCD_PEER_KEY_FILE=

"/etc/etcd/cert/etcd-key.pem"

ETCD_PEER_TRUSTED_CA_FILE=

"/etc/etcd/cert/etcd-ca.pem"

3)etcd3節點配置檔案

$ cat /etc/etcd/etcd.conf

# [Member]成員

ETCD_NAME=

"etcd-3"

ETCD_DATA_DIR=

"/etc/etcd/etcd-data"

ETCD_SNAPSHOT_COUNT=

"5000"

ETCD_HEARTBEAT_INTERVAL=

"100"

ETCD_ELECTION_TIMEOUT=

"500"

ETCD_LISTEN_PEER_URLS=

"https://192.168.2.53:2380"

ETCD_LISTEN_CLIENT_URLS=

"https://192.168.2.53:2379,https://127.0.0.1:2379"
# Clustering(叢集)

ETCD_INITIAL_ADVERTISE_PEER_URLS=

"https://192.168.2.53:2380"

ETCD_INITIAL_CLUSTER_STATE=

"new"

ETCD_INITIAL_CLUSTER=

"etcd-1=https://192.168.2.51:2380,etcd-2=https://192.168.2.52:2380,etcd-3=https://192.168.2.53:2380"

ETCD_INITIAL_CLUSTER_TOKEN=

"etcd-cluster-1"

ETCD_ADVERTISE_CLIENT_URLS=

"https://192.168.2.53:2379"
# Security(安全)

ETCD_CLIENT_CERT_AUTH=

"true"

ETCD_CERT_FILE=

"/etc/etcd/cert/etcd.pem"

ETCD_KEY_FILE=

"/etc/etcd/cert/etcd-key.pem"

ETCD_TRUSTED_CA_FILE=

"/etc/etcd/cert/etcd-ca.pem"

ETCD_PEER_CLIENT_CERT_AUTH=

"true"

ETCD_PEER_CERT_FILE=

"/etc/etcd/cert/etcd.pem"

ETCD_PEER_KEY_FILE=

"/etc/etcd/cert/etcd-key.pem"

ETCD_PEER_TRUSTED_CA_FILE=

"/etc/etcd/cert/etcd-ca.pem"

4)引數解析

[Cluster tag]

#叢集標記部分

ETCD_INITIAL_CLUSTER:叢集節點地址(為啟動初始化叢集配置)

ETCD_INITIAL_CLUSTER_STATE:加入叢集的當前狀態,new是新叢集,existing表示加入已有叢集

ETCD_INITIAL_CLUSTER_TOKEN:在啟動期間用於叢集初始化標記,叢集Token(叢集名稱)

ETCD_INITIAL_ADVERTISE_PEER_URLS:列出該成員URL,以便通告給其他成員,用於在叢集中通訊etcd資料;

ETCD_ADVERTISE_CLIENT_URLS:列出該成員客戶端URL,通告給叢集中的其他成員;
[Member tag]

#成員標記部分

ETCD_NAME:當前節點名稱,與

`ETCD_INITIAL_CLUSTER`

中的一致

ETCD_DATA_DIR:

#etcd資料目錄

ETCD_HEARTBEAT_INTERVAL:心跳間隔時間 (單位 毫秒).預設

100

ETCD_ELECTION_TIMEOUT: 選舉的超時時間(單位 毫秒).預設

1000

ETCD_LISTEN_PEER_URLS:監聽叢集內部的URL列表,為本叢集其他節點提供的服務監聽URL地址(內部)

ETCD_LISTEN_CLIENT_URLS:為

`客戶端`

提供的服務監聽URL地址(外部);

# Security(安全):

ETCD_CLIENT_CERT_AUTH: 是否啟用客戶端證書認證,當這個選項被設定時,etcd 將為受信任CA簽名的客戶端證書檢查所有的傳入的 HTTPS 請求,不能提供有效客戶端證書的請求將會失敗。

ETCD_PEER_CERT_FILE: etcd的peers通訊的公鑰證書,叢集各節點相互認證使用的證書(-crt檔案)

ETCD_PEER_KEY_FILE: etcd的peers通訊的私鑰, 叢集各節點相互認證使用的私鑰(-key檔案)

ETCD_PEER_CLIENT_CERT_AUTH:是否開啟peer client 證書驗證

ETCD_PEER_TRUSTED_CA_FILE:CA根證書檔案,peer server TLS 信任證書檔案路徑.。

ETCD_PEER_AUTO_TLS=

"true"

ETCD_CERT_FILE:指定etcd的證書(etcd.pem),客戶端伺服器TLS證書檔案,供客戶端訪問

ETCD_KEY_FILE:指定etcd的私鑰,客戶端訪問認證

ETCD_CLIENT_CERT_AUTH=

"true"#是否開啟客戶端證書認證;

ETCD_TRUSTED_CA_FILE: 指定CA的證書(ca.pem或ca.crt),

ETCD_AUTO_TLS=

"true"

使用生成證書的客戶端TLS

#####################################################################################################
# [Member]成員

--name=etcd1

--data-dir=

/etc/

etcd/etcd-data

#etcd資料目錄,啟動時會z

--snapshot-count=

5000

--heartbeat-interval=

100#心跳間隔的時間

--election-timeout=

500#選舉超時的時間(預設100)

--

listen

-peer-urls https:

//192.168

.

2.52

:

2380#叢集節點間通訊監聽地址(本機IP:2380埠)

--

listen

-client-urls https:

//192.168

.

2.52

:

2379

,https:

//127.0

.

0

.

1

:

2379#監聽客戶端訪問地址
# Clustering(叢集)

--initial-advertise-peer-urls=https:

//192.168

.

2.52

:

2380#本機IP,叢集通告地址

--initial-cluster infra

0

=https:

//192.168

.

2.51

:

2380

,infra1=https:

//192.168

.

2.52

:

2380

,infra2=https:

//10.0

.

1.12

:

2380

\

--initial-cluster-

state

new

#初始叢集狀態

--advertise-client-urls https:

//192.168

.

2.52

:

2379#向客戶端通告此成員地址

--initial-cluster-token etcd-cluster-

1#初始叢集令牌
# Security(安全):

--client-cert-auth=

"true"#是否啟用客戶端證書認證

--cert-file=

/path/

to/infra1-client.crt

#客戶端、服務端通訊的TLS證書檔案

--key-file=

/path/

to/infra1-client.key

#客戶端、伺服器通訊的TLS金鑰檔案

--trusted-ca-file=

/path/

to/ca-client.crt

#客戶端伺服器TLS受信任CA證書檔案的路徑。

--peer-client-cert-auth=

"true"#是否啟用叢集節點間通訊認證

--peer-cert-file=

/path/

to/infra1-peer.crt

#叢集節點間通訊TLS證書檔案

--peer-key-file=

/path/

to/infra1-peer.key

#叢集節點間通訊TLS金鑰檔案(私鑰)

--peer-trusted-ca-file=ca-peer.crt

#叢集節點間通訊TLS受信任CA檔案的路徑

3.3 建立服務啟動檔案

每個etcd節點的服務啟動檔案內容一致。

$ cat /usr/lib/systemd/system/etcd.service

[Unit]

Description=Etcd Server

After=network.target

After=network-online.target

Wants=network-online.target
[Service]

Type=notify

EnvironmentFile=/etc/etcd/etcd.conf

#WorkingDirectory=/etc/etcd/etcd-data

ExecStart=/usr/local/bin/etcd

Restart=on-failure

RestartSec=5

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

  • WorkingDirectory:etcd資料目錄,與ETCD_DATA_DIR會衝突;
  • EnvironmentFile:指定etcd配置檔案;
  • ExecStart:啟動指令;

3.4 啟動etcd叢集

1)重新載入服務配置
$

systemctl daemon-reload

2)啟動etcd服務
$ systemctl start etcd.service
$ systemctl enable etcd.service
$ systemctl status etcd

3.5 檢視叢集狀態

$ etcdctl endpoint health --

write

-out=table \

--endpoints=https:

//192.168

.

2.51

:

2379

,https:

//192.168

.

2.52

:

2379

,https:

//192.168

.

2.53

:

2379

\

--cacert=

/etc/

etcd/cert/etcd-ca.pem --cert=

/etc/

etcd/cert/etcd.pem --key=

/etc/

etcd/cert/etcd-key.pem

# shu'chu

+---------------------------+--------+-------------+-------+

| ENDPOINT | HEALTH | TOOK | ERROR |

+---------------------------+--------+-------------+-------+

| https:

//192.168

.

2.52

:

2379

| true |

20.340362

ms | |

| https:

//192.168

.

2.53

:

2379

| true |

26.419585

ms | |

| https:

//192.168

.

2.51

:

2379

| true |

26.196417

ms | |

+---------------------------+--------+-------------+-------+

  • –write-out=table/-w table:以表格形式輸出結果;
  • –cacert: 指定CA證書
  • –cert:指定etcd服務證書
  • –key:指定etcd私鑰
  • –endpoints:指定叢集地址
  • –HEALTH:是否健康;
連結:https://www.cnblogs.com/hahaha111122222/p/17395826.html
(版權歸原作者所有,侵刪)
文末福利一

馬哥教育三月IT充電計劃

【 特惠入學+你學習我返現 】
💰全款節省高至 4500 元!
🎁直播間專屬禮包+3倍積分!
📚贈實戰專題
🏆獎學金等你來拿!高達 500 元。
💎贈送阿里云云計算 ACP 考試券(價值 1200 元)
💎活動期間報名,送鑽石學習卡。
想系統學習網路安全的師傅,千萬不要錯過!
掃描下方二維碼,瞭解活動詳情↓
【參與方式】
掃描二維碼找豆豆
文末福利二
【AI大模型】訓練營(有回放)
馬哥教育創始人 馬哥親講
無論你是渴望提升技術能力的 IT 工程師,
還是希望深入瞭解大模型應用的運維人員或開發者,
本次大模型訓練營公開課都將為你提供寶貴的學習機會。
內容乾貨,還有現場抽獎和免費資料可領取↑
趕緊掃描下方二維碼,報名直播吧↑(有回放)


相關文章