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

news2024/11/17 20:32:01

大家好,我叫秋意零

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1614484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vcruntime140.dll文件丢失的解决办法,为什么导致vcruntime140.dll文件丢失

废话少说,今天这篇文章直接和大家聊聊vcruntime140.dll文件丢失的解决办法,同时给大家分析vcruntime140.dll文件为什么会导致文件丢失。一起来看看吧。 vcruntime140.dll文件缺失的可能原因 A. 文件损坏或删除:vcruntime140.dll文件可能会…

《人工智能》大作业反馈

0 写在前面 春学期带了一门很有意思的课《人工智能与机器学习》,在学期初就在构思怎么才能把这门课上好,怎么才能让一群土木大类专业的小孩对人工智能这个领域感兴趣,怎么才能让他们将这个专业与自己专业结合起来。我对自己的要求就是希望自…

【C++类和对象】初始化列表与隐式类型转换

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

Canal1--搭建Canal监听数据库变化

1.安装mysql 默认安装了mysql(版本8.0.x); 新创建用户 -- 创建用户 用户名:canal 密码:Canal123456 create user canal% identified by Canal123456;授权 grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on…

使用AOP切面做防止用户重复提交功能

在我们的项目中,需要考虑到有时候因为网络原因或者其他原因用户对同一个接口进行同一批数据的重复性操作,如果不做这样的处理很可能会在数据库中添加多条同样的数据。 我们可以通过使用aop来解决这样的问题,接下来看看具体怎么做吧~ 自定义…

c语言中,数组取地址的书写格式

数组取地址 为了更好的区分数组取地址时的情况,我们建立两个数组,arr1一维数组和arr2二维数组,用printf函数来打印出每个例子arr1和arr2的地址,这样可以更加直观的区分出来。 首先我们看到第一组打印,可以看到若是直接…

Python | Leetcode Python题解之第37题解数独

题目: 题解: class Solution:def solveSudoku(self, board: List[List[str]]) -> None:def dfs(pos: int):nonlocal validif pos len(spaces):valid Truereturni, j spaces[pos]for digit in range(9):if line[i][digit] column[j][digit] bloc…

jmeter 指定QPS压测接口

文章目录 jmeter 指定QPS压测接口更换语言为中文创建测试任务新建线程组右键线程组,新建http request,填写要你要压测的接口地址、参数如果需要自定义请求头,添加一个Http头信息管理器要查看结果和QPS统计数据,给上门的http请求添…

JVM虚拟机(十二)ParallelGC、CMS、G1垃圾收集器的 GC 日志解析

目录 一、如何开启 GC 日志?二、GC 日志分析2.1 PSPO 日志分析2.2 ParNewCMS 日志分析2.3 G1 日志分析 三、GC 发生的原因3.1 Allocation Failure:新生代空间不足,触发 Minor GC3.2 Metadata GC Threshold:元数据(方法…

poll实现echo服务器的并发

poll实现echo服务器的并发 代码实现 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/time.h> #include <unistd.h> #…

c++的智能指针(5) -- weak_ptr

概述 我们在使用shared_ptr会出现以下的问题&#xff0c;会导致内存泄露。 代码1: 类内指针循环指向 #include <iostream> #include <memory>class B;class A { public:A() {std::cout << "Construct" << std::endl;}~A() {std::cout <…

基于开源CrashRpt与微软开源Detours技术深度改造的异常捕获库分享

目录 1、异常捕获模块概述 2、为什么需要异常捕获模块&#xff1f; 3、在有些异常的场景下是没有生成dump文件的 4、开源异常捕获库CrashRpt介绍 5、对开源库CrashRpt的改进 C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持…

# 从浅入深 学习 SpringCloud 微服务架构(二)模拟微服务环境(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;二&#xff09;模拟微服务环境&#xff08;1&#xff09; 段子手168 1、打开 idea 创建父工程 创建 artifactId 名为 spring_cloud_demo 的 maven 工程。 --> idea --> File --> New --> Project --> Ma…

基于贝叶斯算法的机器学习在自动驾驶路径规划中的应用实例

目录 第一章 引言 第二章 数据准备 第三章 贝叶斯路径规划模型训练 第四章 路径规划预测 第五章 路径执行 第六章 实验结果分析 第一章 引言 自动驾驶技术的发展带来了自动驾驶车辆的出现&#xff0c;而路径规划作为自动驾驶车辆的关键功能之一&#xff0c;对于确定最佳行…

锐捷校园网自助服务系统 operatorReportorRoamService SQL注入漏洞致RCE漏洞复现

0x01 产品简介 锐捷校园网自助服务系统是锐捷网络推出的一款面向学校和校园网络管理的解决方案。该系统旨在提供便捷的网络自助服务,使学生、教职员工和网络管理员能够更好地管理和利用校园网络资源。 0x02 漏洞概述 锐捷校园网自助服务系统 operatorReportorRoamService 接…

STP学习的第一篇

1.STP的基本概念&#xff1a;根桥 &#xff08;1&#xff09;STP的主要作用之一是在整个交换网络中计算出一棵无环的“树”&#xff08;STP树&#xff09;。 &#xff08;2&#xff09;根桥是一个STP交换网络中的“树根”。 &#xff08;3&#xff09;STP开始工作后&#xf…

一、MinIO基本知识

MinIO基本知识 一、简介1.许可 二、部署1.Docker部署1.1 部署容器 1.2 MinIO页面访问1.3 创建Bucket![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6c8aa92975f146b691f1f36ce1033e7c.png) 三、Python-API1.安装包2.Bucket、Object概念3.Bucket-API4.MinIOClient-…

【Yolov系列】Yolov5学习(一)补充1.2:自适应锚框计算详解+代码注释

一、自适应锚框计算详解 自适应锚框计算的具体过程&#xff1a; ①获取数据集中所有目标的宽和高。 ②将每张图片中按照等比例缩放的方式到 resize 指定大小&#xff0c;这里保证宽高中的最大值符合指定大小。 ③将 bboxes 从相对坐标改成绝对坐标&#xff0c;这里…

余氯控制器的功能优势简介

余氯控制器是一款智能化的水质监测设备&#xff0c;它采用高精度AD转换和单片机微处理技术&#xff0c;能够完成余氯值的高精度测量。这款控制器具备时间显示、数据存储等基本功能。 高智能化设计&#xff1a;余氯控制器采用了高精度AD转换和单片机微处理技术&#xff0c;确保…

VisualGLM-6B的部署步骤

对于如下命令&#xff0c;你将完全删除环境和环境中的所有软件包 conda remove -n env_name --all 一、VisualGLM-6B环境安装 1、硬件配置 操作系统&#xff1a;Ubuntu_64&#xff08;ubuntu22.04.3&#xff09; GPU&#xff1a;4050 显存&#xff1a;16G 2、配置环境 建…