一、Etcd簡介
Etcd是Kubernetes集群中的一個十分重要的組件,用於保存集群所有的網絡配置和對象的狀態信息。
整個kubernetes系統中一共有兩個服務需要用到etcd用來協同和存儲配置,分別是:
- 網絡插件flannel、對於其它網絡插件也需要用到etcd存儲網絡的配置信息
- kubernetes本身,包括各種對象的狀態和元信息配置
注意:flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API。
二、安裝etcdctl
1.下載文件
此處使用的版本為v3.4.15
地址:https://github.com/etcd-io/etcd/releases/download/v3.4.15/etcd-v3.4.15-linux-amd64.tar
2.解壓文件
tar -xvf etcd-v3.4.15-linux-amd64.tar
cp etcd-v3.4.15-linux-amd64/etcdctl /usr/local/bin/
// 檢查版本
[root@node01 ~]# etcdctl version
etcdctl version: 3.4.15
API version: 3.4
3.設置環境變量
當操作kubernetes時,需設置環境變量 ETCDCTL_API=3
export ETCDCTL_API=3
# 或者在`/etc/profile`文件中添加環境變量
vi /etc/profile
...
export ETCDCTL_API=3
...
source /etc/profile
# 或者在命令執行前加 ETCDCTL_API=3
ETCDCTL_API=3 etcdctl --endpoints=$ENDPOINTS member list
三、常用命令
1.證書參數
如果etcd設置了證書訪問,則需要添加證書相關參數:
etcdctl --endpoints=$ENDPOINTS --cacert=<ca-file> --cert=<cert-file> --key=<key-file> <command>
在master主機上命令如下:
etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt \
--key /etc/kubernetes/pki/etcd/server.key \
--cert /etc/kubernetes/pki/etcd/server.crt \
get / --prefix --keys-only
前三行為固定值,可以設置別名,避免每次都要輸入證書參數。
alias etcdctl='etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt --key /etc/kubernetes/pki/etcd/server.key --cert /etc/kubernetes/pki/etcd/server.crt'
2.查找
// 按key查找
etcdctl get foo
// 基於相同前綴查找
etcdctl get foo --prefix
// 列出所有的key
etcdctl get / --prefix --keys-only
3.修改
// 增加
etcdctl put key "value"
// 刪除
etcdctl del key
etcdctl del key --prefix
四、正文
1.環境准備
1個master(172.16.99.31)節點,2個node節點,新建一個命名空間dev,並在dev和default下創建deployment
[root@master01 ~]# kubectl create -f default-nginx.yaml
deployment.apps/default-nginx created
[root@master01 ~]# kubectl create -f dev-nginx.yaml
deployment.apps/dev-nginx created
2.查看pod狀態
3.生成etcd快照
生成快照命令
ETCDCTL_API=3 etcdctl \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--key /etc/kubernetes/pki/etcd/server.key \
--cert /etc/kubernetes/pki/etcd/server.crt \
snapshot save /root/kubeback/snapshot.db
由於已經配置過別名和環境變量,所以直接執行以下命令:
etcdctl snapshot save /root/kubeback/snapshot.db
4.刪除所有deployment
查看pod是否被刪除
5.停止etcd進程
將etcd的yaml文件移動到別的目錄即可,k8s會自動停止etcd相關的進程和pod。
當停止etcd時,正在運行的pod不受影響。
mv /etc/kubernetes/manifests/etcd.yaml /root/kubeback/
此時kubectl命令執行會提示 Unable to connect to the server: net/http: TLS handshake timeout
查看etcd進程是否停止
6.移除etcd數據
mv /var/lib/etcd /var/lib/etcd.bak
如果這里不移除等下恢復快照時會提示文件夾已存在。
7.恢復數據
單master集群執行以下命令恢復快照:
etcdctl snapshot restore /root/kubeback/snapshot.db --data-dir=/var/lib/etcd
多master集群(未驗證):
需要將snapshot.db拷貝到另外的master節點上,分別在各個master節點上恢復快照。
[root@etcd1 ~]# etcdctl snapshot restore snapshot.db --name etcd1 --initial-cluster etcd1=http://x.x.x.x1:2380,etcd2=http://x.x.x.x2:2380,etcd3=http://x.x.x.x3:2380 --initial-advertise-peer-urls http://x.x.x.x1:2380 --data-dir /var/lib/etcd
[root@etcd2 ~]# etcdctl snapshot restore snapshot.db --name etcd2 --initial-cluster etcd1=http://x.x.x.x1:2380,etcd2=http://x.x.x.x2:2380,etcd3=http://x.x.x.x3:2380 --initial-advertise-peer-urls http://x.x.x.x2:2380 --data-dir /var/lib/etcd
[root@etcd3 ~]# etcdctl snapshot restore snapshot.db --name etcd3 --initial-cluster etcd1=http://x.x.x.x1:2380,etcd2=http://x.x.x.x2:2380,etcd3=http://x.x.x.x3:2380 --initial-advertise-peer-urls http://x.x.x.x3:2380 --data-dir /var/lib/etcd
8.恢復etcd
將etcd.yaml移動到原本的位置,等待k8s恢復狀態。
mv /root/kubeback/etcd.yaml /etc/kubernetes/manifests/
此時可能需要等待較長時間,kubectl命令會提示拒絕連接。
The connection to the server 172.16.99.31:6443 was refused - did you specify the right host or port?
9.檢查pod
兩個命名空間的pod均已恢復為備份時的狀態。
五、查看etcd元數據
1.etcdctl
通過etcdctl的get命令可以獲取etcd的數據,但是etcd中存儲的並不是json的原文,而是protocol buffer序列化后的數據,可讀性很差。
2.Etcd helper
使用Etcd helper可以查看etcd中完整的json數據
下載編譯
Github地址:https://github.com/p0lyn0mial/etcdhelper
git clone https://github.com/p0lyn0mial/etcdhelper.git
cd etcdhelper
set GOARCH=amd64
set GOOS=linux
go build .
使用
設置證書參數
-key
- points tomaster.etcd-client.key
-cert
- points tomaster.etcd-client.crt
-cacert
- points toca.crt
查看etcd數據
ls
- list all keys starting with prefixget
- get the specific value of a keyput
- put the specific value under a keydump
- dump the entire contents of the etcd
設置別名簡化操作
alias etcdhelper='/root/etcdhelper --cacert /etc/kubernetes/pki/etcd/ca.crt --key /etc/kubernetes/pki/etcd/server.key --cert /etc/kubernetes/pki/etcd/server.crt'
將編譯好的二進制文件上傳至服務器,執行
etcdhelper get /registry/pods/dev/dev-nginx-7848d4b86f-clkb8