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脚本实现

#!/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 @ 2024-07-05 15:27  左扬  阅读(105)  评论(0编辑  收藏  举报
levels of contents