目前,仍有很多etcd以容器的方式运行。在多种安装方式中,大部分仍运行在容器中。比如,rancher安装,kubeadm,minikube(以pod的形式运行)。所以,我们可以在宿主机上使用etcdctl操作容器中的etcd
环境准备
- etcd的运行
root@node45 certs]# ps -ef | grep etcd
root 7101 7081 1 11:15 ? 00:02:17 etcd --advertise-client-urls=https://192.168.5.45:2379 --cert-file=/var/lib/minikube/certs/etcd/server.crt --client-cert-auth=true --data-dir=/var/lib/minikube/etcd --initial-advertise-peer-urls=https://192.168.5.45:2380 --initial-cluster=node45=https://192.168.5.45:2380 --key-file=/var/lib/minikube/certs/etcd/server.key --listen-client-urls=https://127.0.0.1:2379,https://192.168.5.45:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://192.168.5.45:2380 --name=node45 --peer-cert-file=/var/lib/minikube/certs/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/var/lib/minikube/certs/etcd/peer.key --peer-trusted-ca-file=/var/lib/minikube/certs/etcd/ca.crt --proxy-refresh-interval=70000 --snapshot-count=10000 --trusted-ca-file=/var/lib/minikube/certs/etcd/ca.crt
- etcdctl安装
wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
tar zxvf etcd-v3.4.13-linux-amd64.tar.gz
mv etcd-v3.4.13-linux-amd64/etcdctl /usr/bin
基础命令检查
- endpoint health
ECTD_API=3 etcdctl --cacert=$PWD/etcd/ca.crt --cert=$PWD/etcd/server.crt --key=$PWD/etcd/server.key -endpoints=https://192.168.5.45:2379 endpoint health
- get
# 查看所有的key
ECTD_API=3 etcdctl --cacert=$PWD/etcd/ca.crt --cert=$PWD/etcd/server.crt --key=$PWD/etcd/server.key --endpoints=https://192.168.5.45:2379 get / --prefix --keys-only
# 查看某一个key
ECTD_API=3 etcdctl --cacert=$PWD/etcd/ca.crt --cert=$PWD/etcd/server.crt --key=$PWD/etcd/server.key --endpoints=https://192.168.5.45:2379 get /registry/namespaces/default
实验
- 创建namespace etcd-test之后,备份
[root@node45 certs]# pwd
/var/lib/minikube/certs
kubectl create ns etcd-test
ECTD_API=3 etcdctl --cacert=$PWD/etcd/ca.crt --cert=$PWD/etcd/server.crt --key=$PWD/etcd/server.key --endpoints=https://192.168.5.45:2379 snapshot save /tmp/etcd-snapshot-`date +%Y%m%d`.db
- 删除namespace etcd-test,再恢复
kubectl delete ns etcd-test
rm -rf /var/lib/minikube/etcd/
ECTD_API=3 etcdctl --cacert=$PWD/etcd/ca.crt --cert=$PWD/etcd/server.crt --key=$PWD/etcd/server.key --endpoints=https://192.168.5.45:2379 snapshot restore /tmp/etcd-snapshot-20201104.db --name=node45 --initial-cluster=node45=https://192.168.5.45:2380 --initial-advertise-peer-urls=https://192.168.5.45:2380 --data-dir=/var/lib/minikube/etcd
注意: restore对应的参数需要与之前etcd启动的参数一一对应。
- 查看
[root@node45 certs]# kubectl get pod -n kube-system | grep etcd
etcd-node45 1/1 Running 1 3h26m
[root@node45 certs]# kubectl get ns
NAME STATUS AGE
default Active 3h27m
etcd-test Active 30m
kube-node-lease Active 3h27m
kube-public Active 3h27m
kube-system Active 3h27m
[root@node45 certs]#
注: etcd-node45重启过一次(因为删除了之前的etcd内容),同时,namespace etcd-test也恢复了。
其他
- 在操作etcd时,最好能够先将kube-apiserver停止,再暂停etcd,之后再执行恢复操作
- 如果是以rancher或者二进制的方式直接安装的k8s,是可以暂停容器或者停止进程的。但是,如果以kubeadm,minikube安装的k8s,etcd都是以pod的形式运行的,因此,无法停止pod,可以直接删除原有的数据之后,执行
snapshot restore
命令。 - 在实际生产过程中,为了防止etcd数据丢失,可以编写定时任务脚本,备份etcd中的数据,脚本如下:
[root@node45 certs]# cat /tmp/save_etcd
# /bin/bash
ETCD_PATH=/var/lib/minikube/certs
CACERT=$ETCD_PATH/etcd/ca.crt
CERT=$ETCD_PATH/etcd/server.crt
KEY=$ETCD_PATH/etcd/server.key
ENDPOINTS=https://192.168.5.45:2379
ETCDCTL_API=3 etcdctl \
--cacert="${CACERT}" --cert="${CERT}" --key="${KEY}" \
--endpoints=${ENDPOINTS} \
snapshot save /etcd-backup/etcd-snapshot-`date +%Y%m%d%H%M%S`.db