当前位置: 首页 > java >正文

一个备份、去除、新增k8s的node标签脚本

#!/bin/bash# 可自定义的标签键(默认为app.room)
LABEL_KEY=${LABEL_KEY:-"app.room"}# 功能说明:
# backup <backup_file>      : 备份所有节点标签到文件
# remove <node1> [<node2>..]: 移除指定节点标签
# set <backup_file> <node1> [<node2>..] : 从备份文件恢复指定节点标签
# restore <backup_file>     : 从备份文件恢复所有节点标签
# cleanall                  : 清理所有节点上的指定标签# 检查kubectl是否存在
check_kubectl() {if ! command -v kubectl &> /dev/null; thenecho "错误:未找到kubectl命令,请确保已安装并配置"exit 1fi
}# 显示当前使用的标签键
show_label_key() {echo "当前使用的标签键: $LABEL_KEY"echo "提示:您可以通过环境变量覆盖默认标签键,例如:"echo "  export LABEL_KEY=custom.label; ./script.sh backup labels.txt"
}escape_special_chars() {local str="$1"# 使用 sed 命令对特殊字符进行转义# 以下是一些常见的特殊字符:# $ * ? [ ^ ( ) { } | & < > ~ # @ ! + = % : " ' \ / ; , . 空格local escaped_str=$(echo "$str" | sed -e 's/[$*?\[^(){}|&<>\~#@!+=%:;,.\/\ \]/\\&/g')echo "$escaped_str"
}# 获取节点标签值(使用kubectl内置功能)
get_node_label_value() {local node="$1"escape_label_key=$(escape_special_chars "$LABEL_KEY")# 使用--show-labels获取标签,然后提取特定标签值kubectl get node "$node" -o jsonpath="{.metadata.labels.$escape_label_key}" 2>/dev/null
}# 备份标签到文件
backup_labels() {local backup_file="$1"show_label_keyecho "正在备份节点标签到: $backup_file"# 清空备份文件> "$backup_file"# 获取所有节点local nodes=($(kubectl get nodes -o jsonpath='{.items[*].metadata.name}'))local total_nodes=${#nodes[@]}local count=0for node in "${nodes[@]}"; dolocal label_value=$(get_node_label_value "$node")echo "$node $label_value" >> "$backup_file"((count++))echo -ne "已备份: $count/$total_nodes 个节点\r"doneecho -e "\n备份完成! 共备份 $total_nodes 个节点"
}# 移除节点标签
remove_labels() {shift # 跳过"remove"参数if [ $# -eq 0 ]; thenecho "错误:请指定要移除标签的节点名称"exit 1fishow_label_keyfor node in "$@"; doecho "正在移除节点 $node 的 $LABEL_KEY 标签..."kubectl label nodes "$node" "$LABEL_KEY"- >/dev/null 2>&1# 验证标签是否移除local current_value=$(get_node_label_value "$node")if [ -n "$current_value" ]; thenecho "警告: 节点 $node 标签移除失败! 当前值: $current_value"elseecho "成功: 节点 $node 标签已移除"fidone
}# 从备份文件恢复指定节点标签
restore_specific_nodes() {local backup_file="$1"shift # 跳过文件名参数if [ $# -eq 0 ]; thenecho "错误:请指定要恢复标签的节点名称"exit 1fiif [ ! -f "$backup_file" ]; thenecho "错误:备份文件 $backup_file 不存在"exit 1fishow_label_keydeclare -A label_mapwhile read -r node label; dolabel_map["$node"]=$labeldone < "$backup_file"for node in "$@"; doif [[ -n label_map["$node"] ]]; thenlocal label_value="${label_map[$node]}"if [ -z "$label_value" ]; thenecho "节点 $node 在备份中没有标签,执行移除操作..."kubectl label nodes "$node" "$LABEL_KEY"- >/dev/null 2>&1# 验证移除结果local current_value=$(get_node_label_value "$node")if [ -z "$current_value" ]; thenecho "成功: 节点 $node 标签已移除"elseecho "警告: 节点 $node 标签移除失败! 当前值: $current_value"fielseecho "正在为节点 $node 设置标签: $LABEL_KEY=$label_value"kubectl label nodes "$node" "$LABEL_KEY=$label_value" --overwrite >/dev/null# 验证设置结果local current_value=$(get_node_label_value "$node")if [ "$current_value" = "$label_value" ]; thenecho "成功: 节点 $node 标签已设置为 $label_value"elseecho "警告: 节点 $node 标签设置失败! 当前值: $current_value"fifielseecho "警告: 节点 $node 在备份文件中不存在"fidone
}# 完全恢复所有节点标签
full_restore() {local backup_file="$1"if [ ! -f "$backup_file" ]; thenecho "错误:备份文件 $backup_file 不存在"exit 1fishow_label_keyecho "正在从 $backup_file 恢复所有节点标签..."local total_lines=$(wc -l < "$backup_file")local count=0while read -r node label; doif [ -n "$label" ]; thenkubectl label nodes "$node" "$LABEL_KEY=$label" --overwrite >/dev/nullelsekubectl label nodes "$node" "$LABEL_KEY"- >/dev/null 2>&1fi((count++))echo -ne "已恢复: $count/$total_lines 个节点\r"done < "$backup_file"echo -e "\n恢复完成! 已处理 $total_lines 个节点"
}# 清理所有节点上的指定标签
clean_all_labels() {show_label_keyecho "警告: 即将清理所有节点上的 $LABEL_KEY 标签!"read -p "确认要继续吗? (y/N) " confirmif [[ "$confirm" != "y" && "$confirm" != "Y" ]]; thenecho "操作已取消"exit 0fi# 获取所有节点名称local nodes=($(kubectl get nodes -o jsonpath='{.items[*].metadata.name}'))local total_nodes=${#nodes[@]}local count=0echo "开始清理 $total_nodes 个节点上的标签..."for node in "${nodes[@]}"; dokubectl label nodes "$node" "$LABEL_KEY"- >/dev/null 2>&1((count++))echo -ne "已处理: $count/$total_nodes 个节点\r"doneecho -e "\n清理完成! 所有节点上的 $LABEL_KEY 标签已被移除"# 验证清理结果echo "验证清理结果:"for node in "${nodes[@]}"; dolocal current_value=$(get_node_label_value "$node")if [ -n "$current_value" ]; thenecho "$node: 标签状态: $current_value (未清理)"elseecho "$node: 标签状态: <空> (已清理)"fidone
}# 主程序
check_kubectlcase "$1" inbackup)if [ -z "$2" ]; thenecho "用法: $0 backup <备份文件>"exit 1fibackup_labels "$2";;remove)remove_labels "$@";;set)if [ -z "$2" ] || [ -z "$3" ]; thenecho "用法: $0 set <备份文件> <节点1> [节点2...]"exit 1fishiftrestore_specific_nodes "$@";;restore)if [ -z "$2" ]; thenecho "用法: $0 restore <备份文件>"exit 1fifull_restore "$2";;cleanall)clean_all_labels;;*)echo "Kubernetes 节点标签管理工具"show_label_keyecho "用法:"echo "  $0 backup <e份文件>       备份所有节点标签"echo "  $0 remove <节点1> [节点2..] 移除指定节点标签"echo "  $0 set <备份文件> <节点1> [节点2..] 从备份恢复指定节点标签"echo "  $0 restore <备份文件>      从备份恢复所有节点标签"echo "  $0 cleanall                清理所有节点上的指定标签"echo ""echo "环境变量:"echo "  LABEL_KEY: 设置自定义标签键(默认: app.room)"exit 1;;
esac

使用示例:

  1. 备份标签:  ./label_manager.sh backup env_labels.txt
  2. 去除所有标签:./label_manager.sh cleanall
  3. 恢复指定节点标签值:./label_manager.sh set env_labels.txt [主机1] [主机2]
  4. 去除指定节点标签值:./label_manager.sh remove [主机1] [主机2]
  5. 从备份文件中恢复所有节点标签值:./label_manager.sh restore env_labels.txt

        ​​​​​

http://www.xdnf.cn/news/18630.html

相关文章:

  • `strdup` 字符串复制函数
  • 【JVM内存结构系列】二、线程私有区域详解:程序计数器、虚拟机栈、本地方法栈——搞懂栈溢出与线程隔离
  • 奇怪的前端面试题
  • 智能系统与未来生态演进初步思考
  • LangChain4j中集成Redis向量数据库实现Rag
  • 2-4.Python 编码基础 - 流程控制(判断语句、循环语句、break 语句与 continue 语句)
  • 【Python】新手入门:Python标准库有哪些常用模块?
  • 容器安全实践(二):实践篇 - 从 `Dockerfile` 到 Pod 的权限深耕
  • 美食菜谱数据集(13943条)收集 | 智能体知识库 | AI大模型训练
  • 自学嵌入式第二十六天:数据结构-哈希表、内核链表
  • 从0开始学习Java+AI知识点总结-23.web实战案例(班级和学生增删改查、信息统计)
  • 【Prometheus】Prometheus监控Docker实战
  • C++编程语言:标准库:第36章——字符串类(Bjarne Stroustrup)
  • 【C语言16天强化训练】从基础入门到进阶:Day 8
  • Krea Video:Krea AI推出的AI视频生成工具
  • 知识蒸馏 Knowledge Distillation 序列的联合概率 分解成 基于历史的条件概率的连乘序列
  • 大模型——深度评测智能体平台Coze Studio
  • 2025-08-23 李沐深度学习19——长短期记忆网络LSTM
  • Kafka Streams vs Apache Flink vs Apache Storm: 实时流处理方案对比与选型建议
  • SpringBootWeb入门
  • Ollama 本地部署 Qwen2.5-7b
  • 搜索--常见面试问题
  • Android 之wifi连接流程
  • 使用 LangChain 和 Neo4j 构建知识图谱
  • 一文学会vue的动态权限控制
  • 00后AI创业者崛起与AI商业应用新玩法:从Mercor到历史人物复刻的机遇
  • 【剖析高并发秒杀】从流量削峰到数据一致性的架构演进与实践
  • MySQL GPG 密钥更新问题解决文档
  • Kubernetes网络服务全解析
  • Linux netfilter工作原理详解