前言
在做日常运维工作的时候,出现T1级别的事故,导致公司的APP无法正常使用。
事故起因:删除一个 Deployemnt 资源(node-api-gateway)
管理 K8s 集群使用的 Kuboard 系统,删除 Deployemnt 资源(node-api-gateway)时,如果没有勾选下面图中的选项的话,就会默认删除对应与之同名的 Service 和 Ingress
之前将 Deployment(node-api-gateway) 使用 Go 重写了。而对应的 Ingress 名称与之前名称一致。所以删除了 Deployment(node-api-gateway)也连带删除了同名的 Ingress(node-api-gateway)应用的出口网关,导致此次事故。
总结:如果有备份YAML文件直接执行kubectl apply -f ingeess-yaml文件
命令就不会出现,业务长时间停业务的情况。
1.定时任务
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天执行一次
2.脚本功能
2.1目录结构
-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 # 脚本启动文件
-rw-r--r-- 1 root root 391299 4月 7 00:03 yaml_bak.logs # 脚本备份日志
2.2功能
YAML文件备份路径:/opt/k8s_yaml_bak
备份YAML文件(方法名称:dump_yaml)
删除30天前备份的YAML文件(方法名称:del_yaml)
3.脚本
#/bin/bash
#
# K8S_YAML_SHELL_DIR:记录脚本和resources.txt存放位置,移动是需要修改其值
# 一键备份K8s集群YAML文件脚本
# resources.txt文件,编写需要备份资源
#
# 定时任务示例
# 0 0 */1 * * /usr/bin/bash /a/k8s-yaml-all-bak/start.sh > /a/k8s-yaml-all-bak/yaml_bak.logs 2>&1
# 后台运行示例
# nohup /usr/bin/bash /a/k8s-yaml-all-bak/start.sh > /a/k8s-yaml-all-bak/yaml_bak.logs 2>&1 &
# 当前时间
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 文件为空,请输入资源名称"
exit 1
fi
else
echo "resources.txt文件,不存在!"
exit 1
fi
# 每次备份单独创建一个家目录+时间
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
# 创建NS备份目录
mkdir -p ${K8S_YAML_BACKUP_DIR}/${GET_HOME_DIR}/${NS}
# 过滤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
# 创建资源目录
mkdir -p ${K8S_YAML_BACKUP_DIR}/${GET_HOME_DIR}/${NS}/${RESOURCE}
# 遍历对应资源名称
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} 导出YAML: ${NS} ${RESOURCE} ${RESOURCE_NAME} "
# 导出对应名称空间下对应资源的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