k8s 中使用 etcd 快照恢復集群數據


一、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狀態

Snipaste_2021-03-18_13-39-03.png

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

Snipaste_2021-03-18_14-12-16.png

4.刪除所有deployment

Snipaste_2021-03-18_11-28-48.png
查看pod是否被刪除
Snipaste_2021-03-18_14-14-15.png

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 timeoutSnipaste_2021-03-18_14-18-27.png
查看etcd進程是否停止
Snipaste_2021-03-18_14-20-01.png

6.移除etcd數據

mv /var/lib/etcd /var/lib/etcd.bak

如果這里不移除等下恢復快照時會提示文件夾已存在。

7.恢復數據

單master集群執行以下命令恢復快照:

etcdctl snapshot restore /root/kubeback/snapshot.db --data-dir=/var/lib/etcd

Snipaste_2021-03-18_14-39-18.png
多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均已恢復為備份時的狀態。
Snipaste_2021-03-18_14-48-17.png

五、查看etcd元數據

1.etcdctl

通過etcdctl的get命令可以獲取etcd的數據,但是etcd中存儲的並不是json的原文,而是protocol buffer序列化后的數據,可讀性很差。
Snipaste_2021-03-18_17-51-10.png

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 to master.etcd-client.key
  • -cert - points to master.etcd-client.crt
  • -cacert - points to ca.crt

查看etcd數據

  • ls - list all keys starting with prefix
  • get - get the specific value of a key
  • put - put the specific value under a key
  • dump - 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

Snipaste_2021-03-18_18-03-43.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM