會玩,K8s 通過 Cronjob 來定期備份 Etcd

簡介
家里有兩個 k8s,樹莓派使用的是 k3s,nuc 上就是正常的 x86 的 k8s,樹莓派 k3s 使用的是 mysql,mysql 也是使用 cronjob 每天跑的備份,但是 nuc 中的 etcd 一直沒有備份過,所以今天就準備備份下。
要做的事情很簡單,就是 etcd 快照,完了之后就直接扔到 minio 中。
操作
本來想的是使用 python 的 etcd 庫做備份的,但是不知道為什么依賴一直沒有安裝好,索性就不裝逼了直接使用 etcd cli 去 snapshot,因為 etcd 的備份需要使用證書,所以就直接拿出證書放到項目的 ssl 目錄下面了。
導入庫
import?os
import?time
from?minio?import?Minio
from?minio.error?import?S3Error
下面是腳本的一些配置參數(shù)
#?獲取當前時間
now=time.strftime("%Y%m%d",?time.localtime())
#?一些配置參數(shù)
etcd_url=""
cacert="./ssl/ca.pem"
cert="./ssl/node-node1.pem"
key="./ssl/node-node1-key.pem"
backup_file_name="etcd-"+?now
沒錯,snapshot 文件就使用時間去命名了。
之后就是創(chuàng)建快照函數(shù)
def?create_snapshot():
????command="ETCDCTL_API=3?etcdctl?--endpoints="?+?etcd_url?+?"?--cacert="?+?cacert?+?"?--cert="?+?cert?+?"?--key="+?key?+?"?snapshot?save?"?+?backup_file_name
????os.system(command=command)
完了之后就直接上傳到 minio
def?upload_to_minio():
????client=Minio(
????????"oss.example.cn:9000",
????????access_key="",
????????secret_key="",
????????secure=False
????)
????found=client.bucket_exists("etcd-backup")
????if?not?found:
????????client.make_bucket("etcd-backup")
????????print("etcd-backup?bucket?created")
????else:
????????pass
????client.fput_object("etcd-backup",backup_file_name,backup_file_name)
因為我的 minio 是沒有配置 https 的所以配置了secure=False
之后就是主函數(shù)
if?__name__?==?"__main__":
????try:
????????create_snapshot()
????except?Exception?as?e:
????????print(e)
????try:
????????upload_to_minio()
????except?S3Error?as?e:
????????print("upload?failed:?"+?e)
接著就是 cronjob 的配置
apiVersion:?batch/v1beta1
kind:?CronJob
metadata:
??creationTimestamp:?null
??name:?etcd-backup
??namespace:?cronjob
spec:
??failedJobsHistoryLimit:?5
??jobTemplate:
????metadata:
??????creationTimestamp:?null
????spec:
??????template:
????????metadata:
??????????creationTimestamp:?null
????????spec:
??????????containers:
??????????-?image:?registry.bboysoul.cn/rpi/etcd-backup:87abd366c81cbe4b7d0edb20670a5755e0506d13
????????????imagePullPolicy:?IfNotPresent
????????????name:?etcd-backup
????????????resources:?{}
??????????restartPolicy:?Never
??schedule:?0?3?*?*?*
??successfulJobsHistoryLimit:?5
status:?{}
之后就是配置流水線,我使用的是 drone 加 argocd,這里有個問題就是 argocd 是沒有 arm 二進制的,我就網(wǎng)上找了一個 arm 的鏡像復制出來,自己做了一個鏡像,下面是 dockerfile
FROM?debian:stable-slim
RUN?apt?update?-y?&&?\
????apt?install?git?-y?&&?\
????rm?-rf?/var/lib/apt/lists/*
COPY?./argocd?/bin
COPY?./kubectl?/bin
然后是 drone 的流水線
kind:?pipeline
type:?kubernetes
name:?build
platform:
??os:?linux
??arch:?arm
steps:
-?name:?docker
??image:?plugins/docker
??settings:
????username:?????
????password:????
????repo:?registry.bboysoul.cn/rpi/etcd-backup
????registry:?registry.bboysoul.cn
????tags:
??????-?latest
??????-?${DRONE_COMMIT_SHA}
-?name:?sync?app
??image:?bboysoul/argocd:v2.0.0-1
??commands:
????-?git?clone???????
????-?cd?argocd-yaml/etcd-backup
????-?kubectl?set?image?-f?cronjob.yaml?etcd-backup=registry.bboysoul.cn/rpi/etcd-backup:${DRONE_COMMIT_SHA}?--local?--dry-run=client?-o?yaml?>temp
????-?mv?temp?cronjob.yaml
????-?git?add?.
????-?git?commit?-m?"change?image?registry.bboysoul.cn/rpi/etcd-backup:${DRONE_COMMIT_SHA}"
????-?git?push?origin?master
????-?argocd?login?--insecure?--username???????--password????????10.10.100.76
????-?argocd?app?sync?etcd-bakcup
????-?argocd?app?wait?etcd-bakcup
argocd 的 app
apiVersion:?argoproj.io/v1alpha1
kind:?Application
metadata:
??name:?'etcd-bakcup'
spec:
??destination:
????namespace:?'cronjob'
????server:?'?????'
??source:
????path:?'./etcd-backup'
????repoURL:?'????????????'
????targetRevision:?HEAD
??project:?'default'
之后看下怎么完善下加個備份完成之后的通知啊什么的。
原文鏈接:https://www.bboy.app/2022/01/11/k8s%E9%85%8D%E7%BD%AEcronjob%E5%A4%87%E4%BB%BDetcd/


你可能還喜歡
點擊下方圖片即可閱讀

云原生是一種信仰???
關注公眾號
后臺回復?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!


點擊?"閱讀原文"?獲取更好的閱讀體驗!
發(fā)現(xiàn)朋友圈變“安靜”了嗎?


