k8s集群yaml文件方式迁移
一、安装依赖工具
实际就是导出数据为json,通过jq删除一些不需要的字段,然后再通过yq转换为yaml格式(不安装直接使用json格式也可以安装,这里主要为例方便查看),这么麻烦主要是不知道导出yaml文件时如何过滤一些不需要的字段,如果哪位知道可以指教一下。
1 2 3 4 5 6 | [root@k8s-master test]# yum install jq -y #解析json [root@k8s-master ~]# wget https: //github.com/mikefarah/yq/releases/download/v4.16.2/yq_linux_amd64 #将json转换为yaml 最新下载地址:https://github.com/mikefarah/yq/releases [root@k8s-master ~]# chmod +x yq_linux_amd64 [root@k8s-master ~]# mv yq_linux_amd64 /usr/bin/yq [root@k8s-master ~]# yq --version yq (https: //github.com/mikefarah/yq/) version 4.16.2 |
二、创建脚本
V1.13
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 | #!/bin/bash DATA_TIME=` date +%Y%m%d%H%M%S` #每次创建根据时间创建 BACKUP_DIR= /tmp/k8s-backup-restore #备份的目录 NS_LIST= 'change-battery-demo nginx-ingress-port tools tsp' # 指定需要备份的namespaces,也可以使用kubectl获取所有,按需 #CONFIG_TYPE="service deploy configmap secret job cronjob replicaset daemonset statefulset" CONFIG_TYPE= "service deploy ingress" # 指定namespaces下需要备份的资源类型,按需 for ns in ${NS_LIST}; do BACKUP_DIR_DATE=${BACKUP_DIR}/${ns}/${DATA_TIME} #备份目录,按namespace根据时间分别创建 mkdir -p ${BACKUP_DIR_DATE} && cd ${BACKUP_DIR_DATE} #创建备份目录 for type in ${CONFIG_TYPE}; do item_num=$(kubectl -n ${ns} get ${ type } 2> /dev/null | wc -l) #过滤资源类型为空 if [ ${item_num} -lt 1 ]; then continue ; fi #包含NAME行,所以如果存在资源item_num不小于2 ITEM_LIST=$(kubectl -n ${ns} get ${ type } | awk '{print $1}' | grep - v 'NAME' ) for item in ${ITEM_LIST}; do file_name=${BACKUP_DIR_DATE}/${ type }_${item}.yaml kubectl -n ${ns} get ${ type } ${item} -o=json | jq '. | del( .spec.clusterIP, .metadata.uid, .metadata.selfLink, .metadata.resourceVersion, .metadata.creationTimestamp, .metadata.generation, .metadata.annotations, .spec.cephfs, .spec.volumeName, .status, .spec.template.metadata.creationTimestamp, .spec.template.spec.securityContext, .spec.template.spec.dnsPolicy, .spec.template.spec.terminationGracePeriodSeconds, .spec.template.spec.restartPolicy )'|yq eval -P > ${file_name} #del中是要删除的字段 done done done |
V1.22
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | #!/bin/bash DATA_TIME=` date +%Y-%m-%d-%H-%M-%S` #每次创建根据时间创建 BACKUP_DIR_BASE= /mnt/k8s-backup-restore #备份的目录 CURRENT_BACKUP_DIR=${BACKUP_DIR_BASE}/${DATA_TIME} #备份的目录 NS_LIST=$(kubectl get ns| grep 'Active' | egrep - v 'ahas|ahas-sentinel-pilot|arms-pilot|arms-prom|edas-oam-system|kube-public|kube-node-lease|kube-system' | awk '{print $1}' ) # 指定需要备份的namespaces,也可以使用kubectl获取所有,按需 #NS_LIST="tools" #CONFIG_TYPE="service deploy configmap secret job cronjob replicaset daemonset statefulset" CONFIG_TYPE= "svc deploy ingress cm secret statefulsets" # 指定namespaces下需要备份的资源类型,按需 CURRENT_DIR=$( cd $( dirname $0); pwd ) ingress_set=" del( .metadata.uid, .metadata.resourceVersion, .metadata.creationTimestamp, .metadata.generation, .status ) " cm_set=" del( .metadata.uid, .metadata.annotations, .metadata.resourceVersion, .metadata.creationTimestamp ) " secret_set=" del( .metadata.uid, .metadata.annotations, .metadata.resourceVersion, .metadata.creationTimestamp ) " svc_set=" del( .metadata.uid, .metadata.resourceVersion, .metadata.creationTimestamp, .metadata.annotations, .status, .spec.clusterIP, .spec.clusterIPs, .spec.internalTrafficPolicy, .spec.ipFamilies, .spec.ipFamilyPolicy, .spec.sessionAffinity ) " deploy_set=" del( .metadata.uid, .metadata.generation, .metadata.resourceVersion, .metadata.creationTimestamp, .metadata.annotations, .status, .spec.progressDeadlineSeconds, .spec.revisionHistoryLimit, .spec.strategy, .spec.template.metadata.annotations, .spec.template.metadata.creationTimestamp ) " statefulset_set=" del( .metadata.generation, .metadata.uid, .metadata.resourceVersion, .metadata.creationTimestamp, .spec.podManagementPolicy, .spec.revisionHistoryLimit, .spec.template.metadata.creationTimestamp, .spec.template.metadata.annotations, .spec.template.spec.restartPolicy, .spec.template.spec.schedulerName, .spec.template.spec.securityContext, .spec.updateStrategy, .status ) " function backup_k8s_to_yaml(){ for ns in ${NS_LIST}; do BACKUP_DIR_DATE=${CURRENT_BACKUP_DIR}/${ns} #备份目录,按namespace根据时间分别创建 mkdir -p ${BACKUP_DIR_DATE} && cd ${BACKUP_DIR_DATE} #创建备份目录 for type in ${CONFIG_TYPE}; do item_num=$(kubectl -n ${ns} get ${ type } 2> /dev/null | wc -l) #过滤资源类型为空 if [ ${item_num} -lt 1 ]; then continue ; fi #包含NAME行,所以如果存在资源item_num不小于2 ITEM_LIST=$(kubectl -n ${ns} get ${ type } | awk '{print $1}' | grep - v 'NAME' ) for item in ${ITEM_LIST}; do file_name=${BACKUP_DIR_DATE}/${ type }_${item}.yaml case ${ type } in "cm" ) set_info=${cm_set} ;; "svc" ) set_info=${svc_set} ;; "secret" ) set_info=${secret_set} ;; "ingress" ) set_info=${ingress_set} ;; #kubectl -n ${ns} get ${type} ${item} -o=json | jq '. |${ingress_set}'|yq eval -P > ${file_name};; "deploy" ) set_info=${deploy_set} ;; "statefulsets" ) set_info=${statefulset_set} ;; esac kubectl -n ${ns} get ${ type } ${item} -o=json | jq --args "${set_info}" '.|${set_info}' | yq eval -P > ${file_name} [[ $? - ne 0 ]] && exit done done done } function archive_and_upload(){ archive_file_name=k8s-backup-${DATA_TIME}. tar .gz cd ${BACKUP_DIR_BASE} && tar -jcf ${archive_file_name} ${DATA_TIME} &> /dev/null if [[ -s ${archive_file_name} ]]; then /usr/bin/python3 ${CURRENT_DIR} /oss_uoload .py k8s_backup/${archive_file_name} ${BACKUP_DIR_BASE}/${archive_file_name} fi } function main(){ backup_k8s_to_yaml; archive_and_upload; } main; |
上传到OSS
1 2 3 4 5 6 7 8 9 10 11 | #!/usr/bin/python3 # -*- coding: utf-8 -*- import oss2 import os import sys oss_file_name = sys.argv[ 1 ] local_file_name = sys.argv[ 2 ] auth = oss2.Auth( 'LTAI5tKDLc6S2pkrcqyZHEh8' , 'OJybPiQpyeS22tlKpmgaex1xxxxxx' ) bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com' , 'mqops-backup' ) bucket.put_object_from_file(filename = local_file_name,key = oss_file_name) |
脚本生成的路径树如下
1 2 3 4 5 6 7 8 9 | root@tsp-prod-ansible:~ /script_dir # tree -L 3 /mnt /mnt/ └── k8s-backup-restore ├── 2022-11-10-14-24-01 │ ├── bmp-prd │ ├── change-battery-demo │ ├── default │ ├── mk1-prod │ ├── mk1-website |
"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少
分类:
kubernetes
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具