二進位制部署k8s叢集之部署Etcd叢集
一、Etcd簡介
Etcd 是一個分散式鍵值儲存系統,Kubernetes使用Etcd進行資料儲存,所以先準備一個Etcd資料庫,為解決Etcd單點故障,應採用叢集方式部署,這裡使用3臺組建叢集,可容忍1臺機器故障,當然,你也可以使用5臺組建叢集,可容忍2臺機器故障。
Etcd是go語言編寫。
1.1 環境介紹
節點名稱 | IP | 角色 |
---|---|---|
k8s-master01 | 10.154.0.111 | etcd-1 |
k8s-node01 | 10.154.0.112 | etcd-2 |
k8s-node02 | 10.154.0.113 | etcd-3 |
注:為了節省機器,這裡與K8s節點機器複用。也可以獨立於k8s叢集之外部署,只要apiserver能連線到就行。
1.2 為什麼要用到證書?
因為etcd叢集使用https通訊,k8s叢集也是使用https通訊的,所以他們都要用到證書。
二、部署Etcd叢集
2.1 使用cfssl工具
cfssl是一個開源的證書管理工具,使用json檔案生成證書,相比openssl更方便使用。
官方下載地址:https://github.com/cloudflare/cfssl/releases
目前最新版本為1.6.1
找任意一臺伺服器操作,這裡用etch-1節點。
#建立資料夾,上傳cfssl工具 mkdir -p ~/tools/cfssl cd $_ chmod +x * mv cfssl_1.6.1_linux_amd64 /usr/local/bin/cfssl mv cfssljson_1.6.1_linux_amd64 /usr/local/bin/cfssljson mv cfssl-certinfo_1.6.1_linux_amd64 /usr/bin/cfssl-certinfo #如果你上傳的是壓縮包,使用該命令解壓 tar zxvf cfssl.tar.gz #檢視cfssl版本 cfssl version
cfssl,cfssl-certinfo,cfssljson就是生成證書所需要的三個工具
2.2 生成Etcd證書
cfssl證書生成有四步
- 編寫CA配置檔案,包含頒發機構配置資訊,如證書有效期等
- 編寫簽名請求檔案,包含申請機構,國家,城市,加密演算法等資訊
- 根據簽名請求檔案,生成根證書
- 使用根證書,CA配置檔案,簽名請求檔案簽發客戶端證書
1.自簽證書頒發機構(CA)
建立工作目錄:
mkdir -p ~/TLS/{etcd,k8s}
cd ~/TLS/etcd
建立頒發機構配置資訊:
cat > ca-config.json << EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "www": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF
- expiry:為有效期,預設87600小時,即一年有效期
CA 配置檔案用於配置根證書的使用場景 (profile) 和具體引數 (usage,過期時間、服務端認證、客戶端認證、加密等),後續在簽名其它證書時需要指定特定場景。
建立簽名請求檔案
cat > ca-csr.json << EOF
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"O": "tx",
"ST": "Beijing"
}
]
}
EOF
- algo:加密演算法
- C:國家
- L:城市
- O:組織
生成根證書
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
:'
生成檔案介紹
ca.pem :ca的證書
ca.csr :ca的簽名請求
ca-key.pem : ca的私鑰
'
2. 使用自籤CA證書籤發Etcd證書
建立簽名請求檔案
cat > etcd-csr.json << EOF
{
"CN": "etcd",
"hosts": [
"10.154.0.111",
"10.154.0.112",
"10.154.0.113"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
檔案包含了所有的etcd叢集機器的ip地址,加密演算法,國家,城市等資訊
為了方便後期擴容可以多寫幾個預留的IP。
簽發客戶端證書
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=www etcd-csr.json | cfssljson -bare etcd
2.3 下載Etcd
目前最新版本為3.5.1
官方下載地址:https://github.com/etcd-io/etcd/releases/download/v3.5.1/etcd-v3.5.1-linux-amd64.tar.gz
2.4 部署Etcd叢集
以下在etcd-1上操作,為簡化操作,待會將etcd-1生成的所有檔案拷貝到etcd-2和etcd-3
1. 建立工作目錄並解壓二進位制包
mkdir /opt/etcd/{bin,cfg,ssl} -p
tar zxvf etcd-v3.5.1-linux-amd64.tar.gz
mv etcd-v3.5.1-linux-amd64/{etcd,etcdctl} /opt/etcd/bin
2. 建立etcd配置檔案
注意先刪掉註釋再複製到配置檔案中
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://10.154.0.111:2380" #叢集元件通訊用的埠
ETCD_LISTEN_CLIENT_URLS="https://10.154.0.111:2379" #客戶端連線etcd的埠
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.154.0.111:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://10.154.0.111:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://10.154.0.111:2380,etcd-2=https://10.154.0.112:2380,etcd-3=https://10.154.0.113:2380" #叢集中的三個節點的IP
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #TOKEN可以自定義,相當於叢集互相連線需要簡單認證
ETCD_INITIAL_CLUSTER_STATE="new" #new代表加入的新叢集
EOF
-
ETCD_NAME:節點名稱,叢集中唯一
-
ETCD_DATA_DIR:資料目錄
-
ETCD_LISTEN_PEER_URLS:叢集通訊監聽地址
-
ETCD_LISTEN_CLIENT_URLS:客戶端訪問監聽地址
-
ETCD_INITIAL_ADVERTISE_PEER_URLS:叢集通告地址
-
ETCD_ADVERTISE_CLIENT_URLS:客戶端通告地址
-
ETCD_INITIAL_CLUSTER:叢集節點地址
-
ETCD_INITIAL_CLUSTER_TOKEN:叢集Token
-
ETCD_INITIAL_CLUSTER_STATE:加入叢集的當前狀態,new是新叢集,existing表示加入已有叢集
3. 配置systemd管理etcd
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/etcd.pem \
--key-file=/opt/etcd/ssl/etcd-key.pem \
--peer-cert-file=/opt/etcd/ssl/etcd.pem \
--peer-key-file=/opt/etcd/ssl/etcd-key.pem \
--trusted-ca-file=/opt/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/opt/etcd/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
4. 拷貝剛才生成的證書
把剛才生成的證書拷貝到配置檔案中的路徑:
cp ~/TLS/etcd/ca*pem ~/TLS/etcd/etcd*pem /opt/etcd/ssl/
5. 將上面etcd-1所有生成的檔案拷貝到etcd-2和etcd-3
scp -r /opt/etcd/ [email protected]:/opt/
scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/
scp -r /opt/etcd/ [email protected]:/opt/
scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/
然後在etcd-2和etcd-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://10.154.0.111:2380" # 修改此處為當前伺服器IP
ETCD_LISTEN_CLIENT_URLS="https://10.154.0.111:2379" # 修改此處為當前伺服器IP
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.154.0.111:2380" # 修改此處為當前伺服器IP
ETCD_ADVERTISE_CLIENT_URLS="https://10.154.0.111:2379" # 修改此處為當前伺服器IP
ETCD_INITIAL_CLUSTER="etcd-1=https://10.154.0.111:2380,etcd-2=https://10.154.0.113:2380,etcd-3=https://10.154.0.114:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
6. 啟動並設定開機啟動
#重新載入一下service的配置檔案
systemctl daemon-reload
systemctl start etcd
systemctl enable etcd
注意:因為使用的是叢集,所以至少要保證兩臺節點同時啟動。
如果只啟動一臺etcd伺服器,那麼啟動介面會卡住,檢視日誌會發現該機器正在等待其他叢集啟動
7.如果報錯可以檢視日誌
journalctl -u etcd >error.log
vim error.log
不方便檢視可匯出到檔案再看
8. 檢視叢集狀態
在任意節點執行都可以
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/etcd.pem --key=/opt/etcd/ssl/etcd-key.pem --endpoints="https://10.154.0.111:2379,https://10.154.0.112:2379,https://10.154.0.113:2379" endpoint health
如果輸出上面資訊,就說明叢集部署成功。如果有問題第一步先看日誌:/var/log/message
或 journalctl -u etcd