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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 在基于 `k8s` 平台的容器化部署环境中,有时候需要快速的实现部署文件的迁移备份,当 `k8s` 平台部署一个 `app` 时,都会相应的产生一堆 `yaml` 文件,如果 `yaml` 文件数量较少,我们可以人工手动的方式进行拷贝,但是当 `yaml` 文件数量多,并且该 `k8s` 平台部署了多个 `app` 时,如果在采用...

需求说明

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

image.png

功能实现

实现思路,这里主要是应用了 【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

参考文档

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
29天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
53 2
6种方法打造出色的Shell脚本
|
15天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
43 1
|
20天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
40 2
|
2月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
86 1
|
2月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
49 6
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
71 12
|
2月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
66 2
|
3月前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
3月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
597 2