脚本文件

dump_yaml_by_namespace.sh

 1#!/bin/bash
 2
 3# 作用:
 4# 备份指定namespace下的kubernetes资源清单文件
 5
 6# ===== 变量定义 =====
 7namespace=$1
 8manifests=${2:-manifests}
 9today=$(date +%Y%m%d)
10
11# ===== 函数定义部分 =====
12# 红色终端显示
13function red() {
14  local body=$1
15  echo -e "\033[31m${body}\033[0m"
16}
17
18# 绿色终端显示
19function green() {
20  local body=$1
21  echo -e "\033[32m${body}\033[0m"
22}
23
24# 导出yaml格式的文件
25function dump_to_yaml() {
26  local type=$1
27  green "get ${namespace} ${type}."
28  for i in $(kubectl get ${type} -n ${namespace} 2>/dev/null | awk '{if(NR!=1) print $1}'); do
29    kubectl get ${type} -n ${namespace} $i -oyaml \
30      > ${manifests}/${namespace}/${today}/${type}/${i}.yaml 2>/dev/null
31    if [ $? -ne 0 ]; then
32      red "failed to get ${namespace} ${type} $i."
33    fi
34  done
35}
36
37# 删除资源清单为空的目录
38function delete_empty_dir(){
39  green "delete empty directory."
40  # 显示空目录
41  find ${manifests} -type d -empty
42  # 删除空目录
43  find ${manifests} -type d -empty | xargs rm -rf
44}
45
46# 获取镜像列表并显示在终端
47function fn_get_images(){
48  green "get ${namespace} image"
49  if [ -f ${manifests}/${namespace}/${today}/images.txt ]; then
50    rm -f ${manifests}/${namespace}/${today}/images.txt
51  fi 
52
53  grep "image:" ${manifests}/${namespace}/${today}/*/*.yaml | awk '{print $NF}' \
54    >> ${manifests}/${namespace}/${today}/images.txt
55  cat ${manifests}/${namespace}/${today}/images.txt
56}
57
58# 检测是否有输入namespace,若无输入从指定namespace列表中选取
59function check_namespace(){
60  if [ -z $namespace ]; then
61    red "namespace undefined, select namespace serial number from bellow:"
62    select ns in $(kubectl get ns | awk '{if(NR!=1) print $1}'); do
63      namespace=$ns
64      break
65    done
66  fi
67}
68
69# 准备资源清单目录
70function prepare_resource_dir(){
71  for dir in deployment daemonset cronjob configmap service secret; do
72    if [ ! -d ${manifests}/${namespace}/${today}/${dir} ]; then
73      mkdir -p ${manifests}/${namespace}/${today}/${dir}
74    fi
75  done
76}
77
78# ===== 程序执行部分 =====
79# 检查namespace
80check_namespace
81
82# 1.准备资源清单目录
83prepare_resource_dir
84
85# 2.启动备份
86for type in secret daemonset deployment cronjob configmap service; do
87  dump_to_yaml ${type}
88done
89
90# 3.删除空目录
91delete_empty_dir
92
93# 4.显示镜像列表
94fn_get_images

dump_all.sh

1#!/bin/bash
2
3backup_dir=manifests
4
5# 备份所有namespace下资源清单文件
6for ns in ${kubectl get ns | awk '{if(NR>1)print $1}'}; do
7  ./dump_yaml_by_namespace.sh $ns ${backup_dir}
8done

扩展

  1. 可以将脚本设置为定时任务运行,定时备份资源清单文件;
  2. 可以将备份上传到指定的文件服务器上,比如对象存储;
  3. 还可以使用第三方备份工具velero来管理kubernetes资源。