自动化运维(k8s)之微服务信息自动抓取:namespaceName、deploymentName等全解析
前言:公司云原生k8s二开工程师发了一串通用性命令用来查询以下数值,我想着能不能将这命令写成一个自动化脚本。
起初设计的 版本一:开头加一条环境变量,执行脚本后,提示输入:需要查询的命名空间,输出信息追加到以当前年月日时来命名自动生成的txt文件;
版本二:自动生成中文排头标题,并生成csv文件,这样就不用手动将txt转化成excl表了;
版本三:发现生成csv文件,其中 副本数 和 容器镜像信息区分不开,想着用在文本格式处理更有优势的python来写,最终成功了。
需要注意的是我们这边k8s容器平台是二开版,然后由于我目前试验的命名空间业务的特殊性,标题里通用的 就绪探针 和 存活探针,采集的参数为:资源限制 CPU 和 资源限制 Memory的,儿你使用时,具体的参数需要根据你的当前deployments.apps配置参数来判定。
查询数值:
namespaceName:部署所在的命名空间
deploymentName:部署的名称
replicas:部署的副本数量
image:容器的镜像
resourcesRequest:容器请求的资源
resourcesLimits:容器资源的限制
readinessProbe:就绪探针的配置
livenessProbe:存活探针的配置
skyworkingNamespace:环境变量 SW_AGENT_NAMESPACE 的值
lopLogsApplog:环境变量 lop_logs_applog 的值
通用命令:
kubectl get deployments.apps -n 需要查询的命名空间 -o jsonpath='{range .items[*]} {"\n\n"} namespaceName={.metadata.namespace}{"\t"} deploymentName={.metadata.name} {"\t"} replicas={.spec.replicas} {range .spec.template.spec.containers[*]} image={.image} {"\t"} resourcesRequest={.resources.requests} {"\t"} resourcesLimits={.resources.limits} {"\t"} readinessProbe={.readinessProbe} {"\t"} livenessProbe={.livenessProbe} {"\t"}{end} skyworkingNamespace={.spec.template.spec.containers[0].env[?(@.name=="SW_AGENT_NAMESPACE")].*} {"\t"} lopLogsApplog={.spec.template.spec.containers[0].env[?(@.name=="lop_logs_applog")].*} {end} {"\n"}'
版本一:shell脚本
#!/bin/bash# 设置环境变量
export ENV_VARIABLE="SomeValue"read -p "请输入需要查询的命名空间: " namespace# 获取日期和时间并格式化作为文件名
current_date=$(date +%Y%m%d%H)
filename="${current_date}.txt"# 执行 kubectl 命令并将结果追加到文件中
kubectl get deployments.apps -n "$namespace" -o jsonpath='{range.items[*]} {"\n\n"} namespaceName={.metadata.namespace}{"\t"} deploymentName={.metadata.name} {"\t"} replicas={.spec.replicas} {range.spec.template.spec.containers[*]} image={.image} {"\t"} resourcesRequest={.resources.requests} {"\t"} resourcesLimits={.resources.limits} {"\t"} readinessProbe={.readinessProbe} {"\t"} livenessProbe={.livenessProbe} {"\t"}{end} skyworkingNamespace={.spec.template.spec.containers[0].env[?(@.name=="SW_AGENT_NAMESPACE")].*} {"\t"} lopLogsApplog={.spec.template.spec.containers[0].env[?(@.name=="lop_logs_applog")].*} {end} {"\n"}' >> "$filename"echo "输出已追加到 $filename 文件中。"
执行结果:

版本二:shell脚本:
#!/bin/bashexport ENV_VARIABLE="SomeValue"read -p "请输入需要查询的命名空间: " namespacecurrent_date=$(date +%Y%m%d%H)
filename="${current_date}.csv"# 使用以下命令生成 CSV 格式的输出并追加到文件中
kubectl get deployments.apps -n "$namespace" -o jsonpath='{range.items[*]}{"\n"}'$'\t'"{.metadata.namespace}"$'\t'"{.metadata.name}"$'\t'"{.spec.replicas}"$'\t'"{range.spec.template.spec.containers[*]}{.image}{end}"$'\t'"{range.spec.template.spec.containers[*]}{.resources.requests}{end}"$'\t'"{range.spec.template.spec.containers[*]}{.resources.limits}{end}"$'\t'"{range.spec.template.spec.containers[*]}{.readinessProbe}{end}"$'\t'"{range.spec.template.spec.containers[*]}{.livenessProbe}{end}"$'\t'"{range.spec.template.spec.containers[*]}{.spec.template.spec.containers[0].env[?(@.name==\"SW_AGENT_NAMESPACE\")].value}{end}"$'\t'"{range.spec.template.spec.containers[*]}{.spec.template.spec.containers[0].env[?(@.name==\"lop_logs_applog\")].value}{end}" >> "$filename"echo "输出已追加到 $filename 文件中。"
执行结果:
版本三:
改了很多版,这里就直接展示成功吧
通用版-py脚本:
import subprocess
import datetime# 获取用户输入的命名空间
namespace = input("请输入当前需要查询的命名空间: ")# 获取当前时间并生成文件名
timestamp = datetime.datetime.now().strftime("%Y%m%d%H")
output_file = f"{timestamp}.csv"# 设置标题行
with open(output_file, 'w') as f:f.write("命名空间,名称,副本数,容器镜像,资源请求,资源限制,就绪探针,存活探针,环境变量\n")# 执行 kubectl 命令并处理结果
command = f"kubectl get deployments.apps -n {namespace} -o json".split()
result = subprocess.check_output(command).decode()import json
data = json.loads(result)def format_probe(probe):if not probe:return "N/A"probe_type = ""details = ""if "httpGet" in probe:probe_type = "HTTP GET"http_get = probe["httpGet"]details = f"{probe_type}: Path: {http_get.get('path', 'N/A')}, Port: {http_get.get('port', 'N/A')}"elif "tcpSocket" in probe:probe_type = "TCP Socket"tcp_socket = probe["tcpSocket"]details = f"{probe_type}: Port: {tcp_socket.get('port', 'N/A')}"elif "exec" in probe:probe_type = "Exec"exec_command = probe["exec"]details = f"{probe_type}: Command: {' '.join(exec_command)}"elif "cpu" in probe and "memory" in probe:details = f"Resource: CPU {probe['cpu']}, Memory {probe['memory']}"else:return "N/A"return detailsdef format_resources(resources):if not resources:return "N/A"cpu = resources.get('cpu', 'N/A')memory = resources.get('memory', 'N/A')return f"CPU: {cpu}, Memory: {memory}"with open(output_file, 'a') as f:for item in data.get('items', []):namespace_name = item['metadata']['namespace']deployment_name = item['metadata']['name']replicas = item['spec']['replicas']images = [container['image'] for container in item['spec']['template']['spec']['containers']]image = images[0] if images else "N/A"request = format_resources(item['spec']['template']['spec']['containers'][0]['resources']['requests'])limit = format_resources(item['spec']['template']['spec']['containers'][0]['resources']['limits'])readiness_probe = "N/A"if item['spec']['template']['spec']['containers'] and 0 < len(item['spec']['template']['spec']['containers']) and 'readinessProbe' in item['spec']['template']['spec']['containers'][0]:readiness_probe = format_probe(item['spec']['template']['spec']['containers'][0]['readinessProbe'])liveness_probe = "N/A"if item['spec']['template']['spec']['containers'] and 0 < len(item['spec']['template']['spec']['containers']) and 'livenessProbe' in item['spec']['template']['spec']['containers'][0]:liveness_probe = format_probe(item['spec']['template']['spec']['containers'][0]['livenessProbe'])env_var = "N/A"if item['spec']['template']['spec']['containers'] and 'env' in item['spec']['template']['spec']['containers'][0]:env_var = next((env['value'] for env in item['spec']['template']['spec']['containers'][0]['env'] if env['name'] == "SW_AGENT_NAMESPACE"), "N/A")f.write(f"{namespace_name},{deployment_name},{replicas},{image},{request},{limit},{readiness_probe},{liveness_probe},{env_var}\n")print(f"查询结果已写入文件:{output_file}")
定制版-py脚本:
import subprocess
import datetime# 获取用户输入的命名空间
namespace = input("请输入当前需要查询的命名空间: ")# 获取当前时间并生成文件名
timestamp = datetime.datetime.now().strftime("%Y%m%d%H")
output_file = f"{timestamp}.csv"# 设置标题行
with open(output_file, 'w') as f:f.write("命名空间,名称,副本数,容器镜像,资源预留 CPU,资源预留 Memory,资源限制 CPU,资源限制 Memory,环境变量\n")# 执行 kubectl 命令并处理结果
command = f"kubectl get deployments.apps -n {namespace} -o json".split()
result = subprocess.check_output(command).decode()import json
data = json.loads(result)def format_probe(probe):if not probe:return "N/A"probe_type = ""details = ""if "httpGet" in probe:probe_type = "HTTP GET"http_get = probe["httpGet"]details = f"{probe_type}: Path: {http_get.get('path', 'N/A')}, Port: {http_get.get('port', 'N/A')}"elif "tcpSocket" in probe:probe_type = "TCP Socket"tcp_socket = probe["tcpSocket"]details = f"{probe_type}: Port: {tcp_socket.get('port', 'N/A')}"elif "exec" in probe:probe_type = "Exec"exec_command = probe["exec"]details = f"{probe_type}: Command: {' '.join(exec_command)}"elif "cpu" in probe and "memory" in probe:details = f"Resource: CPU {probe['cpu']}, Memory {probe['memory']}"else:return "N/A"return detailsdef format_resources(resources):if not resources:return "N/A"cpu = resources.get('cpu', 'N/A')memory = resources.get('memory', 'N/A')return f"CPU: {cpu}, Memory: {memory}"with open(output_file, 'a') as f:for item in data.get('items', []):namespace_name = item['metadata']['namespace']deployment_name = item['metadata']['name']replicas = item['spec']['replicas']images = [container['image'] for container in item['spec']['template']['spec']['containers']]image = images[0] if images else "N/A"request = format_resources(item['spec']['template']['spec']['containers'][0]['resources']['requests'])limit = format_resources(item['spec']['template']['spec']['containers'][0]['resources']['limits'])readiness_probe = "N/A"if item['spec']['template']['spec']['containers'] and 0 < len(item['spec']['template']['spec']['containers']) and 'readinessProbe' in item['spec']['template']['spec']['containers'][0]:readiness_probe = format_probe(item['spec']['template']['spec']['containers'][0]['readinessProbe'])liveness_probe = "N/A"if item['spec']['template']['spec']['containers'] and 0 < len(item['spec']['template']['spec']['containers']) and 'livenessProbe' in item['spec']['template']['spec']['containers'][0]:liveness_probe = format_probe(item['spec']['template']['spec']['containers'][0]['livenessProbe'])env_var = "N/A"if item['spec']['template']['spec']['containers'] and 'env' in item['spec']['template']['spec']['containers'][0]:env_var = next((env['value'] for env in item['spec']['template']['spec']['containers'][0]['env'] if env['name'] == "SW_AGENT_NAMESPACE"), "N/A")# 按照新的标题格式写入数据parts_request = request.split(", ") if request!= "N/A" else ["N/A", "N/A"]parts_limit = limit.split(", ") if limit!= "N/A" else ["N/A", "N/A"]f.write(f"{namespace_name},{deployment_name},{replicas},{image},{parts_request[0].replace('CPU: ', '')},{parts_request[1].replace('Memory: ', '')},{parts_limit[0].replace('CPU: ', '')},{parts_limit[1].replace('Memory: ', '')},{env_var}\n")print(f"查询结果已写入文件:{output_file}")
执行:

执行结果:

自动化脚本和输出结果递交上去后,受到公司 高级系统架构师(兼技术专家组云原生高级架构师)、云原生k8s二开工程师以及其他同事和领导的点赞。

相关文章:
自动化运维(k8s)之微服务信息自动抓取:namespaceName、deploymentName等全解析
前言:公司云原生k8s二开工程师发了一串通用性命令用来查询以下数值,我想着能不能将这命令写成一个自动化脚本。 起初设计的 版本一:开头加一条环境变量,执行脚本后,提示输入:需要查询的命名空间,…...
07 初始 Oracle 优化器
查询优化器,简称优化器,是数据库最核心的组件之一。我们在这个系列的第一篇文章中已经给大家介绍了,优化器会参与到SQL语句的解析过程中,用来生成SQL语句的执行计划,直接决定SQL语句执行性能的优劣。 什么是执行计划 …...
Java对象与XML互相转换(xstream)
依赖 <dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.18</version></dependency> 实体类 package com.itheima.util;import lombok.AllArgsConstructor; import lom…...
一键生成唯美动漫图:ComfyUI-tPonynai详细搭建教程
tPonynai 是在 C 站上开源的动漫风格扩散模型,与其他基础大模型一样,只需要输入适当的正面和负面提示词就能够实现动漫图片的生成。截至目前已经有 12.9k 的下载量,生成效果也非常不错。本文将介绍ComfyUI-tPonynai在算家云搭建以及本地部署的…...
C++设计模式(工厂模式)
一、介绍 1.动机 在软件系统中,经常面临着创建对象的工作,这些对象有可能是一系列相互依赖的对象;由于需求的变化,需要创建的对象的具体类型经常变化,同时也可能会有更多系列的对象需要被创建。 如何应对这种变化&a…...
多阶段报童问题动态规划求解,Python 实现
使用 python 编写了多阶段报童模型的动态规划算法。 使用了 python 的装饰器 dataclass ,方便定义类尝试使用并行计算,没有成功,极易出错。动态规划中使用并行计算,还是挺有挑战的;而且并行计算不一定总是比非并行运算…...
【C++进阶篇】像传承家族宝藏一样理解C++继承
文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗࿱…...
Java基础面试题09:Java异常处理完成以后,Exception对象会发生什么变化?
一、Java异常(Exception)基本概念 什么是异常? 简单来说,异常就是程序运行时发生了意外的“错误”或者“不正常现象”,导致程序中断。异常处理的目标是让程序在出现问题时能稳住,不会直接崩溃。 1.1 异常…...
mysql sql语句 between and 是否边界值
在 MySQL 中,使用 BETWEEN 运算符时,边界值是包括在内的。这意味着 BETWEEN A AND B 查询会返回 A 和 B 之间的所有值,包括 A 和 B 自身。 示例 假设有一个表 employees,其中有一个 salary 列,您可以使用以下查询&am…...
Java接收LocalDateTime、LocalDatee参数
文章目录 引言I java服务端的实现1.1 基于注解规范日期格式1.2 json序列化和反序列化全局配置自动处理日期格式化II 知识扩展: 枚举的转换和序列化III 签名注意事项引言 应用场景举例:根据时间段进行分页查询数据 前后端交互日期字符串统一是yyyy-MM-dd HH:mm:ss 或者yyyy-M…...
方差分析、相关分析、回归分析
第一章:方差分析 1.1 方差分析概述 作用: 找出关键影响因素,并进行对比分析,选择最佳组合方案。影响因素: 控制因素(人为可控)和随机因素(人为难控)。控制变量的不同水平: 控制变量的不同取值…...
SQLModel入门
SQLModel 系统性指南 目录 简介 什么是 SQLModel?为什么使用 SQLModel? 安装快速入门 定义模型创建数据库和表 基本 CRUD 操作 创建(Create)读取(Read)更新(Update)删除࿰…...
单片机蓝牙手机 APP
目录 一、引言 二、单片机连接蓝牙手机 APP 的方法 1. 所需工具 2. 具体步骤 三、单片机蓝牙手机 APP 的应用案例 1. STM32 蓝牙遥控小车 2. 手机 APP 控制 stm32 单片机待机与唤醒 3. 智能家居系统 4. 智能记忆汽车按摩座椅 四、单片机蓝牙手机 APP 的功能 1. 多种控…...
PostgreSQL在Linux环境下的常用命令总结
标题 登录PgSQL库表基本操作命令新建库表修改库表修改数据库名称:修改表名称修改表字段信息 删除库表pgsql删除正在使用的数据库 须知: 以下所有命令我都在Linux环境中执行验证过,大家放心食用,其中的实际名称换成自己的实际名称即…...
Unity shaderlab 实现LineSDF
实现效果: 实现代码: Shader "Custom/LineSDF" {Properties{}SubShader{Tags { "RenderType""Opaque" }Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{floa…...
Ubuntu中的apt update 和 apt upgrade
apt update 和 apt upgrade 是 Debian 及其衍生发行版(如 Ubuntu)中常用的两个 APT 包管理命令,它们各自执行不同的任务: apt update: 这个命令用于更新本地软件包列表。当你运行 apt update 时,APT 会从配置的源&…...
Android 中 Swipe、Scroll 和 Fling 的区别
Android 中 Swipe、Scroll 和 Fling 的区别 Swipe(滑动)Scroll(滚动)Fling(甩动)三者之间的区别代码示例 (Fling)总结 在 Android 应用中,Swipe、Scroll 和 Fling 都是用户在触摸屏幕上进行的滑…...
linux基础2
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
如何通过智能生成PPT,让演示文稿更高效、更精彩?
在快节奏的工作和生活中,我们总是追求更高效、更精准的解决方案。而在准备演示文稿时,PPT的制作往往成为许多人头疼的问题。如何让这项工作变得轻松且富有创意?答案或许就在于“AI生成PPT”这一智能工具的广泛应用。我们就来聊聊如何通过这些…...
执法记录仪数据自动备份光盘刻录归档系统
派美雅按需研发的执法记录仪数据自动备份光盘刻录归档系统,为用户提供数据自动上传到刻录服务端、数据上传后自动归类,全自动对刻录端视频文件大小进行实时监测,满盘触发刻录,无需人工干预。告别传统刻录存在的痛点,实…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
