大家好,我叫秋意零。
最近對(duì)公司進(jìn)行日常運(yùn)維工作時(shí),出現(xiàn)了一個(gè) T1 級(jí)別事故。導(dǎo)致公司的“酒云網(wǎng)”APP的無(wú)法使用。我和我領(lǐng)導(dǎo)一起搞了一個(gè)多小時(shí),業(yè)務(wù)也停了一個(gè)多小時(shí)。
起因是:我的部門直系領(lǐng)導(dǎo),叫我**刪除一個(gè) Deployemnt 資源(node-api-gateway)**說(shuō)該資源不用了,因?yàn)橛?go 語(yǔ)言重新寫了一個(gè) go-api-gateway 項(xiàng)目。
由于咱們管理 K8s 集群使用的 Kuboard 系統(tǒng),刪除 Deployemnt 資源(node-api-gateway)時(shí),如果沒(méi)有勾選下面圖中的選項(xiàng)的話,就會(huì)默認(rèn)刪除對(duì)應(yīng)與之同名的 Service 和 Ingress。
之前將 Deployment(node-api-gateway) 使用 Go 重寫了。而對(duì)應(yīng)的 Ingress 名稱與之前名稱一致。所以刪除了 Deployment(node-api-gateway)也連帶刪除了同名的 Ingress(node-api-gateway)應(yīng)用的出口網(wǎng)關(guān),導(dǎo)致此次事故。
如果這時(shí)咱們有備份 K8s 資源的 YAML 文件的話,直接執(zhí)行 kubectl apply -f ingeess-yaml文件
命令就不會(huì)出現(xiàn),業(yè)務(wù)長(zhǎng)時(shí)間停業(yè)務(wù)的情況。
此次事情過(guò)后,第二天下午寫了對(duì)應(yīng)的 K8s 集群 YAML 文件備份腳本,如下:
1)定時(shí)任務(wù)
正式和測(cè)試環(huán)境一致
[root@iZ8vbg3hxkp6i8fo6a5ymnZ ~]# crontab -l
...
0 0 */1 * * /usr/bin/bash /a/k8s-yaml-all-bak/start.sh > /a/k8s-yaml-all-bak/yaml_bak.logs 2>&1 # 每1天執(zhí)行一次
2)腳本功能
1. 目錄結(jié)構(gòu)
[root@iZ8vbg3hxkp6i8fo6a5ymnZ k8s-yaml-all-bak]# ll
總用量 764
-rw-r--r-- 1 root root 122 3月 27 00:03 del-yaml.logs # 刪除備份yaml副本的日志
-rw-r--r-- 1 root root 155 3月 21 10:13 resources.txt # 記錄腳本需要備份資源
-rwxr-xr-x 1 root root 2905 3月 27 15:30 start.sh # 腳本啟動(dòng)文件
-rw-r--r-- 1 root root 391299 4月 7 00:03 yaml_bak.logs # 腳本備份日志
2. 功能:
YAML文件備份路徑:/opt/k8s_yaml_bak
備份YAML文件(方法名稱:dump_yaml)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-859606.html
刪除30天前備份的YAML文件(方法名稱:del_yaml)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-859606.html
#/bin/bash
#
# K8S_YAML_SHELL_DIR:記錄腳本和resources.txt存放位置,移動(dòng)是需要修改其值
# 一鍵備份K8s集群YAML文件腳本
# resources.txt文件,編寫需要備份資源
#
# 定時(shí)任務(wù)示例
# 0 0 */1 * * /usr/bin/bash /a/k8s-yaml-all-bak/start.sh > /a/k8s-yaml-all-bak/yaml_bak.logs 2>&1
# 后臺(tái)運(yùn)行示例
# nohup /usr/bin/bash /a/k8s-yaml-all-bak/start.sh > /a/k8s-yaml-all-bak/yaml_bak.logs 2>&1 &
# 當(dāng)前時(shí)間
DATE=`date +%Y-%m-%d--%H-%M-%S`
# 備份路徑
K8S_YAML_BACKUP_DIR="/opt/k8s_yaml_bak"
# 腳本存放目錄
K8S_YAML_SHELL_DIR="/a/k8s-yaml-all-bak"
if [ ! -d $K8S_YAML_BACKUP_DIR ];then
mkdir -p $K8S_YAML_BACKUP_DIR
fi
# 獲取備份資源
if [ -f ${K8S_YAML_SHELL_DIR}/resources.txt ];then
RESOURCES=`cat ${K8S_YAML_SHELL_DIR}/resources.txt`
# 判斷資源文件是否為空
if [[ $RESOURCES == "" ]]; then
echo "${DATE} ${K8S_YAML_SHELL_DIR}/resources.txt 文件為空,請(qǐng)輸入資源名稱"
exit 1
fi
else
echo "resources.txt文件,不存在!"
exit 1
fi
# 每次備份單獨(dú)創(chuàng)建一個(gè)家目錄+時(shí)間
mkdir -p ${K8S_YAML_BACKUP_DIR}/k8s-${DATE}
# 獲取家目錄
GET_HOME_DIR=`ls -l ${K8S_YAML_BACKUP_DIR} | tail -n 1 | awk '{print $9}'`
echo "備份路徑:$K8S_YAML_BACKUP_DIR/$GET_HOME_DIR"
# 獲取k8s名稱空間
NAMESPACE=`kubectl get ns | awk '{print $1}' | tail -n +2`
dump_yaml(){
# 遍歷NS
for NS in $NAMESPACE ;do
# 創(chuàng)建NS備份目錄
mkdir -p ${K8S_YAML_BACKUP_DIR}/${GET_HOME_DIR}/${NS}
# 過(guò)濾NS(kube-public、kube-system)
if [[ $NS != "kube-public" && $NS != "kube-system" && $NS != "csdr" && $NS != "kube-node-lease" ]]; then
# 遍歷k8s資源
for RESOURCE in $RESOURCES; do
# 創(chuàng)建資源目錄
mkdir -p ${K8S_YAML_BACKUP_DIR}/${GET_HOME_DIR}/${NS}/${RESOURCE}
# 遍歷對(duì)應(yīng)資源名稱
for RESOURCE_NAME in $(kubectl get $RESOURCE -n $NS | awk '{print $1}' | tail -n +2);do
DATE_YAML=`date +%Y-%m-%d--%H:%M:%S`
echo "${DATE_YAML} 導(dǎo)出YAML: ${NS} ${RESOURCE} ${RESOURCE_NAME} "
# 導(dǎo)出對(duì)應(yīng)名稱空間下對(duì)應(yīng)資源的yaml
kubectl get ${RESOURCE} ${RESOURCE_NAME} -n ${NS} -o yaml > ${K8S_YAML_BACKUP_DIR}/${GET_HOME_DIR}/$NS/${RESOURCE}/${RESOURCE_NAME}.yaml
echo ""
done
done
fi
done
}
del_yaml(){
for DIR_NAME in $(find $K8S_YAML_BACKUP_DIR -type d -mtime +7);do
DATE_YAML=`date +%Y-%m-%d--%H:%M:%S`
echo "${DATE_YAML} 刪除:$DIR_NAME" > ${K8S_YAML_SHELL_DIR}/del-yaml.logs
rm -rf $DIR_NAME >> ${K8S_YAML_SHELL_DIR}/del-yaml.logs
echo "" >> ${K8S_YAML_SHELL_DIR}/del-yaml.logs
done
}
dump_yaml
del_yaml
到了這里,關(guān)于T1級(jí),生產(chǎn)環(huán)境事故—Shell腳本一鍵備份K8s的YAML文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!