一、etcd服務架構
Etcd 是一個分布式鍵值存儲系統,Kubernetes 使用 Etcd 進行數據存儲,所以先
準備一個 Etcd 數據庫,為解決 Etcd 單點故障,應采用集群方式部署,這里使用 3
臺組建集群,可容忍 1 臺機器故障,當然,你也可以使用 5 臺組建集群,可容忍 2
臺機器故障。
節點名稱 | IP |
---|---|
etcd-1 | 192.168.1.20 |
etcd-2 | 192.168.1.21 |
etcd-3 | 192.168.1.22 |
注:為了節省機器,這里與 K8s 節點機器復用。也可以獨立于 k8s 集群之外部署, 只要 apiserver 能連接到就行。
通信架構(均采用https通信):
所以這里需要生成證書。
二、 準備 cfssl 證書生成工具
cfssl 是一個開源的證書管理工具,使用 json 文件生成證書,相比 openssl 更方便
使用。
找任意一臺服務器操作,這里用 Master 節點。
# 下載cfssl工具(二進制可執行文件)
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
# 授可執行權限
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
# 移動到bin目錄,方便直接在命令行使用該工具命令
mv cfssl_linux-amd64 /usr/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
2.1 自簽證書頒發機構(CA)-- 根證書
- 創建工作目錄:
mkdir -p ~/TLS/{etcd,k8s}
cd ~/TLS/etcd
- 自簽 CA(配置文件):
# 重定向寫入ca配置文件
cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF# 重定向寫入ca-csr文件
cat > ca-csr.json << EOF
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF
- 生成證書:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
會生成 ca.pem 和 ca-key.pem 文件。
2.2 使用自簽 CA (根證書)簽發 Etcd的HTTPS 證書
- 創建證書申請文件:
# host部分是添加可信任ip,按實際情況添加
cat > server-csr.json << EOF
{
"CN": "etcd",
"hosts": [
"192.168.1.20",
"192.168.1.21",
"192.168.1.22"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
注:上述文件 hosts 字段中 IP 為所有 etcd 節點的集群內部通信 IP,一個都不能少! 為了方便后期擴容可以多寫幾個預留的
IP。
- 生成證書:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
會生成 server.pem 和 server-key.pem 文件
三、 從 Github 下載二進制文件
下載地址:https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-
v3.4.9-linux-amd64.tar.gz
執行下載(版本可以按需選擇):
wget https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
四、 部署 Etcd 集群
以下在節點 1 上操作,為簡化操作,待會將節點 1 生成的所有文件拷貝到節點 2 和 節點 3
4.1 創建工作目錄并解壓二進制包
mkdir /opt/etcd/{bin,cfg,ssl} -p
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/
4.2 創建 etcd 配置文件
# ip根據自己機器情況修改
cat > /opt/etcd/cfg/etcd.conf << EOF
#[Member]
ETCD_NAME="etcd-1"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.1.20:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.1.20:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.20:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.20:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.1.20:2380,etcd-2=https://
192.168.1.21:2380,etcd-3=https://192.168.1.22:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
ETCD_NAME:節點名稱,集群中唯一
ETCD_DATA_DIR:數據目錄
ETCD_LISTEN_PEER_URLS:集群通信監聽地址
ETCD_LISTEN_CLIENT_URLS:客戶端訪問監聽地址
ETCD_INITIAL_ADVERTISE_PEERURLS:集群通告地址
ETCD_ADVERTISE_CLIENT_URLS:客戶端通告地址
ETCD_INITIAL_CLUSTER:集群節點地址
ETCD_INITIALCLUSTER_TOKEN:集群 Token
ETCD_INITIALCLUSTER_STATE:加入集群的當前狀態,new 是新集群,existing 表示加入已有集群
4.3. systemd 管理 etcd
# 寫入etcd.service文件
cat > /usr/lib/systemd/system/etcd.service << EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/opt/etcd/cfg/etcd.conf
ExecStart=/opt/etcd/bin/etcd \
--cert-file=/opt/etcd/ssl/server.pem \
--key-file=/opt/etcd/ssl/server-key.pem \
--peer-cert-file=/opt/etcd/ssl/server.pem \
--peer-key-file=/opt/etcd/ssl/server-key.pem \
--trusted-ca-file=/opt/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
--logger=zap
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
4.4. 拷貝剛才生成的證書
把剛才生成的證書拷貝到配置文件中的路徑:
cp ~/TLS/etcd/ca*pem ~/TLS/etcd/server*pem /opt/etcd/ssl/
4.5. 啟動并設置開機啟動
systemctl daemon-reload
systemctl start etcd
systemctl enable etcd
4.6. 將上面節點 1 所有生成的文件拷貝到節點 2 和節點 3
scp -r /opt/etcd/ root@192.168.1.21:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.1.21:/usr/lib/systemd/system/
scp -r /opt/etcd/ root@192.168.1.22:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.1.22:/usr/lib/systemd/system/
然后在節點 2 和節點 3 分別修改 etcd.conf 配置文件中的節點名稱和當前服務器IP:
vi /opt/etcd/cfg/etcd.conf
#[Member]
ETCD_NAME="etcd-1" # 修改此處,節點 2 改為 etcd-2,節點 3 改為 etcd-3
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.31.71:2380" # 修改此處為當前服務器 IP
ETCD_LISTEN_CLIENT_URLS="https://192.168.31.71:2379" # 修改此處為當前服務器 IP
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.71:2380" # 修改此處為當前服務器
IP
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.71:2379" # 修改此處為當前服務器 IP
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.71:2380,etcd-2=https://192.168.31.72:2380,etcd-3=https://192.168.31.73:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
最后啟動 etcd 并設置開機啟動,同上。
4.7 查看集群狀態
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.1.20:2379,https://192.168.1.21:2379,https://192.168.1.22:2379" endpoint health --write-out=table
輸出:
+----------------------------+--------+-------------+-------+
| ENDPOINT | HEALTH | TOOK | ERROR |
+----------------------------+--------+-------------+-------+
| https://192.168.1.20:2379 | true | 10.301506ms | |
| https://192.168.1.21:2379 | true | 12.87467ms | |
| https://192.168.1.22:2379 | true | 13.225954ms | |
+----------------------------+--------+-------------+-------+
. 如果輸出上面信息,就說明集群部署成功。
. 如果有問題第一步先看日志:/var/log/message 或 journalctl -u etcd