Velero结合minio实现kubernetes业务数据备份与恢复
velero:实现针对k8s集群指定资源进行备份和恢复(可以备份某个名称空间下的数据),也支持数据迁移(a集群到b集群)
velero官网:https://velero.io
velero的工作方式就是把k8s中的护具备份到对象存储中已实现高可用和数据持久化,默认保存的备份的时间是720小时,并在需要的时候进行下载和恢复
velero和etcd快照备份的区别:
etcd快照备份是全局备份,即使一个资源对象需要恢复也需要做全局恢复到备份状态及会影响其他的pod和其他namespace的资源
velero可以有针对性的备份,比如按照namespace单独备份、只备份单独资源对象等,在恢复的时候只恢复单独的namespace或资源对象,不影响其他namespace中pod的运行
velero支持ceph,oss等对象存储,etcd快照是一个本地文件
velero支持任务计划实现周期备份,但etcd快照备份也可以基于cronjob实现
velero备份流程:
-
velero客户端调用kubernetes API Server创建backup任务
-
Backup控制器基于watch机制通过Api Server获取到备份任务
-
Backup控制器开始执行备份动作,会通过请求Api Server获取到需要备份的数据
-
Backup 控制器将获取到的数据备份到指定的对象存储server端
##################################实战操作####################################3
##部署minio
##minio为高性能的对象存储,支持分布式
#在线安装docker方式:https://developer.aliyun.com/mirror/docker-ce
###################安装dockers-ce在线安装方式
##step 1: 安装必要的一些系统工具
# sudo apt-get update
# sudo apt-get-y install apt-transport-https ca-certificates curl software-properties-common
##step 2: 安装GPG证书
# curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg| sudo apt-key add -
##Step 3: 写入软件源信息
# sudo add-apt-repository "deb [arch=amd64]https://mirrors.aliyun.com/docker-ce/linux/ubuntu$(lsb_release -cs) stable"
##Step 4: 更新并安装Docker-CE
# sudo apt-get -y update
# sudo apt-get-y install docker-ce
##配置镜像加速器
# sudo mkdir -p /etc/docker
# sudo tee /etc/docker/daemon.json <<-'EOF'
{ "registry-mirrors": ["https://s3o5ymtt.mirror.aliyuncs.com"] }
EOF
# sudo systemctl daemon-reload && sudo systemctl restart docker
#######################二进制安装方式
敬请期待----后续维护
#############################################################
###################安装minio
docker pull minio/minio:RELEASE.2022-04-12T06-55-35Z
mkdir -p /data/minio
#创建minio容器,如果不指定用户,则默认用户名与密码为:minioadmin/minioadmin
docker run --name minio -p 9000:9000 -p 9999:9999 -d --restart=always -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=12345678" -v /data/minio.data:/data minio/minio:RELEASE.2022-04-12T06-55-35Z server /data --console-address '0.0.0.0:9999'
问题1:
解决办法:
minio用户的密码要满足八位
访问到minio的管理页面操作(通过9999端口):
#添加Buckets(根据不同的数据创建不同额bucket)
##########################################minio安装完成
###################安装velero
##安装包下载位置:https://github.com/vmware-tanzu/velero
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
cp velero-v1.8.1-linux-amd64/velero /usr/local/bin/
velero --help
#配置velero认证环境:
mkdir /data/velero -p
cd /data/velero
cat <<EOF >velero-auth.txt
[default]
aws_access_key_id = admin
aws_secret_access_key = 12345678
EOF
cat <<EOF >awsuser-csr.json
{
"CN": "awsuser",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "JILIN",
"L": "CHANGCHUN",
"O": "k8s",
"OU": "System"
}
]
}
EOF
#######安装cfssl工具来准备证书签发环境
#第一种方式:
apt install golang-cfssl
#第二种方式
mv cfssl-certinfo_1.6.1_linux_amd64 cfssl-certinfo
mv cfssl_1.6.1_linux_amd64 cfssl
mv cfssljson_1.6.1_linux_amd64 cfssljson
cp cfssl-certinfo cfssl cfssljson /usr/local/bin/
chmod a+x /usr/local/bin/cfssl*
#第三种方式(如果使用kubeasz方式部署的)
cp -a /etc/kubeasz/bin/cfssl* /usr/local/bin/
###############################
#########################执行集群证书签发
#在master服务器上执行或者在kubeasz服务器上执行都可以,自行修改
#如果没有ca-config文件先创建一下,kubeasz安装的就在/etc/kubeasz/clusters/k8s-cluster1/ssl下
cat <<EOF >/etc/kubeasz/clusters/k8s-cluster1/ssl/ca-config.json
{
"signing": {
"default": {
"expiry": "876000h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "876000h"
}
},
"profiles": {
"kcfg": {
"usages": [
"signing",
"key encipherment",
"client auth"
],
"expiry": "438000h"
}
}
}
}
EOF
/usr/local/bin/cfssl gencert -ca=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca.pem -ca-key=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca-key.pem -config=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca-config.json -profile=kubernetes ./awsuser-csr.json | cfssljson -bare awsuser
ls -l awsuser*
awsuser-csr.json
awsuser-key.pem
awsuser.csr
awsuser.pem
cp awsuser-key.pem /etc/kubeasz/clusters/k8s-cluster1/ssl
cp awsuser.pem /etc/kubeasz/clusters/k8s-cluster1/ssl
#生成集群认证config文件:
kubectl config set-cluster cluster1 \
--certificate-authority=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca.pem \
--embed-certs=true \
--server="https://192.168.213.11:6443" \
--kubeconfig=./awsuser.kubeconfig
#设置客户端证书认证:
kubectl config set-credentials awsuser \
--client-certificate=/etc/kubeasz/clusters/k8s-cluster1/ssl/awsuser.pem \
--client-key=/etc/kubeasz/clusters/k8s-cluster1/ssl/awsuser-key.pem \
--embed-certs=true \
--kubeconfig=./awsuser.kubeconfig
#设置上下文参数:
kubectl config set-context cluster1 \
--cluster=cluster1 \
--user=awsuser \
--namespace=velero-system \
--kubeconfig=./awsuser.kubeconfig
#设置默认上下文:
kubectl config use-context cluster1 --kubeconfig=awsuser.kubeconfig
#k8s集群中创建awsuser账户:
kubectl create clusterrolebinding awsuser --clusterrole=cluster-admin --user=awsuser
kubectl create ns velero-system
# 执行安装:
velero --kubeconfig ./awsuser.kubeconfig \
install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.3.1 \
--bucket velerodata \
--secret-file ./velero-auth.txt \
--use-volume-snapshots=false \
--namespace velero-system \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.213.31:9000
#验证安装:
kubectl describe pod velero-6755cb8697-phfsr -n velero-system
#查看是否有报错
kubectl logs veleroPodName -nvelero-system
#############################################开始实战备份整个名称空间
DATE=`date +%Y%m%d%H%M%S`
velero backup create default-ns-backup-${DATE} \
--include-cluster-resources=true \
--include-namespaces default \
--kubeconfig=./awsuser.kubeconfig \
--namespace velero-system
##--include-cluster-resources:是否导出非namespace下的集群资源,例:pv,如果恢复集群资源需要pv,那就一定要为true
##--include-resources:备份某个资源的类型
##--ordered-resources:备份指定资源,例如某个pod或者某个pvc
#检查备份是否成功
velero backup describe default-ns-backup-20220802142807 -n velero-system
velero backup logs default-ns-backup-20220802142807 -nvelero-system
#登陆minio查看是否已经进入Buckets
##删除pod然后恢复数据
kubectl get pod
kubectl delete pod net-test2
##恢复存储在minio的备份数据
velero restore create --from-backup default-ns-backup-20220802142807 --wait --kubeconfig=./awsuser.kubeconfig --namespace velero-system
###################################default名称空间数据恢复实战成功
##针对某个资源备份并恢复
#创建两个测试的名称空间
kubectl create namespace wyh-test1-ns
kubectl create namespace wyh-test2-ns
#创建两个pod
kubectl run wyh-test1 --image=centos:7.9.2009 -nwyh-test1-ns sleep 10000000
kubectl run wyh-test1 --image=centos:7.9.2009 -nwyh-test2-ns sleep 10000000
#备份这两个名称空间下pod
DATE=`date +%Y%m%d%H%M%S`
velero backup create pod-backup-${DATE} \
--include-cluster-resources=true \
--ordered-resources 'pod=wyh-test1-ns/wyh-test1,wyh-test2-ns/wyh-test1' \
-n velero-system \
--include-namespaces=wyh-test1-ns,wyh-test2-ns
#删除pod
kubectl delete pod wyh-test1 -nwyh-test1-ns
kubectl delete pod wyh-test1 -nwyh-test2-ns
#恢复
velero restore create --from-backup pod-backup-20220803024930 --wait --kubeconfig=./awsuser.kubeconfig --namespace velero-system
##########################velero+minio备份恢复实战收官!!!###################################