本章概述
- etcd常用命令
- etcd数据备份恢复
4.1 etcd常用命令
etcd有多个不同的API访问版本,v1版本已经废弃,etcd v2 和 v3 本质上是共享同一套 raft 协议代码的两个独立的应用,接口不一样,存储不一样,数据互相隔离。也就是说如果从 Etcd v2 升级到 Etcd v3,原来v2 的数据还是只能用 v2 的接口访问,v3 的接口创建的数据也只能访问通过 v3 的接 口访问。
目前etcdctl默认使用v3版本,可以通过指定版本来使用不同的版本
即:ETCDCTL_API=3
注意:目前新版本k8s已经无法再使用v2版本的etcd
etcd客户端命令:etcdctl
etcdctl member list #查看etcd成员
第一列:etcdmember的id
第二列:etcd member的状态
第三列:etcd member名称
第四列:etcd member集群端口
第五列:etcd member客户端端口
第六列:是否在同步数据,false表示没有在同步数据
验证当前etcd所有成员状态(在etcd节点执行以下命令)
#export NODE_IPS="172.31.7.106 172.31.7.107 172.31.7.108" #声明node ip
#for ip in ${NODE_IPS}; do ETCDCTL_API=3 /usr/local/bin/etcdctl --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health; done
备注:该命令可用于监控,获取etcd节点的健康状况
以表格方式显示节点详细状态:
export NODE_IPS="172.31.7.106 172.31.7.107 172.31.7.108"
for ip in ${NODE_IPS}; do ETCDCTL_API=3 /usr/bin/etcdctl --write-out=table endpoint status --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem; done
查看etcd数据信息: etcdctl get
etcdctl get / --prefix --keys-only #以路径的方式所有key信息
pod信息:
etcdctl get / --prefix --keys-only | grep pod
namespace信息:
etcdctl get / --prefix --keys-only | grep namespaces
控制器信息:
etcdctl get / --prefix --keys-only | grep deployment
calico组件信息:
etcdctl get / --prefix --keys-only | grep calico
删除etcd数据:etcdctl del
以net-test1容器为例,删除之前在master节点查询net-test1容器状态
在etcd节点查询net-test1容器的key信息
在etcd节点删除net-test1的数据
在master节点再次查询net-test1容器,发现容器已经被删除
这是因为k8s集群所有数据都保存在etcd中,etcd删除以后,k8s集群中查询不到该数据,因此,一定要注意etcd数据的安全并且做好etcd数据的备份
向etcd上传数据:etcdctl put
etcd数据watch机制:
基于不断监看数据,发生变化就主动触发通知客户端,Etcd v3 的watch机制支持watch某个固定的key,也支持watch一个范围。
在etcd node1上watch一个key,没有此key也可以执行watch,后期可以再创建:
/usr/bin/etcdctl watch /data
在etcd node2修改数据,验证etcd node1是否能够发现数据变化
/usr/bin/etcdctl put /data "test v1"
/usr/bin/etcdctl put /data "test v2"
验证etcd node1:
备注:可以通过watch机制及时获取etcd数据的变化
4.2 etcd数据备份恢复
注意:etcd备份恢复时会停止服务,
4.2.1 etcd单机(单节点)数据备份还原
WAL是write ahead log的缩写,顾名思义,也就是在执行真正的写操作之前先写一个日志,预写日志。
wal: 存放预写式日志,最大的作用是记录了整个数据变化的全部历程。在etcd中,所有数据的修改在提交前,都要先写入到WAL中。
etcd数据备份:etcd snapshot save
在etcd任一节点(这里以172.31.7.106为例)创建etcd数据备份目录
mkdir -p /data/etcdbackup
对etcd数据通过快照进行备份,备份文件加上时间戳后缀,用以表明备份时间
etcdctl snapshot save /data/etcdbackup/etcd_backup_20220421_0834
etcd数据恢复:etcd snapshot restore
注意:etcd数据恢复需要指定数据恢复目录,该目录必须是系统以前不存在的,该目录不需要手动创建,使用命令指定以后,会自动创建
假如把etcd数据恢复到一个已经存在的目录/var/lib/etcd(该目录已存在),会报错:
etcd snapshot restore /data/etcdbackup/etcd_backup_20220421_0834 --data-dir=/var/lib/etcd
指定etcd数据恢复目录为/data/etcddir(系统不存在该目录),数据恢复成功
etcd snapshot restore /data/etcdbackup/etcd_backup_20220421_0834 --data-dir=/data/etcddir
数据恢复以后需要修改etcd的service文件,把etcd的数据目录和工作目录修改为指定的数据目录,即/data/etcddir,然后重启etcd(有注释的内容为修改内容)
vim /etc/system/system/etcd.service
[root@k8s-etcd ~]#cat /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos
[Service]
Type=notify
WorkingDirectory=/data/etcddir #etcd工作目录由/var/lib/etcd修改为/tmp/etcddir
ExecStart=/usr/local/bin/etcd \
--name=etcd-172.31.7.106 \
--cert-file=/etc/kubernetes/ssl/etcd.pem \
--key-file=/etc/kubernetes/ssl/etcd-key.pem \
--peer-cert-file=/etc/kubernetes/ssl/etcd.pem \
--peer-key-file=/etc/kubernetes/ssl/etcd-key.pem \
--trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
--initial-advertise-peer-urls=https://172.31.7.106:2380 \
--listen-peer-urls=https://172.31.7.106:2380 \
--listen-client-urls=https://172.31.7.106:2379,http://127.0.0.1:2379 \
--advertise-client-urls=https://172.31.7.106:2379 \
--initial-cluster-token=etcd-cluster-0 \
--initial-cluster=etcd-172.31.7.106=https://172.31.7.106:2380,etcd-172.31.7.107=https://172.31.7.107:2380,etcd-172.31.7.108=https://172.31.7.108:2380 \
--initial-cluster-state=new \
--data-dir=/data/etcddir \ #etcd数据目录由/var/lib/etcd修改为/tmp/etcddir
--wal-dir= \
--snapshot-count=50000 \
--auto-compaction-retention=1 \
--auto-compaction-mode=periodic \
--max-request-bytes=10485760 \
--quota-backend-bytes=8589934592
Restart=always
RestartSec=15
LimitNOFILE=65536
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
数据恢复以后,重启etcd
注意:在恢复数据期间API server不可用,会对业务产生影响,因此必须在业务低峰期操作或者是在其他紧急场景。
ETCD数据恢复流程:
当etcd集群宕机数量超过集群总节点数一半以上的时候(如总数为三台宕机两台),就会导致整合集群宕机,后期需要重新恢复数据,则恢复流程如下:
1、恢复服务器系统
2、重新部署ETCD集群
3、停止kube-apiserver/controller-manager/scheduler/kubelet/kube-proxy
4、停止ETCD集群
5、各ETCD节点恢复同一份备份数据
6、启动各节点并验证ETCD集群
7、启动kube-apiserver/controller-manager/scheduler/kubelet/kube-proxy
8、验证k8s master状态及pod数据
4.2.2 etcd集群数据备份恢复
通过kubeasz集群部署工具ezctl backup和ezctl restore进行集群etcd数据备份和恢复
这两个命令实际上是通过deploy节点(172.31.7.101)/etc/kubeasz/playbook/94.backup.yml做的集群etcd数据备份
数据还原调用的是/etc/kubeasz/roles/cluster-restore/tasks/main.yml文件
在deploy部署服务器上(172.31.7.101)对集群进行备份:
#cd /etc/kubeasz
# ./ezctl backup k8s-cluster1 #指定备份的集群名称k8s-cluster1
查看备份文件
注意:snapshot_202204210915.db和snapshot.db实际上是同一个文件(可以通过md5值进行验证),ezctl在集群备份之后会把带有时间戳最近一次的备份文件snapshot_xxxxx.db重命名为snapshot.db,这么做是因为备份恢复时,指定了会通过snapshot.db进行数据恢复
手动删除net-test1容器,然后进行数据恢复,看能否恢复成功
删除net-test1容器
通过备份数据进行还原
cd /root/kubeasz
./ezctl restore k8s-cluster1 #指定恢复的集群名称
注意:如果有多个备份,想要恢复至多个备份中的某个备份,如一共有10个备份,想要将集群恢复至第8个备份,只需要将第8个备份文件名称改名为snapshot.db,然后执行备份恢复命令即可。
查看net-test1容器,恢复成功
注意:通过etcd备份恢复方式恢复的net-test1容器无法和其他容器以及外部网络通信,需要重启net-test1所在的宿主机(172.31.6.111),网络才会恢复正常。
宿主机(172.31.6.111)重启后,net-test1容器网络恢复正常
4.2.3 基于Velero实现k8s的数据备份和恢复
场景:假设在etcd数据备份之后,某些pod做了配置变更或者发布新的版本,此时如果为了恢复某个数据而对整个集群的etcd进行数据还原,将会把已经做过的配置变更和发布的新版本也恢复原样。
例如:在前一天晚上etcd备份之后,tomcat发布新版本代码,,第二天某pod数据丢失,此时通过前一天晚上的etcd备份恢复pod数据,由于etcd备份是对整个集群数据做的备份,因此在pod数据恢复的同时,会导致tomcat发布的新版本代码恢复成发版之前的代码,需要重新发版。
针对这种场景,可以针对单个namespace进行数据备份,一旦某个namespace下的容器被误删,只需要针对这个namespace进行恢复即可,无需对整个集群进行数据恢复。这种场景无法通过etcd实现。
注意:velero即支持namespace级别的备份,也支持集群整体备份,另外,velero备份恢复时对业务无影响。
4.2.3.1 velero介绍
Velero 是一个云原生的灾难恢复和迁移工具,它本身也是开源的,采用Go语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源数据。
Velero 是西班牙语意思是帆船,非常符合Kubernetes社区的命名风格,Velero的开发公司Heptio,已被VMware收购。
Velero 支持标准的K8S集群,既可以是私有云平台也可以是公有云,除了灾备之外它还能做资源移转,支持把容器应用从一个集群迁移到另一个集群。
Velero组件分为两部分,分别是服务端和客户端
服务端:运行在kubernetes集群中,负责查询数据
客户端:是运行在本地的命令行工具,需要已配置好kubectl及集群kubeconfig的机器上
整体架构:
velero数据备份恢复流程:
(1)velero客户端发送指令想要对某个namespace进行备份
(2)velero服务端获取指令后,从k8s集群中的apiserver读取etcd的数据,etcd把数据返回给velero服务端
(3)velero服务端获取数据后并不会把数据保存在本地,而是把数据保存在另外的对象存储中,因此velero需要一个对象存储服务器。
(4)当想要恢复数据时,直接从对象存储中读取恢复数据
4.2.3.2 部署velero
由于velero不会把数据存储到本地,而是存储在对象存储中,因此要先创建对象存储,这里使用docker创建monio(轻量级对象存储)作为对象存储。
第一步:准备minio存储
这里把172.31.7.106作为对象存储服务器部署minio(注意:为了防止端口冲突,尽量使用应用部署较少的服务器或者空服务器进行部署),因此以下操作均在172.31.7.106上执行
1、安装docker
由于使用docker创建minio,要先安装docker
使用以下脚本安装docker
#!/bin/bash
#docker-install
docker_version="20.10.24"
#安装清华大学epel镜像
yum -y install epel-release
sed -e 's!^metalink=!#metalink=!g' \
-e 's!^#baseurl=!baseurl=!g' \
-e 's!//download\.fedoraproject\.org/pub!//mirrors.tuna.tsinghua.edu.cn!g' \
-e 's!//download\.example/pub!//mirrors.tuna.tsinghua.edu.cn!g' \
-e 's!http://mirrors!https://mirrors!g' \
-i /etc/yum.repos.d/epel*.repo
#安装基础工具
yum -y install vim wget tree lrzsz openssl openssl-devel iproute net-tools iotop zip
#如果存在docker,需要先把docker删除
yum -y remove docker docker-common docker-selinux docker-engine
#下载docker二进制安装包并解压
mkdir -p /usr/local/src
cd /usr/local/src/
ls docker-${docker_version}.tgz
if [ $? -eq 0 ];then
echo "file exist,not need download"
/usr/bin/tar -xvf docker-${docker_version}.tgz -C /usr/local/src/
/usr/bin/cp /usr/local/src/docker/* /usr/bin/
else
wget mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/docker-${docker_version}.tgz
/usr/bin/tar -xvf docker-${docker_version}.tgz -C /usr/local/src/
/usr/bin/cp /usr/local/src/docker/* /usr/bin/
fi
#编辑containerd.service文件
cat > /lib/systemd/system/containerd.service << EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
EOF
#编辑docker.service文件
cat > /lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket containerd.service
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3
# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target
EOF
#编辑docker.socket文件
cat > /lib/systemd/system/docker.socket << EOF
[Unit]
Description=Docker Socket for the API
[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
#增加docker用户和组(如果不加,docker会启动失败)
groupadd docker
useradd docker -g docker
#创建普通用户,加入docker组
id -u magedu > /dev/null
if [ $? -eq 0 ];then
echo "user exist"
else
useradd magedu -G docker
fi
#启动containerd服务
systemctl enable containerd.service
systemctl restart containerd.service
#启动docker服务
systemctl enable docker.service
systemctl restart docker.service
#启动docker.socket,设置开机自启动
systemctl enable docker.socket
systemctl start docker.socket
#添加镜像加速器
cd /etc/docker
touch daemon.json
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"
]
}
EOF
#更改内核参数
cat > /etc/sysctl.conf << EOF
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl -p
#docker安装成功
echo "docker install sucess!!!"
2、部署minio
(1)下载monio镜像
在docker官方镜像仓库查找minio镜像:https://hub.docker.com/r/minio/minio
镜像下载链接:https://hub.docker.com/layers/minio/minio/minio/RELEASE.2022-04-16T04-26-02Z/images/sha256-d3f2c42e3f73dd42e46f239b1c7a5364fb4d9ebebd55aba06d98386d8c26a3a1?context=explore
把镜像拉取到本地:docker pull minio/minio:RELEASE.2022-04-16T04-26-02Z
创建存放minio数据的目录
mkdir -p /data/moni
(2)创建minio容器
注意:如果不指定,则默认用户名与密码为 minioadmin/minioadmin,可以通过环境变量自定义
# docker run --name minio \
-p 9000:9000 \ #指定minio映射端口
-p 9999:9999 \
-d --restart=always \ #开机自启动
-e "MINIO_ROOT_USER=admin" \ #指定minio的用户名为admin
-e "MINIO_ROOT_PASSWORD=12345678" \ #指定minio的密码为12345678
-v /data/minio/data:/data \ #把宿主机的/data/monoi/data映射到容器的/data目录
minio/minio:RELEASE.2022-04-16T04-26-02Z server /data \ #指定部署minio使用的镜像文件,指定server端数据目录为/data目录,这样minio的数据都会存放到宿主机的/data/minio/data目录
--console-address '0.0.0.0:9999' #指定控制台监听地址和端口
查看minio容器
访问minio控制台,即172.31.7.106:9999
输入账号密码,查看是否可以登录
创建一个bucket用于存储velero的数据,bucket名称为velerodata
第二步:安装velero
1、安装velero客户端
在一台可以执行kubectl命令的节点上下载客户端二进制安装包,这里在master1(172.31.7.101)上下载该安装包
cd /usr/local/src
wget https://github.com/vmware-tanzu/velero/releases/download/v1.8.1/velero-v1.8.1-linux-amd64.tar.gz
解压到当前目录
tar -xvf velero-v1.8.1-linux-amd64.tar.gz
把该命令复制到二进制默认路径下,确保velero命令可以直接执行
cp /usr/local/src/velero-v1.8.1-linux-amd64/velero /usr/local/bin/
验证命令是否可用
2、安装服务端
由于服务端需要认证,因此需要签发证书(以下操作均在172.31.6.101上执行)
(1)创建签发证书和配置的目录
mkdir -p /data/velero
cd /data/velero #在当前目录下部署velero server端
(2)创建认证文件,用于和对象存储进行认证
vim velero-auth.txt
[default]
aws_access_key_id = admin
aws_secret_access_key = 12345678
注意:如果使用公有云,需要获取公有云的accesskey放在这里即可
(3)签发证书,用于k8s备份,并且创建单独用户,该用户需要有k8s集群的查询、数据恢复等权限
vim awsuser-csr.json
{
"CN": "awsuser",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
(4)准备证书签发环境,安装cfssl
在github官网下载二进制安装包直接使用
需要下载以下三个文件:
cd /data/velero
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl-certinfo_1.6.1_linux_amd64
把下载的二进制文件复制到二进制默认路径/usr/local/bin目录下,可以直接使用
cp cfssl_1.6.1_linux_amd64 /usr/local/bin/cfssl
cp cfssl-certinfo_1.6.1_linux_amd64 /usr/local/bin/cfssl-certinfo
cp cfssljson_1.6.1_linux_amd64 /usr/local/bin/cfssljson
给二进制文件加上可执行权限
chmod a+x /usr/local/bin/cfssl\*
三个文件介绍:
cfssl:https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64
cfssljson(用于查看json文件):https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64
cfssl-certinfo(用于查看证书信息):https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl-certinfo_1.6.1_linux_amd64
(5)签发证书
cd /data/velero
/usr/local/bin/cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem -ca-key=/etc/kubernetes/ssl/ca-key.pem -config=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca-config.json -profile=kubernetes ./awsuser-csr.json | cfssljson -bare awsuser
注意:-ca=/etc/kubernetes/ssl/ca.pem是指部署k8s集群签发的证书公钥,-ca-key=/etc/kubernetes/ssl/ca-key.pem是指部署k8s集群签发的证书私钥,路径一定要对;-config=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca-config.json是指k8s集群的config文件
签发完成后会生成四个文件
把证书放到专门存放k8s集群证书的目录下
cp awsuser-key.pem /etc/kubernetes/ssl/
cp awsuser.pem /etc/kubernetes/ssl/
(6)生成集群认证config文件(该文件主要给awsuser使用,使awsuser有权限访问k8s集群,该文件类似于/etc/.kube/config文件,用于认证)
# export KUBE_APISERVER=https://172.31.7.101:6443 #声明apiserver地址
# kubectl config set-cluster kubernetes \ #设置证书文件中的集群名称,可自定义
--certificate-authority=/etc/kubernetes/ssl/ca.pem \ #使用ca的公钥进行认证
--embed-certs=true \ #对证书进行伪装,不显示文件原内容,使用base64进行加密
--server=${KUBE_APISERVER} \ #调用声明的apiserver变量
--kubeconfig=./awsuser.kubeconfig #指定config文件存放目录
(7)设置客户端证书认证:
kubectl config set-credentials awsuser \
--client-certificate=/etc/kubernetes/ssl/awsuser.pem \
--client-key=/etc/kubernetes/ssl/awsuser-key.pem \
--embed-certs=true \
--kubeconfig=./awsuser.kubeconfig
(8)设置上下文参数:
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=awsuser \
--namespace=velero-system \
--kubeconfig=./awsuser.kubeconfig
(9)设置默认上下文:
kubectl config use-context kubernetes --kubeconfig=awsuser.kubeconfig
(10)k8s集群中创建awsuser账户,并赋予管理员权限(备份还原需要管理员权限读取所有namespace的数据)
kubectl create clusterrolebinding awsuser --clusterrole=cluster-admin --user=awsuser
至此,证书已经准备完毕
(11)创建velero的namespace velero-system,用于环境隔离
kubectl create ns velero-system
(12)执行安装
cd /data/velero
velero --kubeconfig ./awsuser.kubeconfig \ #指定认证文件
install \
--provider aws \ #指定提供者为aws
--plugins velero/velero-plugin-for-aws:v1.3.1 \ #安装插件用于识别对象存储
--bucket velerodata \ #指定对象存储的bucket,即在minio控制台创建的bucket
--secret-file ./velero-auth.txt \ #指定访问对象存储的认证文件
--use-volume-snapshots=false \ #不使用快照
--namespace velero-system \ #指定namespace
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://172.31.7.106:9000
查看velero容器
查看容器日志是否存在错误信息,如果日志均为info级别,说明容器正常
kubectl logs -f velero-6755cb8697-chm75 -n velero-system
第三步:使用velero进行备份
创建测试容器
kubectl create ns myserver #创建存放测试容器的namespace
kubectl run nginx -n myserver --image=nginx:1.20.0
使用velero备份
velero backup create magedu-n66-backup-20220421 --include-namespaces myserver -n velero-system
注意:执行命令时,要指定velero server所在的namespace,否则会报错:
另外,备份文件名称也不能重复,否则也会报错:
因此,备份时可以使用时间戳后缀,这样就避免文件名重复
#DATE=`date +%Y%m%d%H%M%S`
#velero backup create default-backup-${DATE} \
--include-namespaces default \
--kubeconfig=./awsuser.kubeconfig \
--namespace velero-system
登录minio对象存储控制台(172.31.7.106:9999)查看备份文件
第四步:使用velero进行数据恢复
1、创建备份,对myserver namespace进行备份
#DATE=`date +%Y%m%d%H%M%S`
#velero backup create myserver-backup-${DATE} \
--include-namespaces myserver \
--kubeconfig=./awsuser.kubeconfig \
--namespace velero-system
登录minio控制台查看备份
删除myserver namespace下的测试容器nginx
进行数据恢复
velero restore create --from-backup myserver-backup-20220421192054 --wait \
--kubeconfig=./awsuser.kubeconfig \
--namespace velero-system
查看myserver namespace,容器已经恢复
kubectl get pod -n server
注意:由于使用etcd恢复时会停止apierver,会对业务产生影响,而使用velero恢复时不会对业务有影响,因此推荐使用velero对k8s集群做备份恢复
文章评论