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

ops/2024/10/21 9:34:25/

大家好,我叫秋意零

最近对公司进行日常运维工作时,出现了一个 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)定时任务

正式和测试环境一致

[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. 目录结构

[root@iZ8vbg3hxkp6i8fo6a5ymnZ k8s-yaml-all-bak]# ll
总用量 764
-rw-r--r-- 1 root root    122 327 00:03 del-yaml.logs  # 删除备份yaml副本的日志
-rw-r--r-- 1 root root    155 321 10:13 resources.txt  # 记录脚本需要备份资源
-rwxr-xr-x 1 root root   2905 327 15:30 start.sh  # 脚本启动文件
-rw-r--r-- 1 root root 391299 47 00:03 yaml_bak.logs  # 脚本备份日志

2. 功能:

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

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

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

#/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 ];thenmkdir -p $K8S_YAML_BACKUP_DIR
fi# 获取备份资源
if [ -f ${K8S_YAML_SHELL_DIR}/resources.txt ];thenRESOURCES=`cat ${K8S_YAML_SHELL_DIR}/resources.txt`# 判断资源文件是否为空if [[ $RESOURCES == "" ]]; thenecho "${DATE} ${K8S_YAML_SHELL_DIR}/resources.txt 文件为空,请输入资源名称"exit 1fi
elseecho "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(){# 遍历NSfor 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);doDATE_YAML=`date +%Y-%m-%d--%H:%M:%S`echo "${DATE_YAML} 导出YAML: ${NS} ${RESOURCE} ${RESOURCE_NAME} "# 导出对应名称空间下对应资源的yamlkubectl get ${RESOURCE} ${RESOURCE_NAME} -n ${NS}  -o yaml > ${K8S_YAML_BACKUP_DIR}/${GET_HOME_DIR}/$NS/${RESOURCE}/${RESOURCE_NAME}.yamlecho ""donedonefidone
}del_yaml(){for DIR_NAME in $(find $K8S_YAML_BACKUP_DIR -type d  -mtime +7);doDATE_YAML=`date +%Y-%m-%d--%H:%M:%S`echo "${DATE_YAML} 删除:$DIR_NAME" > ${K8S_YAML_SHELL_DIR}/del-yaml.logsrm -rf $DIR_NAME  >> ${K8S_YAML_SHELL_DIR}/del-yaml.logsecho ""  >> ${K8S_YAML_SHELL_DIR}/del-yaml.logsdone
}dump_yaml
del_yaml

http://www.ppmy.cn/ops/15895.html

相关文章

uniapp 安卓批量异步权限授权,没有授权就跳系统App设置页

首先需要一个js的sdk&#xff1a;App权限判断和提示 - DCloud 插件市场 下载下来&#xff0c;引入里面的 permission.js 示例代码&#xff1a; <script>import { requestAndroidPermission } from ./sdk/permission.jsexport default {onLaunch(e) {const getMutiPer…

自动化测试定位不到元素怎么办?

1.动态id定位不到元素 分析原因&#xff1a;每次打开页面&#xff0c;ID都会变化。用ID去找元素&#xff0c;每次刷新页面ID都会发生变化。 解决方案&#xff1a;推荐使用xpath的相对路径方法或者cssSelector查找到该元素。 2.iframe原因定位不到元素 分析原因&#xff1a;…

网络编程

网络编程 当数据交给上一层的时候&#xff0c;是由哪个协议负责进行解析呢&#xff1f;&#xff1f; 比如&#xff0c;数据链路层>网络层&#xff0c;交给IPv4解析&#xff1f;IPv6解析&#xff1f;网终层>传输层交绘TCP解析还是IDP2。 socket>操作系统提供的网络编…

运行ConvE遇到的两个问题

1.在安装requirement时&#xff0c;发现他是从远程拉取需要下载的包的目录&#xff0c;结果下载的sklearn过时了&#xff0c;报错。 解决办法&#xff1a; 我们无法修改安装的包名&#xff0c;只能忽略这个错误 linux系统输入&#xff1a;export SKLEARN_ALLOW_DEPRECATED_S…

Apollo核心原理之眼前一亮

Apollo配置中心的实现原理&#xff0c;apollo的发布配置推送变更消息就是用DeferredResult实现的。它的大概实现步骤如下&#xff1a; apollo客户端会像服务端发送长轮询http请求&#xff0c;超时时间60秒当超时后返回客户端一个304 httpstatus,表明配置没有变更&#xff0c;客…

【prometheus学习过程】

目录 一、linux服务器监控常用的监控指标 二、监控docker1、使用CAdvisor2.配置prometheus采集docker的样本数据3.添加触发器3.添加触发器 三、监控MySQL容器1.创建普通用户向数据库授予权限2.Docker部署部署MySQLD Exporter二进制安装mysqld-exporter 四、进程监控1、process …

“亚马逊依赖”之下,傲基科技的品牌势能如何提升?

受益于出口政策红利、低人工成本、完善的供应链以及成熟的生产工艺优势&#xff0c;近年来我国家具出口行业迅速发展。 数据显示&#xff0c;我国家具出口规模1995年仅为11.06亿美元&#xff0c;至2023年增至641.96亿美元。随着出口规模持续扩大&#xff0c;相关企业积极走入公…

Frida入门笔记

Frida入门笔记 1.背景1.1 概述1.2 主要功能1.3 应用场景1.4 使用方法 1.背景 Frida 是一款强大的动态代码插桩工具&#xff0c;它允许开发者在运行时对目标应用程序进行实时操作和分析。以下是对 Frida 的详细介绍&#xff1a; 1.1 概述 Frida 是一个跨平台的动态代码插桩框…