Kubernetes——批量导出 Kubernetes 命名空间下的资源 Manifest 及 CRD 资源

批量导出 Kubernetes 命名空间下的资源 Manifest 及 CRD 资源

一、需求背景

    在 Kubernetes 集群的日常管理和维护中,经常需要备份或迁移集群中的资源。为了高效地进行这一操作,本脚本旨在批量导出指定命名空间下的多种 Kubernetes 资源(如 Deployment、StatefulSet、Pods、ConfigMap、Secret、PVC、StorageClass、Service、ServiceAccount)以及集群级别的 CRD(Custom Resource Definitions)资源。 脚本首先定义了一个包含目标命名空间的数组和一个包含要导出的资源类型的数组。然后,它遍历每个命名空间,检查该命名空间下是否存在资源。如果存在,脚本会为每种资源类型创建一个目录,并遍历该命名空间下的所有资源实例,将它们以 YAML 格式导出到指定的备份目录中。同时,脚本还会导出集群中所有的 CRD 资源。 此脚本通过自动化资源导出过程,极大地简化了 Kubernetes 资源的备份和迁移工作,提高了管理员的工作效率。

二、Bash脚本实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash 
   
NAMESPACES=("namespace1" "namespace2" "namespace3"
RESOURCE_TYPES=("deployment" "statefulset" "pods" "configmap" "secret" "pvc" "storageclass" "svc" "serviceaccount"
   
current_context=$(kubectl config current-context) 
   
backup_dir="backup/k8s_${current_context}_$(date "+%Y.%m.%d-%H.%M.%S")" 
mkdir -pv "${backup_dir}" 
mkdir -pv "${backup_dir}/crd" 
   
log_file="${backup_dir}/export_resources.log" 
   
for NAMESPACE in "${NAMESPACES[@]}"; do 
    echo "正在处理命名空间: $NAMESPACE" | tee -a $log_file 
   
    resource_count=$(kubectl get all -n "${NAMESPACE}" --ignore-not-found -o jsonpath="{.items[*].metadata.name}" | wc -w) 
    if [ $resource_count -gt 0 ]; then 
        mkdir -pv "${backup_dir}/${NAMESPACE}" 
   
        for resource_type in "${RESOURCE_TYPES[@]}"; do 
            resource_names=$(kubectl get "${resource_type}" -n "${NAMESPACE}" -o jsonpath="{.items[*].metadata.name}" 2>/dev/null
   
            for resource_name in ${resource_names}; do 
                kubectl get "${resource_type}" "${resource_name}" -n "${NAMESPACE}" -o yaml > "${backup_dir}/${NAMESPACE}/${NAMESPACE}-${resource_name}-${resource_type}.yaml" 
                echo "已导出 ${NAMESPACE}-${resource_name}-${resource_type}.yaml" | tee -a $log_file 
            done 
        done 
    else 
        echo "命名空间 $NAMESPACE 下没有资源" | tee -a $log_file 
    fi 
done 
   
# 导出CRD资源 
crd_names=$(kubectl get crd | awk 'NR > 1 {print $1}'
   
for crd_name in $crd_names; do 
    kubectl get crd "${crd_name}" -o yaml > "${backup_dir}/crd/${crd_name}.yaml" 
    echo "已导出 CRD 资源 ${crd_name} 至 ${backup_dir}/crd/${crd_name}.yaml" | tee -a $log_file 
done
   
echo "所有CRD资源导出完成。" | tee -a $log_file
posted @   左扬  阅读(165)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2022-07-05 Kubernetes——网络策略
2021-07-05 云原生监控系统Prometheus——监控就是艺术!
levels of contents
点击右上角即可分享
微信分享提示