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

自动化运维(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等全解析

前言&#xff1a;公司云原生k8s二开工程师发了一串通用性命令用来查询以下数值&#xff0c;我想着能不能将这命令写成一个自动化脚本。 起初设计的 版本一&#xff1a;开头加一条环境变量&#xff0c;执行脚本后&#xff0c;提示输入&#xff1a;需要查询的命名空间&#xff0c…...

07 初始 Oracle 优化器

查询优化器&#xff0c;简称优化器&#xff0c;是数据库最核心的组件之一。我们在这个系列的第一篇文章中已经给大家介绍了&#xff0c;优化器会参与到SQL语句的解析过程中&#xff0c;用来生成SQL语句的执行计划&#xff0c;直接决定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 站上开源的动漫风格扩散模型&#xff0c;与其他基础大模型一样&#xff0c;只需要输入适当的正面和负面提示词就能够实现动漫图片的生成。截至目前已经有 12.9k 的下载量&#xff0c;生成效果也非常不错。本文将介绍ComfyUI-tPonynai在算家云搭建以及本地部署的…...

C++设计模式(工厂模式)

一、介绍 1.动机 在软件系统中&#xff0c;经常面临着创建对象的工作&#xff0c;这些对象有可能是一系列相互依赖的对象&#xff1b;由于需求的变化&#xff0c;需要创建的对象的具体类型经常变化&#xff0c;同时也可能会有更多系列的对象需要被创建。 如何应对这种变化&a…...

多阶段报童问题动态规划求解,Python 实现

使用 python 编写了多阶段报童模型的动态规划算法。 使用了 python 的装饰器 dataclass &#xff0c;方便定义类尝试使用并行计算&#xff0c;没有成功&#xff0c;极易出错。动态规划中使用并行计算&#xff0c;还是挺有挑战的&#xff1b;而且并行计算不一定总是比非并行运算…...

【C++进阶篇】像传承家族宝藏一样理解C++继承

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…...

Java基础面试题09:Java异常处理完成以后,Exception对象会发生什么变化?

一、Java异常&#xff08;Exception&#xff09;基本概念 什么是异常&#xff1f; 简单来说&#xff0c;异常就是程序运行时发生了意外的“错误”或者“不正常现象”&#xff0c;导致程序中断。异常处理的目标是让程序在出现问题时能稳住&#xff0c;不会直接崩溃。 1.1 异常…...

mysql sql语句 between and 是否边界值

在 MySQL 中&#xff0c;使用 BETWEEN 运算符时&#xff0c;边界值是包括在内的。这意味着 BETWEEN A AND B 查询会返回 A 和 B 之间的所有值&#xff0c;包括 A 和 B 自身。 示例 假设有一个表 employees&#xff0c;其中有一个 salary 列&#xff0c;您可以使用以下查询&am…...

Java接收LocalDateTime、LocalDatee参数

文章目录 引言I java服务端的实现1.1 基于注解规范日期格式1.2 json序列化和反序列化全局配置自动处理日期格式化II 知识扩展: 枚举的转换和序列化III 签名注意事项引言 应用场景举例:根据时间段进行分页查询数据 前后端交互日期字符串统一是yyyy-MM-dd HH:mm:ss 或者yyyy-M…...

方差分析、相关分析、回归分析

第一章&#xff1a;方差分析 1.1 方差分析概述 作用: 找出关键影响因素&#xff0c;并进行对比分析&#xff0c;选择最佳组合方案。影响因素: 控制因素&#xff08;人为可控&#xff09;和随机因素&#xff08;人为难控&#xff09;。控制变量的不同水平: 控制变量的不同取值…...

SQLModel入门

SQLModel 系统性指南 目录 简介 什么是 SQLModel&#xff1f;为什么使用 SQLModel&#xff1f; 安装快速入门 定义模型创建数据库和表 基本 CRUD 操作 创建&#xff08;Create&#xff09;读取&#xff08;Read&#xff09;更新&#xff08;Update&#xff09;删除&#xff0…...

单片机蓝牙手机 APP

目录 一、引言 二、单片机连接蓝牙手机 APP 的方法 1. 所需工具 2. 具体步骤 三、单片机蓝牙手机 APP 的应用案例 1. STM32 蓝牙遥控小车 2. 手机 APP 控制 stm32 单片机待机与唤醒 3. 智能家居系统 4. 智能记忆汽车按摩座椅 四、单片机蓝牙手机 APP 的功能 1. 多种控…...

PostgreSQL在Linux环境下的常用命令总结

标题 登录PgSQL库表基本操作命令新建库表修改库表修改数据库名称&#xff1a;修改表名称修改表字段信息 删除库表pgsql删除正在使用的数据库 须知&#xff1a; 以下所有命令我都在Linux环境中执行验证过&#xff0c;大家放心食用&#xff0c;其中的实际名称换成自己的实际名称即…...

Unity shaderlab 实现LineSDF

实现效果&#xff1a; 实现代码&#xff1a; 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 及其衍生发行版&#xff08;如 Ubuntu&#xff09;中常用的两个 APT 包管理命令&#xff0c;它们各自执行不同的任务&#xff1a; apt update: 这个命令用于更新本地软件包列表。当你运行 apt update 时&#xff0c;APT 会从配置的源&…...

Android 中 Swipe、Scroll 和 Fling 的区别

Android 中 Swipe、Scroll 和 Fling 的区别 Swipe&#xff08;滑动&#xff09;Scroll&#xff08;滚动&#xff09;Fling&#xff08;甩动&#xff09;三者之间的区别代码示例 (Fling)总结 在 Android 应用中&#xff0c;Swipe、Scroll 和 Fling 都是用户在触摸屏幕上进行的滑…...

linux基础2

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…...

如何通过智能生成PPT,让演示文稿更高效、更精彩?

在快节奏的工作和生活中&#xff0c;我们总是追求更高效、更精准的解决方案。而在准备演示文稿时&#xff0c;PPT的制作往往成为许多人头疼的问题。如何让这项工作变得轻松且富有创意&#xff1f;答案或许就在于“AI生成PPT”这一智能工具的广泛应用。我们就来聊聊如何通过这些…...

执法记录仪数据自动备份光盘刻录归档系统

派美雅按需研发的执法记录仪数据自动备份光盘刻录归档系统&#xff0c;为用户提供数据自动上传到刻录服务端、数据上传后自动归类&#xff0c;全自动对刻录端视频文件大小进行实时监测&#xff0c;满盘触发刻录&#xff0c;无需人工干预。告别传统刻录存在的痛点&#xff0c;实…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...