shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份

news2024/11/18 18:16:54

shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份

  • 需求说明
  • 功能实现
    • shell 脚本实现
    • shell 使用方式
      • 前置工具环境安装
      • dump-k8s-yaml.sh 使用方式
        • 输入命令 `bash ./dump-k8s-yaml.sh`
        • dump-k8s-yaml.sh 应用举例
      • dump-k8s-yaml.sh 输出日志信息
  • 参考文档

在这里插入图片描述

需求说明

在基于 k8s 平台的容器化部署环境中,有时候需要快速的实现部署文件的迁移备份,当 k8s 平台部署一个 app 时,都会相应的产生一堆 yaml 文件,如果 yaml 文件数量较少,我们可以人工手动的方式进行拷贝,但是当 yaml 文件数量多,并且该 k8s 平台部署了多个 app 时,如果在采用人工手动的方式实现这些 yaml 文件的拷贝,可想而知这个工作量是相当多且繁琐的,而这些机械化的人工操作还会产生误差,无法保障文件内容质量,针对这种场景,因此我们采用 shell 脚本来实现快速的 yaml 文件迁移拷贝,相应的提升工作效率并保障 yaml 文件内容质量。

功能实现

实现思路,这里主要是应用了 【bash & kubectl 】组合知识点,实现对 k8s 平台上指定 namespacesns,命名空间)下指定资源的 yaml 文件拷贝,shell 脚本实现如下:

shell 脚本实现

dump-k8s-yaml.sh 工具 shell 脚本编写如下:

#!/bin/bash

useage(){
    echo "Useage:"
    echo "  bash ./dump-k8s-yaml.sh DUMPDIR KUBECONFIG [NAMESPACE]"
}
 
if [ $# -lt 1 ];then
    useage
    exit
fi

dumpDir=$1
KF=$2
NS=$3
 
resourceList=(
  #componentstatuses       # cs
  configmaps              # cm
  secrets
  persistentvolumeclaims  # pvc
  events                  # ev
  serviceaccounts         # sa
  endpoints               # ep
  services                # svc
  ingress
  daemonsets              # ds
  deployments             # deploy
  replicasets             # rs
  statefulsets            # sts
  jobs
  cronjobs                # cj
  pods                    # po
)

showResourceList(){
  kubectl --kubeconfig=$KF -n=$NS get nodes
  kubectl --kubeconfig=$KF --sort-by=.metadata.name -n=$NS get pods
  kubectl --kubeconfig=$KF -n=$NS get cm,secrets,pvc,ev,sa,ep,svc,ingress,ds,deploy,rs,sts,jobs,cj
}

printList(){
  for aa in ${resourceList[@]};
  do
    aList=$(kubectl --kubeconfig=$KF -n=$NS get $aa | grep -v NAME | awk '{print $1}')
    if [ ! "${aList[*]}"x == "x" ];then
      [ -d $dumpDir/$aa ] || mkdir -p $dumpDir/$aa
      for i in $aList;
      do
        echo $aa $i
        kubectl --kubeconfig=$KF -n=$NS get $aa $i -o yaml > $dumpDir/$aa/$i.yaml
      done
    fi
  done
}

zipExec(){
  #sudo apt install zip unzip
  #zip -v
  #unzip -v
  zip -r -q $dumpDir.zip file $dumpDir
  rm -rf $dumpDir
}
 
# create namespaces yaml
if [ ! -d $dumpDir ];then
  mkdir -p -m 777 ./$dumpDir
fi

kubectl --kubeconfig=$KF get namespaces $NS -o yaml > $dumpDir/$NS.yaml

# create pv yaml
pvList=$(kubectl --kubeconfig=$KF get pv | grep "$NS/" | awk '{print $1}')
if [ ! "${pvList[*]}"x == "x" ];then
  [ -d $dumpDir/persistentvolumes ] || mkdir -p $dumpDir/persistentvolumes
  for i in ${pvList[@]}
  do
    echo persistentvolumes $i
    kubectl --kubeconfig=$KF get pv $i -o yaml > $dumpDir/persistentvolumes/$i.yaml
  done
fi

echo "----[showResourceList]-----------------------"
showResourceList
echo "----[printList]-----------------------"
printList
echo "----[zipExec]-----------------------"
zipExec
echo "export ${NS} ymal completed!"

:<<!
使用方法:
bash dump-k8s-yaml.sh ./demons ./kube.conf demons

举例:
bash ./dump-k8s-yaml.sh ./dotnet-escada ./kube.conf dotnet-escada
!

shell 使用方式

注意:使用此命令,需要获得 kubectl 访问 k8s 集群环境的相应权限(即 kubeconfig 配置信息);

前置工具环境安装

从上面的 dump-k8s-yaml.sh 文件中可以看到部分工具的依赖,说明如下:

  • xshell 工具安装(请参照);
  • shell 终端(此处使用的 XShell)配置好 kubectl 工具,并获取到 kubeconfig 文件;
  • linux 环境安装文件压缩 & 解压工具 zip & unzip
  • linux 环境安装 lrzsz 工具(说明 lrzsz 工具只适合传输小文件,不适合传输大型文件,通常情况 lrzsz 配合 xshell 工具使用);

说明:此处 linux 环境的工具安装命令,适用基于 Ubuntu 的发行版,本人使用的环境是 Debian 11。其他 linux 发行版请自行查看对应的安装命令即可,下面的 dump-k8s-yaml.sh 工具在 linux 环境均可通用;

1、配置 kubectl,并导出 kubeconfig 文件请自行参考相关资料;

2、linux 宿主机没有安装 zip & unzip 工具,执行如下命令:

# linux 安装 zip,unzip:
   sudo apt install zip unzip

# 查看版本:
   zip -v
   unzip -v

# zip 压缩文件:
   zip -r -q dump-yaml.zip file ./dump-yaml

# unzip 压缩文件:
   unzip dump-yaml.zip

3、linux 宿主机安装 lrzsz 工具,执行如下命令:

sudo apt update && apt install lrzsz
...
XShell 文件上传 & 下载:
# 上传文件:rz 
# 单个文件下载:sz file dump-yaml.zip
# 多文文件下载(文件中间使用空格分开):sz file dump-yaml-1.zip dump-yaml-2.zip

dump-k8s-yaml.sh 使用方式

注意:使用【xshell& lrzsz】工具,先把【dump-k8s-yaml.sh】工具上传到 linux 环境,并指定 kubeconfig 文件,此处该文件名称为 kube.conf,和 dump-k8s-yaml.sh 工具是在同一个目录环境下(DUMPDIR 指定方便路径), kubeconfig 文件也可以放在其他路径。

在 linux 宿主机中准备好上面这些基础环境的配置和 shell 客户端工具安装后,接下来我们就可以使用 dump-k8s-yaml.sh 实现 k8s 环境中指定资源的 yaml 文件导出了,使用方式如下:

输入命令 bash ./dump-k8s-yaml.sh

cloud@k8s-node-1:~$ bash ./dump-k8s-yaml.sh 
Useage:
  bash ./dump-k8s-yaml.sh DUMPDIR KUBECONFIG [NAMESPACE]
  • 参数说明:
  1. bash 指定 shell 终端类型;
  2. ./dump-k8s-yaml.sh 当前目录下的 dump-k8s-yaml.sh 工具;
  3. DUMPDIR 指定 .zip 文件路径;
  4. KUBECONFIG 指定 kubeconfig 文件路径;
  5. NAMESPACE 指定 k8s 环境中 ns 命名空间名称;

dump-k8s-yaml.sh 应用举例

  • 举例:导出 nsdotnet-escada 下指定资源的 yaml 文件,并保存到当前路径的 dotnet-escada 目录中;
bash ./dump-k8s-yaml.sh ./dotnet-escada ./kube.conf dotnet-escada

dump-k8s-yaml.sh 输出日志信息

依据上面使用说明执行命令,输出如下日志结构信息:

persistentvolumes pvc-7a0027c9-84f7-40f9-90b2-929d1514d156
----[showResourceList]-----------------------
NAME                   READY   STATUS    RESTARTS   AGE
...
----[printList]-----------------------
...
----[zipExec]-----------------------
export dotnet-escada ymal completed!

以上面的【举例】为依据,执行命令输出完整日志信息如下:

cloud@demo-k8s-node-1:~$ bash ./dump-k8s-yaml.sh ./dotnet-escada ./kube.conf dotnet-escada
persistentvolumes pvc-7a0027c9-84f7-40f9-90b2-929d1514d156
----[showResourceList]-----------------------
NAME                                                    READY   STATUS    RESTARTS   AGE
deploy-demo-mes-keeperfile-host-75f8878ff7-8q98x    1/1     Running   2          27h
deploy-demo-mes-redis-55fc5dd9cc-6vtkh              1/1     Running   2          27h
deploy-demo-nginx-host-ddddfc864-zxkjb              1/1     Running   5          27h
deploy-demo-smartworx-plugs-host-5d9bd5c99c-rgtxh   0/1     Evicted   0          28h
NAME                                                   DATA   AGE
configmap/demo-mes-authentication-service-config   1      30h
configmap/demo-mes-config                          1      30h
configmap/demo-mes-keeper-appseetings              2      30h
configmap/demo-mes-nginx-config                    1      29h
configmap/demo-mes-nginx-service-config            1      29h
configmap/demo-mes-redis-service-config            1      27h
configmap/kube-root-ca.crt                             1      31h

NAME                                                                              TYPE                                  DATA   AGE
secret/ceph-kubernetes-dynamic-user-01847765-90af-11ed-bbdc-06eca119f7b2-secret   Opaque                                1      31h
secret/default-token-k85zv                                                        kubernetes.io/service-account-token   3      31h

NAME                                             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/pvc-demo-escada-data   Bound    pvc-7a0027c9-84f7-40f9-90b2-929d1514d156   10Gi       RWO            cephfs         31h

LAST SEEN   TYPE     REASON   OBJECT                        MESSAGE
3m24s       Normal   Sync     ingress/escada-inkelink-com   Scheduled for sync
3m22s       Normal   Sync     ingress/escada-inkelink-com   Scheduled for sync

NAME                     SECRETS   AGE
serviceaccount/default   1         31h

NAME                                      ENDPOINTS         AGE
endpoints/demo-mes-keeperfile-host    10.44.0.12:80     28h
endpoints/demo-mes-redis              10.44.0.45:6379   27h
endpoints/demo-nginx-host             10.44.0.20:80     27h
endpoints/demo-scada-base-host        <none>            28h
endpoints/demo-smartworx-host         <none>            28h
endpoints/demo-smartworx-plugs-host   <none>            28h

NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/demo-mes-keeperfile-host    ClusterIP      10.108.90.134    <none>        80/TCP         28h
service/demo-mes-redis              ClusterIP      10.99.71.77      <none>        6379/TCP       27h
service/demo-nginx-host             LoadBalancer   10.108.145.181   10.23.4.193   80:31995/TCP   27h
service/demo-scada-base-host        ClusterIP      10.110.121.140   <none>        80/TCP         28h
service/demo-smartworx-host         ClusterIP      10.110.63.82     <none>        80/TCP         28h
service/demo-smartworx-plugs-host   ClusterIP      10.105.115.242   <none>        80/TCP         28h

NAME                                            CLASS   HOSTS                 ADDRESS       PORTS   AGE
ingress.networking.k8s.io/escada-inkelink-com   nginx   escada.inkelink.com   10.23.4.192   80      27h

NAME                                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-demo-mes-keeperfile-host    1/1     1            1           28h
deployment.apps/deploy-demo-mes-redis              1/1     1            1           27h
deployment.apps/deploy-demo-nginx-host             1/1     1            1           27h
deployment.apps/deploy-demo-scada-base-host        0/0     0            0           28h
deployment.apps/deploy-demo-smartworx-host         0/0     0            0           28h
deployment.apps/deploy-demo-smartworx-plugs-host   0/0     0            0           28h

NAME                                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/deploy-demo-mes-keeperfile-host-75f8878ff7    1         1         1       28h
replicaset.apps/deploy-demo-mes-redis-55fc5dd9cc              1         1         1       27h
replicaset.apps/deploy-demo-nginx-host-ddddfc864              1         1         1       27h
replicaset.apps/deploy-demo-scada-base-host-6cb55ccd97        0         0         0       28h
replicaset.apps/deploy-demo-smartworx-host-7df5945c7          0         0         0       28h
replicaset.apps/deploy-demo-smartworx-host-856db4cd49         0         0         0       28h
replicaset.apps/deploy-demo-smartworx-host-9c5ff7859          0         0         0       26h
replicaset.apps/deploy-demo-smartworx-plugs-host-5d9bd5c99c   0         0         0       28h

NAME                                                        READY   STATUS    RESTARTS   AGE
pod/deploy-demo-mes-keeperfile-host-75f8878ff7-8q98x    1/1     Running   2          27h
pod/deploy-demo-mes-redis-55fc5dd9cc-6vtkh              1/1     Running   2          27h
pod/deploy-demo-nginx-host-ddddfc864-zxkjb              1/1     Running   5          27h
pod/deploy-demo-smartworx-plugs-host-5d9bd5c99c-rgtxh   0/1     Evicted   0          28h
----[printList]-----------------------
configmaps demo-mes-authentication-service-config
configmaps demo-mes-config
configmaps demo-mes-keeper-appseetings
configmaps demo-mes-nginx-config
configmaps demo-mes-nginx-service-config
configmaps demo-mes-redis-service-config
configmaps kube-root-ca.crt
secrets ceph-kubernetes-dynamic-user-01847765-90af-11ed-bbdc-06eca119f7b2-secret
secrets default-token-k85zv
persistentvolumeclaims pvc-demo-escada-data
events LAST
Error from server (NotFound): events "LAST" not found
events 3m26s
Error from server (NotFound): events "3m26s" not found
events 3m24s
Error from server (NotFound): events "3m24s" not found
serviceaccounts default
endpoints demo-mes-keeperfile-host
endpoints demo-mes-redis
endpoints demo-nginx-host
endpoints demo-scada-base-host
endpoints demo-smartworx-host
endpoints demo-smartworx-plugs-host
services demo-mes-keeperfile-host
services demo-mes-redis
services demo-nginx-host
services demo-scada-base-host
services demo-smartworx-host
services demo-smartworx-plugs-host
ingress escada-inkelink-com
No resources found in demo-dotnet-escada namespace.
deployments deploy-demo-mes-keeperfile-host
deployments deploy-demo-mes-redis
deployments deploy-demo-nginx-host
deployments deploy-demo-scada-base-host
deployments deploy-demo-smartworx-host
deployments deploy-demo-smartworx-plugs-host
replicasets deploy-demo-mes-keeperfile-host-75f8878ff7
replicasets deploy-demo-mes-redis-55fc5dd9cc
replicasets deploy-demo-nginx-host-ddddfc864
replicasets deploy-demo-scada-base-host-6cb55ccd97
replicasets deploy-demo-smartworx-host-7df5945c7
replicasets deploy-demo-smartworx-host-856db4cd49
replicasets deploy-demo-smartworx-host-9c5ff7859
replicasets deploy-demo-smartworx-plugs-host-5d9bd5c99c
No resources found in demo-dotnet-escada namespace.
No resources found in demo-dotnet-escada namespace.
No resources found in demo-dotnet-escada namespace.
pods deploy-demo-mes-keeperfile-host-75f8878ff7-8q98x
pods deploy-demo-mes-redis-55fc5dd9cc-6vtkh
pods deploy-demo-nginx-host-ddddfc864-zxkjb
pods deploy-demo-smartworx-plugs-host-5d9bd5c99c-rgtxh
----[zipExec]-----------------------
export dotnet-escada ymal completed!

dump-k8s-yaml.sh 执行完成后,在当前环境目录下会生成一个对应的 .zip 压缩文件,上面例子中对应产生的文件是 dotnet-escada.zip ,此时我们可以利用【xshell & lrzsz】工具下载 dotnet-escada.zip 文件,执行命令如下:

sz file dotnet-escada.zip

参考文档

  • kubectl 命令行工具,https://kubernetes.io/zh-cn/docs/reference/kubectl/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java寒假打卡】Java基础-字符流

【Java寒假打卡】Java基础-字符流编码表字符串中的编码和解码问题字节流读取文本文件出现乱码的原因字符流读取中文的过程字符流写出数据字符流输出数据注意事项flush和close方法字符流读取数据案例-保存键盘录入的数据字符缓冲输入流字符缓冲输出流缓冲流的特有方法案例-读取文…

【算法】广度优先遍历 (BFS)

目录1.概述2.代码实现3.应用1.概述 &#xff08;1&#xff09;广度优先遍历 (Breadth First Search)&#xff0c;又称宽度优先遍历&#xff0c;是最简便的图的搜索算法之一。 &#xff08;2&#xff09;已知图 G (V, E) 和一个源顶点 start&#xff0c;宽度优先搜索以一种系…

让我用Python自制软件,看视频畅通无阻

前言 一个账号只能登录一台设备&#xff1f;涨价就涨价&#xff0c;至少还能借借朋友的&#xff0c;谁还没几个朋友&#xff0c;搞限制登录这一出&#xff0c;瞬间不稀罕了 这个年头谁还不会点技术了&#xff0c;直接拿python自制一个可以看视频的软件… 话不多说&#xff0…

终于弄懂了 非极大抑制 NMS

NMS的作用就是有效地剔除目标检测结果中多余的检测框&#xff0c;保留最合适的检测框。 以YOLOv5为例&#xff0c;yolov5模型的输入三个feature map的集合&#xff0c;加上batch的维度&#xff0c;也就是三维张量&#xff0c;即[batch&#xff0c;(p0∗p0p1∗p1p2∗p2)∗3&…

SWC步骤

纲要&#xff1a; SWC属于AUTOSAR的Component文件夹下&#xff0c;而Composition属于Composition文件夹下。 目录 1. Import "Data Type" and "Interface" information 2. Creat Software Component(SWC) 3. Create "Port" for this SWC 4.…

nexus raw 仓库代理(node-sass离线安装node-sass: Command failed)

问题背景 内网环境中使用 node 构建项目&#xff0c;项目中依赖了 node-sass&#xff0c;环境自动下载 node-saas 失败&#xff08;内网&#xff09;。 下面是构建 node-sass 的错误代码&#xff1a; [5/5] Building fresh packages... error /workspace/node_modules/node-…

nuxt概念

文章目录前言nuxt项目结构介绍网页导航文字显示&#xff08;商标&#xff09;package.jsonnuxt.config.js路由固定路由动态路由总结前言 首先了解下B2C模式&#xff0c;分前后台&#xff0c;后台一般为管理系统&#xff0c;不需要展示给过多的用户&#xff0c;而前台需要展示给…

2023年有哪些具备潜力的加密投资标的?

随着2022年一系列的黑天鹅事件&#xff08;Terra、Luna的暴雷、FTX、Three Arrows Capital等知名加密机构的破产&#xff09;&#xff0c;加密货币总市值已经从最高点的2.9万亿美元&#xff08;2021年的11月&#xff09;&#xff0c;下降到8500亿美元&#xff08;与2021年1月的…

NKOJ P7842 疫情防控

分析 这道题的本质就是找可以使得每座城市有且仅有一条道单行路进入该市的图有什么特点; 首先,我们假设图联通,则由于每个城市只有一条单行道可以进入,即一个城市必须有且仅有一条单行道与之配对,所以这个图至少要有nnn条边,即图中必须要有环才可以满足要求! 那如果图不连通…

Java多线程之读写锁ReentrantReadWriteLock类使用

在JDK中提供了一种读写锁ReentrantReadWriteLock类&#xff0c;相比ReentrantLock类&#xff0c;使用前者可以加快运行效率。ReentrantLock类是具有完全互斥排他的效果&#xff0c;即同一时间只有一个线程在执行ReentrantLock.lock()方法后面的任务&#xff0c;这样做虽然保证了…

【UE4 第一人称射击游戏】40-改变武器的可见性

上一篇&#xff1a;【UE4 第一人称射击游戏】39-“M4A1”武器设置本篇效果&#xff1a;步骤&#xff1a;打开“Weapon_M4A1”&#xff0c;删除带有“AK47”的那个骨架网格体打开事件图表&#xff0c;将“SkeletalMesh1”拖入打开“ThirdPersonCharacter”&#xff0c;在事件图表…

Docker:独具魅力的开源容器引擎

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux 或 Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#…

MATLAB-控制系统模型之间的转换

系统的线性时不变&#xff08;LTI&#xff09;模型有传递函数&#xff08;tf&#xff09;模型、零极点增益&#xff08;zpk)模型和状态空间(ss&#xff09;模型,它们之间可以相互转换。模型之间的转换函数可以分为以下两类。第一类是把其他类型的模型转换为函数表示的模型自身&…

PHP多进程(一)

多进程的作用是一个程序启动多个进程。 一个程序启动起来本应该是一个进程&#xff0c;但它可作为父进程启动多个子进程来一起操作 形成并发操作 pcntl是php官方的多进程扩展,只能在linux环境使用 以下所有操作请在Linux环境下操作: 先认识两个函数,下面是官方文档地址: …

铜缆测试——近端和远端串扰(NEXT和FNEXT)

如果您非常熟悉铜缆测试&#xff0c;那么很可能听说过串扰——一对或一个通道上传输的信号对另外一对或一个通道产生不良影响的现象。(杂讯) 串扰会对具体的一对导线或整根电缆形成干扰&#xff0c;导致误码或数据无法传输。例如&#xff0c;您是否曾经在电话中听到有其他人说话…

马蹄集 数组最大公约数

给定一个由N个正整数组成的数组&#xff0c;求所有数组元素的最大公约数。 格式 输入格式&#xff1a;第一行输入数组长度N,第二行输入数组元素&#xff0c;整型 空格分隔。 输出格式&#xff1a;输出整型 #include <bits/stdc.h> using namespace std;int gcd(int a…

(十八)Java的时间与日期(2)

目录 前言: 一、JDK8新增日期类 二、LocalDate&#xff0c;LocalTime,LocalDateTime 三、Instant时间戳 四、DateTimeFormatter类 五、Duration/Period类 六、ChronoUnit类 前言: JDK 8中增加了一套全新的日期时间API&#xff0c;这套API设计合理&#xff0c;是线程安全的。新的…

ctfshow学习记录-web入门(sql注入191-200)

目录web191web192web193web194web195web196web197web198web199web200九某人来更新啦&#xff1a;2023年第一篇wp新鲜出炉&#xff5e; web191 解答&#xff1a;增加了过滤 过滤了ascii&#xff0c;可以用ord方法代替。&#xff08;这里手册中也有告知~&#xff09; web190的pa…

【数据结构与算法】Trie

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…

集合引用类型 下

目录 Map Map.set() Map.get() Map.delete() Map.has() Map.values() Map.entries() Map.clear() 选择Object 还是Map 数据转换 转为数组 转为 JSON 对象转为 Map 数组转为 Map 转为Object WeakMap 基本API 弱键 不可迭代 Set 创建Set实例 Set实例转数组 si…