k8s 业务备份

#!/bin/bash

namespaces=("demo" "prd" "java-test" "infra")

types=("svc" "deployment" "cm")

backup_dir="/root/daocloud/backup-wan"

mkdir -p "${backup_dir}"

for namespace in "namespaces@";domkdir−p"{namespaces@}"; do mkdir -p "namespaces@";domkdir−p"{backup_dir}/namespace"fortypein"{namespace}" for type in "namespace"fortypein"{types@}"; do

for i in kubectl -n ${namespace} get ${type} | grep -v NAME | awk '{print $1}'; do

kubectl --namespace="namespace"get−o=json"{namespace}" get -o=json "namespace"get−o=json"{type}" "i"∣jq−−sort−keys ′del(.metadata.annotations."control−plane.alpha.kubernetes.io/leader",.metadata.annotations."deployment.kubernetes.io/revision",.metadata.annotations."kubectl.kubernetes.io/last−applied−configuration",.metadata.creationTimestamp,.metadata.generation,.metadata.resourceVersion,.metadata.selfLink,.metadata.uid,.spec.clusterIP,.status)′∣python−c′importsys,yaml,json;yaml.safedump(json.load(sys.stdin),sys.stdout,defaultflowstyle=False)′>"{i}" | jq --sort-keys \ 'del( .metadata.annotations."control-plane.alpha.kubernetes.io/leader", .metadata.annotations."deployment.kubernetes.io/revision", .metadata.annotations."kubectl.kubernetes.io/last-applied-configuration", .metadata.creationTimestamp, .metadata.generation, .metadata.resourceVersion, .metadata.selfLink, .metadata.uid, .spec.clusterIP, .status )' | python -c 'import sys, yaml, json; yaml.safe_dump(json.load(sys.stdin), sys.stdout, default_flow_style=False)' >"i"∣jq−−sort−keys ′del(.metadata.annotations."control−plane.alpha.kubernetes.io/leader",.metadata.annotations."deployment.kubernetes.io/revision",.metadata.annotations."kubectl.kubernetes.io/last−applied−configuration",.metadata.creationTimestamp,.metadata.generation,.metadata.resourceVersion,.metadata.selfLink,.metadata.uid,.spec.clusterIP,.status)′∣python−c′importsys,yaml,json;yaml.safedump(json.load(sys.stdin),sys.stdout,defaultflowstyle=False)′>"{backup_dir}/namespace/{namespace}/namespace/{i}.${type}.yaml"

done

done

done

#!/bin/bash

set -euo pipefail

白名单文件(只备份里面列的命名空间,避免备份 kube-system 等)

WHITELIST="/root/daocloud/namespaces-to-backup.txt"

backup_dir="/root/daocloud/backup"

mkdir -p "${backup_dir}"

要备份的资源类型

types=("deployment" "statefulset" "daemonset" "svc" "cm" "secret" "ingress" "pvc" "networkpolicy" "hpa")

从白名单获取命名空间

mapfile -t namespaces < "${WHITELIST}"

for namespace in "${namespaces@}"; do

echo ">>> 备份命名空间: namespace"mkdir−p"{namespace}" mkdir -p "namespace"mkdir−p"{backup_dir}/namespace"fortypein"{namespace}" for type in "namespace"fortypein"{types@}"; do

echo " - 资源类型: type"resources={type}" resources=type"resources=(kubectl -n "namespace"get"{namespace}" get "namespace"get"{type}" --no-headers -o custom-columns=":metadata.name" 2>/dev/null || true)

for r in ${resources}; do

echo " -> r"kubectl−n"{r}" kubectl -n "r"kubectl−n"{namespace}" get "type""{type}" "type""{r}" -o yaml

| yq eval 'del(

.metadata.annotations."deployment.kubernetes.io/revision",

.metadata.annotations."kubectl.kubernetes.io/last-applied-configuration",

.metadata.creationTimestamp,

.metadata.generation,

.metadata.resourceVersion,

.metadata.selfLink,

.metadata.uid,

.status

)' -

> "backupdir/{backup_dir}/backupdir/{namespace}/r.{r}.r.{type}.yaml"

done

done

done

图片

图片

application-system

baize-system

dao-2048

demo0228

dowl-system

drun

horikoshitest

k-cloudy

k-cloudy2

kdoctor

lanma-space

lantian

mcamel-system

openldap1

skoala-system

test-20250310

virtnest-system

w01-wx

xianyang1-ns

zhengguang-demo

dak

mcamel-system

gpu-operator

models

jobset-system

w02-wx

demo

hdic-test

proc

test

test-cjl

test-hb

test-hb2

#!/bin/bash

set -euo pipefail

backup_dir="/root/daocloud/backup"

WHITELIST="/root/daocloud/namespaces-to-backup.txt"

从白名单读取命名空间

mapfile -t namespaces < "${WHITELIST}"

定义恢复顺序:配置类 -> 存储类 -> 工作负载 -> 网络类 -> 其他

order=("cm" "secret" "pvc" "deployment" "statefulset" "daemonset" "svc" "ingress" "networkpolicy" "hpa")

apply_yaml() {

local file=$1

echo " -> 应用资源: (basename"(basename "(basename"{file}")"

if ! kubectl apply -f "${file}"; then

echo " !! 首次失败,稍后重试: file"echo"{file}" echo "file"echo"{file}" >> /tmp/restore-retry.list

fi

}

for namespace in "${namespaces@}"; do

echo ">>> 恢复命名空间: ${namespace}"

如果命名空间不存在则创建

if ! kubectl get ns "KaTeX parse error: Expected 'EOF', got '&' at position 27: ..." >/dev/null 2>&̲1; then kub...{namespace}"

echo " - 已创建命名空间 ${namespace}"

fi

ns_dir="backupdir/{backup_dir}/backupdir/{namespace}"

if \[ -d "KaTeX parse error: Expected 'EOF', got '#' at position 24: ..." ]; then #̲ 按顺序依次 apply ...{order@}"; do

files=(ls"(ls "(ls"{ns_dir}"/*.${kind}.yaml 2>/dev/null || true)

for file in files;do\[−f"files; do \[\[ -f "files;do\[\[−f"{file}" ] && apply_yaml "${file}"

done

done

else

echo " - 未找到备份目录: ${ns_dir}"

fi

done

如果有失败的,重试一次

if \[ -f /tmp/restore-retry.list ]; then

echo ">>> 开始重试 apply 失败的资源..."

while read -r file; do

echo " -> 重试: file"kubectlapply−f"{file}" kubectl apply -f "file"kubectlapply−f"{file}" || echo " !! 依然失败: ${file}"

done < /tmp/restore-retry.list

rm -f /tmp/restore-retry.list

fi

echo ">>> 恢复完成 ✅"

相关推荐
虎头金猫5 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS5 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun5 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
赵文宇(温玉)5 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang5 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren5 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿6 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl6 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、6 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove6 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21