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

自动化运维(k8s):一键获取指定命名空间镜像包脚本

前言:脚本写成并非一蹴而就,需要不断的调式和修改,这里也是改到了7版本才在 生产环境 中验证成功。

该命令 和 脚本适用于以下场景:在某些项目中,由于特定的安全或政策要求,不允许连接到你的镜像仓库。然而,项目团队仍需获取特定命名空间下的部分 或者 所有 Docker 镜像。此命令和脚本能够协助您在本地环境拉取并保存所需命名空间中的镜像,以便安全地提供给项目团队,满足他们的部署和测试需求,同时确保遵守相关的安全规定和访问限制。

一、命令获取指定pod镜像
命令-查询镜像版本号:
kubectl get pods -n <namespace> -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{"\n"}{end}{end}' | grep -E "(<pod-name1>|<pod-name2>|<pod-name3>|<pod-name......>)"
执行结果:

命令-save:
docker save -o namespace_images.tar <pod-name1结果......727> <pod-name2结果......21164728> <pod-name3结果......build_20241021181731> <pod-name......结果>
执行结果:

最后会生成一个tar包

二、自动化脚本获取指定命名空间下全量pod镜像
脚本内容:

#!/bin/bash# 提示用户输入命名空间
echo -e "请输入命名空间:"
read -e NAMESPACE# 获取当前脚本的绝对路径
SCRIPT_DIR=$(cd $(dirname $0) && pwd)# 定义输出文件名,格式为 <命名空间>_images_<日期>.tar
OUTPUT_FILE="${NAMESPACE}_images_$(date +%Y%m%d).tar"# 获取该命名空间下的所有 Pod 的名称和镜像
POD_NAMES=$(kubectl get pods -n $NAMESPACE -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}')
IMAGES=$(kubectl get pods -n $NAMESPACE -o jsonpath='{range .items[*]}{range .spec.containers[*]}{.image}{"\n"}{end}{end}' | sort | uniq)# 拼接所有镜像名称成一个字符串
IMAGE_STRING=""
for IMAGE in $IMAGES; doIMAGE_STRING+="$IMAGE "
done# 拉取所有镜像
echo "正在拉取所有镜像..."
for IMAGE in $IMAGES; dodocker pull $IMAGE
done# 保存所有镜像到一个文件
echo "正在将所有镜像保存到单个 tar 文件:$OUTPUT_FILE"
docker save $IMAGE_STRING -o $SCRIPT_DIR/$OUTPUT_FILEecho "所有镜像已处理并保存到 $SCRIPT_DIR/$OUTPUT_FILE"

脚本执行后,等待执行结束会生成一个以 命名空间 和 当前日期 的tar包


以下是脚本的详细解析:

  1. 获取指定命名空间下所有 Pod 的镜像列表,并去重

    IMAGES=$(kubectl get pods -n $NAMESPACE -o jsonpath='{range .items[*]}{range .spec.containers[*]}{.image}{"\n"}{end}{end}' | sort | uniq)
    

    这行代码使用 kubectl 命令获取指定命名空间下所有 Pod 的镜像列表。jsonpath 参数用于提取镜像名称,然后通过管道传递给 sortuniq 命令,以确保列表中的镜像名称是唯一的(去重)。

  2. 将所有镜像名称拼接成一个字符串

    IMAGE_STRING=""
    for IMAGE in $IMAGES; doIMAGE_STRING+="$IMAGE "
    done
    

    这个循环遍历去重后的镜像列表 IMAGES,并将每个镜像名称添加到 IMAGE_STRING 变量中,镜像名称之间用空格分隔。

  3. 定义输出文件名,格式为 KaTeX parse error: Expected group after '_' at position 19: …MESPACE}_images_̲(date +%Y%m%d).tar

    OUTPUT_FILE="${NAMESPACE}_images_$(date +%Y%m%d).tar"
    

    这行代码定义了输出文件的名称,格式为 ${NAMESPACE}_images_<日期>.tar,其中 <日期>date +%Y%m%d 命令生成,表示当前日期的年月日。

  4. 拉取所有镜像

    for IMAGE in $IMAGES; dodocker pull $IMAGE
    done
    

    这个循环遍历去重后的镜像列表 IMAGES,并对每个镜像执行 docker pull 命令,以确保本地有这些镜像的最新版本。

  5. 使用 docker save 命令将所有镜像保存到一个 tar 文件中

    docker save $IMAGE_STRING -o $SCRIPT_DIR/$OUTPUT_FILE
    

    这行代码使用 docker save 命令将所有镜像(由 IMAGE_STRING 变量指定)保存到一个 tar 文件中。-o 参数指定输出文件的路径和名称,该路径是脚本所在目录下的 $OUTPUT_FILE

  6. 输出保存完成的消息

    echo "All images have been processed and saved to $SCRIPT_DIR/$OUTPUT_FILE"
    

    这行代码输出一条消息,通知用户所有镜像已经被处理并保存到了指定的文件路径。

http://www.lryc.cn/news/486782.html

相关文章:

  • HarmonyOS ArkUI(基于ArkTS) 开发布局 (上)
  • 第九部分 :1.STM32之通信接口《精讲》(USART,I2C,SPI,CAN,USB)
  • 5. langgraph中的react agent使用 (从零构建一个react agent)
  • uniapp vue3的下拉刷新和上拉加载
  • STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输
  • Vue 3 中的原生事件监听与组件事件处理详解
  • Flink Source 详解
  • 2024年了,TCP分析工具有哪些?
  • SRP 实现 Cook-Torrance BRDF
  • MySQL慢日志
  • Flutter网络通信-封装Dio
  • matlab 读取csv
  • 网络层9——虚拟专用网VPN和网络地址转换NAT
  • 开源科学工程技术软件介绍 – EDA工具KLayout
  • 【网络安全】Cookie SameSite属性
  • Linux 命令 | 每日一学,文本处理三剑客之awk命令实践
  • RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)
  • 【web前端笔记】vue3 + vite的前端项目中,使用import.meta.glob()方法实现全局注册组件的通用代码
  • 保险行业建立知识管理系统:提高效率和安全性的策略
  • 小程序如何完成订阅
  • JS学习日记(jQuery库)
  • Uni-APP+Vue3+鸿蒙 开发菜鸟流程
  • Linux的基本用法
  • 如何找出爬取网站的来源IP呢?
  • Java爬虫(Jsoup)详解
  • 力扣周赛:第424场周赛
  • 预处理(1)(手绘)
  • 利用OpenAI进行测试需求分析——从电商网站需求到测试用例的生成
  • 深入探索:Scrapy深度爬取策略与实践
  • 《生成式 AI》课程 第3講:訓練不了人工智慧嗎?你可以訓練你自己