k8s集群yaml文件方式迁移

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储OSS,敏感数据保护2.0 200GB 1年
对象存储 OSS,内容安全 1000 次 1年
简介: 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 ${typein

         "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('xxxxx''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

参考:https://codeantenna.com/a/hyV7eyLUSD

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
15天前
|
Java 测试技术 数据安全/隐私保护
通过yaml文件配置自动化测试程序
通过yaml文件可以将自动化测试环境,测试数据和测试行为分开,请看一下案例
37 4
|
JSON Kubernetes API
深入理解Kubernetes配置:编写高效的YAML文件
深入理解Kubernetes配置:编写高效的YAML文件
|
存储 运维 Serverless
函数计算产品使用问题之在YAML文件中配置了环境变量,但在PHP代码中无法读取到这些环境变量,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
233 1
|
12月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
211 2
k8s学习--YAML资源清单文件托管服务nginx
|
12月前
|
Kubernetes Docker Perl
k8s常见故障--yaml文件检查没有问题 pod起不来(一直处于创建中)
k8s常见故障--yaml文件检查没有问题 pod起不来(一直处于创建中)
354 1
|
12月前
ingress相关yaml文件报错且相关资源一切正常解决方法
ingress相关yaml文件报错且相关资源一切正常解决方法
120 0
ingress相关yaml文件报错且相关资源一切正常解决方法
|
运维 Kubernetes Serverless
Serverless 应用引擎使用问题之s.yaml文件中如何使用外部环境变量
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
存储 缓存 运维
函数计算产品使用问题之如何将外部环境变量放到s.yaml文件中使用
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
157 7
|
缓存 Serverless API
函数计算产品使用问题之没有s.yaml文件,修改代码如何重新部署
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
148 2