K8s里面的各种资源yaml文件,建议还是需要定期备份的。
之前我们是在外部机器上 用的kubectl get xx遍历后,存下来,然后再git commit 提交到gitlab去备份。
最后空闲,研究了下之前运维同学部署在K8s里面的kube-backup这个备份方式,发现大体逻辑和我之前的一样,区别就是说统一到K8s里面来管理了。
既然学了,就再写个笔记备忘下,或许能帮到其他人呢。
创建gitlab账号和repo
代码语言:javascript复制创建一个gitlab group repo useraccount
例如我这里用的是一个super-bot高权限的账号
并且,把super-bot加到 新创建的repo里面,我给了个maintanier权限。
gitlab repo地址: git@192.168.2.188:infra/kube-backup.git
账号 super-bot
这些信息,后面都会用到。
下载github上的源文件
代码语言:javascript复制# 下载源码
git clone https://github.com/pieterlange/kube-backup.git
# 我们这里单独创建一个namespace,默认它是存到kube-system下面的
kubectl create ns kube-backup
# 修改配置文件
sed -i 's#namespace: kube-system#namespace: kube-backup#g' *.yaml
创建一个secret 用于给gitlab提交信息
代码语言:javascript复制# 下面这些命令在 kube-backup 目录下执行就行
ssh-keygen -t rsa -f ./id_rsa -N '' # 创建一个ssh密钥对
ssh-keyscan 192.168.2.188 > known_hosts
kubectl create secret generic kube-backup-ssh -n kube-backup --from-file=id_rsa --from-file=known_hosts
$ kubectl get secrets -n kube-backup
NAME TYPE DATA AGE
default-token-5t2q5 kubernetes.io/service-account-token 3 2m36s
kube-backup-ssh Opaque 2 12s
将这个pub key 加到 super-bot 的gitlab key里面,不然后续流程会报错的
应用yaml并测试
代码语言:javascript复制# 然后,修改下面2个yaml中的 GIT_REPO地址为git@192.168.2.188:infra/kube-backup.git
-rw-r--r-- 1 root root 1.3K 2021-02-11 11:26 cronjob-codecommit.yaml
-rw-r--r-- 1 root root 1.3K 2021-02-11 11:26 cronjob-ssh.yaml
修改 job-cleanup.yaml 改为 apiVersion: batch/v1beta1 (我这的minikube版本较高,不修改的话,执行的报错)
# 应用这个目录下的4个yaml到k8s去生效
kubectl apply -f ./
# 查看效果
$ kubectl get cronjobs -n kube-backup
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
kube-state-backup */10 * * * * False 0 <none> 28s
# 默认是10分钟执行一次,可以根据自己的需求改
# 下面是运行一段时间的效果
$ kubectl get pods -n kube-backup
NAME READY STATUS RESTARTS AGE
kube-state-backup-1613016000-nh5mq 1/1 Running 5 19m
$ kubectl get jobs -n kube-backup
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
kube-state-backup 30 1 * * 6 False 1 23m 30m
kube-state-backup-cleaner 1 6 * * * False 0 <none> 2m37s