前期环境说明:
velero备份必须存储在对象存储里,这里用minio来做对象存储。
一 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'
访问http:ip:9999
admin 密码 12345678
登录成功之后,去创建一个存储桶velerodata
二 部署velero客户端
velero分为 客户端和服务端。 其中 velero服务端以pod形式运行在k8s里。
1 下载velero客户端
root@k8s-master1:/usr/local/src# wget https://github.com/vmware-tanzu/velero/releases/download/v1.8.1/velero-v1.8.1-linux-amd64.tar.gz
root@k8s-master1:/usr/local/src# tar xvf velero-v1.8.1-linux-amd64.tar.gz
root@k8s-master1:/usr/local/src# cp velero-v1.8.1-linux-amd64/velero /usr/local/bin/
root@k8s-master1:/usr/local/src# velero --help
2 配置velero认证环境
root@k8s-master1:~# mkdir /data/velero -p
root@k8s-master1:/data/velero#
3认证文件:为了访问对象存储
root@k8s-master1:/data/velero# vim velero-auth.txt
[default]
aws_access_key_id = admin
aws_secret_access_key = 12345678
三 证书签发
打通velero和k8s api的通信
1 准备user-csr文件
cat awsuser-csr.json
{
"CN": "awsuser",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
2准备证书签发环境:
2.1 下载证书签发工具
root@k8s-master1:/data/velero# apt install golang-cfssl
https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64
https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64
https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl-certinfo_1.6.1_linux_amd64
root@k8s-master1:/data/velero# mv cfssl-certinfo_1.6.1_linux_amd64 cfssl-certinfo
root@k8s-master1:/data/velero# mv cfssl_1.6.1_linux_amd64 cfssl
root@k8s-master1:/data/velero# mv cfssljson_1.6.1_linux_amd64 cfssljson
root@k8s-master1:/data/velero# cp cfssl-certinfo cfssl cfssljson /usr/local/bin/
root@k8s-master1:/data/velero# chmod a+x /usr/local/bin/cfssl*
2.2执行证书签发:给awsuser用户签发证书
root@k8s-master1:/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
2.3 验证证书
root@k8s-master1:/data/velero# ll awsuser*
-rw-r--r-- 1 root root 220 Apr 14 12:29 awsuser-csr.json
-rw------- 1 root root 1679 Apr 14 12:30 awsuser-key.pem
-rw-r--r-- 1 root root 997 Apr 14 12:30 awsuser.csr
-rw-r--r-- 1 root root 1387 Apr 14 12:30 awsuser.pem
2.4 分发证书到api-server证书路径
root@k8s-master1:/data/velero# cp awsuser-key.pem /etc/kubernetes/ssl/
root@k8s-master1:/data/velero# cp awsuser.pem /etc/kubernetes/ssl/
2.5 生成集群认证config文件:就是awsuser.kubeconfig
export KUBE_APISERVER="https://172.31.7.100:6443"
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=${KUBE_APISERVER} --kubeconfig=./awsuser.kubeconfig
2.6设置客户端证书认证:
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
2.7 设置上下文参数
kubectl config set-context kubernetes \
--cluster=kubernetes --user=awsuser --namespace=velero-system --kubeconfig=./awsuser.kubeconfig
2.8 设置默认上下文
kubectl config use-context kubernetes --kubeconfig=awsuser.kubeconfig
最终awsuser.kubeconfig 这个文件创建完成。
2.9 k8s集群中创建awsuser账户
kubectl create clusterrolebinding awsuser --clusterrole=cluster-admin --user=awsuser
3.0 创建namespace
kubectl create ns velero-system
四 部署velero服务端
1 安装
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://172.31.7.102:9000 # 对象存储的地址minio的地址
2 验证安装 查看pod和日志
root@k8s-master1:/data/velero# kubectl describe pod velero-6755cb8697-phfsr -n velero-system
[root@k8s-master1 velero]# kubectl get pod -n velero-system
NAME READY STATUS RESTARTS AGE
velero-6755cb8697-sw2qs 1/1 Running 0 3m12s
3备份
DATE=`date +%Y%m%d%H%M%S`
velero backup create linux66-ns-backup-${DATE} --include-namespaces linux66 --kubeconfig=./awsuser.kubeconfig --namespace velero-system
# 备份必须指定时间戳,名字不能重复。 指定namespace去备份--include-namespaces
备份完成之后,会在对象存储里多出一个目录
4 还原
velero restore create --from-backup linux66-ns-backup-20220421111145 --wait --kubeconfig=./awsuser.kubeconfig --namespace velero-system
# 注意awsuser.kubeconfig 这个文件的路径,和你备份文件的名字。
还原结束后也会多出一个restore的目录
5 卸载服务端
如果安装的时候,发现配置文件写的不对,然后卸载即可。直接删除pod和deployment是不管用的。
velero uninstall --namespace velero-system