T1级,生产环境事故—Shell脚本一键备份K8s的YAML文件

大家好,我叫秋意零

最近对公司进行日常运维工作时,出现了一个 T1 级别事故 。导致公司的"酒云网"APP的无法使用。我和我领导一起搞了一个多小时,业务也停了一个多小时

起因是:我的部门直系领导,叫我**删除一个 Deployemnt 资源(node-api-gateway)**说该资源不用了,因为用 go 语言重新写了一个 go-api-gateway 项目。

由于咱们管理 K8s 集群使用的 Kuboard 系统,删除 Deployemnt 资源(node-api-gateway)时,如果没有勾选 下面图中的选项的话,就会默认删除对应与之同名的 Service 和 Ingress

之前将 Deployment(node-api-gateway) 使用 Go 重写了。而对应的 Ingress 名称与之前名称一致。所以删除了 Deployment(node-api-gateway)也连带删除了同名的 Ingress(node-api-gateway)应用的出口网关,导致此次事故。

如果这时咱们有备份 K8s 资源的 YAML 文件的话,直接执行 kubectl apply -f ingeess-yaml文件 命令就不会出现,业务长时间停业务的情况。

此次事情过后,第二天下午写了对应的 K8s 集群 YAML 文件备份脚本,如下:

1)定时任务

正式和测试环境一致

bash 复制代码
[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天执行一次

2)脚本功能

1. 目录结构

bash 复制代码
[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  # 脚本启动文件
-rw-r--r-- 1 root root 391299 4月   7 00:03 yaml_bak.logs  # 脚本备份日志

2. 功能:

YAML文件备份路径:/opt/k8s_yaml_bak

备份YAML文件(方法名称:dump_yaml)

删除30天前备份的YAML文件(方法名称:del_yaml)

bash 复制代码
#/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
相关推荐
Python私教39 分钟前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
运维&陈同学1 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
O&REO2 小时前
单机部署kubernetes环境下Overleaf-基于MicroK8s的Overleaf应用部署指南
云原生·容器·kubernetes
politeboy2 小时前
k8s启动springboot容器的时候,显示找不到application.yml文件
java·spring boot·kubernetes
运维小文3 小时前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻3 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
wuxingge12 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
志凌海纳SmartX13 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总13 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes
BUG弄潮儿13 小时前
k8s 集群安装
云原生·容器·kubernetes