自动化运维(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二开工程师以及其他同事和领导的点赞。

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

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

相关文章

springboot332基于springboot养老院管理系统pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 养老院管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计…

js:函数

函数 函数&#xff1a;实现抽取封装&#xff0c;执行特定任务的代码块&#xff0c;方便复用 声明 函数命名规范 尽量小驼峰 前缀应该为动词&#xff0c;如getName、hasName 函数的调用 函数体是函数的构成部分 函数传参 参数列表里的参数叫形参&#xff0c;实际上写的数据叫实…

基于Matlab的图像去噪算法仿真

中值滤波的仿真 本节选用中值滤波法对含有高斯噪声和椒盐噪声的图像进行去噪&#xff0c;并用Matlab软件仿真。 &#xff08;1&#xff09;给图像加入均值为0&#xff0c;方差为0.02的高斯噪声&#xff0c;分别选择33模板、55模板和77模板进行去噪 Matlab部分代码&#xff1…

【Linux】-学习笔记06

第二章、时间同步服务器 2.1时间同步服务器的使用 2.1.1系统时区时间的管理 timedatectl set-time "2024-02-13 10:41:55" ##设定系统时间 timedatectl list-timezones ##显示系统的所有时区 timedatectl set-timezone "Asia/Shangh…

UE5_建立自己的资产库

资产库需要用到一个插件&#xff1a; UAsset Browser - 直接在当前项目预览其他UE项目资产&#xff08;.uasset 文件&#xff09; - 直接迁移其他UE项目资产到当前项目 - 不用另外打开资产项目查看资产&#xff0c;迁移资产&#xff08;麻烦&#xff09; 插件官网插件文档插…

详解登录MySQL时出现SSL connection error: unknown error number错误

目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后&#xff0c;使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件&#xff0c;然后按下图所示添加配置 此时再…

深度学习基本单元结构与输入输出维度解析

深度学习基本单元结构与输入输出维度解析 在深度学习领域&#xff0c;模型的设计和结构是理解其性能和应用的关键。本文将介绍深度学习中的基本单元结构&#xff0c;包括卷积神经网络&#xff08;CNN&#xff09;、反卷积&#xff08;转置卷积&#xff09;、循环神经网络&…

乐鑫发布 esp-iot-solution v2.0 版本

今天&#xff0c;乐鑫很高兴地宣布&#xff0c;esp-iot-solution v2.0 版本已经发布&#xff0c;release/v2.0 分支下的正式版本组件将为用户提供为期两年的 Bugfix 维护&#xff08;直到 2027.01.25 ESP-IDF v5.3 EOL&#xff09;。该版本将物联网开发中常用的功能进行了分类整…

面经-综合面/hr面

面经-综合面/hr面 概述1.大学期间遇到的困难&#xff0c;怎么解决的2. 大学期间印象最深/最难忘的是什么3. 大学里面担任了什么职务没&#xff1f;做了什么工作&#xff1f;4. 大学最大的遗憾是什么&#xff1f;5. 对自己的未来规划6. 对自己的评价7. 自己的优缺点8. 对公司的认…

pyspark实现基于协同过滤的电影推荐系统

最近在学一门大数据的课&#xff0c;课程要求很开放&#xff0c;任意做一个大数据相关的项目即可&#xff0c;不知道为什么我就想到推荐算法&#xff0c;一直到着手要做之前还没有新的更好的来代替&#xff0c;那就这个吧。 推荐算法 推荐算法的发展由来已久&#xff0c;但和…

十、Spring Boot集成Spring Security之HTTP请求授权

文章目录 往期回顾&#xff1a;Spring Boot集成Spring Security专栏及各章节快捷入口前言一、HTTP请求授权工作原理二、HTTP请求授权配置1、添加用户权限2、配置ExceptionTranslationFilter自定义异常处理器3、HTTP请求授权配置 三、测试接口1、测试类2、测试 四、总结 往期回顾…

Unity3d C# 实现一个基于UGUI的自适应尺寸图片查看器(含源码)

前言 Unity3d实现的数字沙盘系统中&#xff0c;总有一些图片或者图片列表需要点击后弹窗显示大图&#xff0c;这个弹窗在不同尺寸分辨率的图片查看处理起来比较麻烦&#xff0c;所以&#xff0c;需要图片能够根据容器的大小自适应地进行缩放&#xff0c;兼容不太尺寸下的横竖图…

DVWA 在 Windows 环境下的部署指南

目录预览 一、靶场介绍二、前置准备1. 环境准备2.靶场下载 三、安装步骤1.配置Phpstudy2.配置数据库3.配置DVWA4.登入DVWA靶场 四、参考链接 一、靶场介绍 DVWA 一共包含了十个攻击模块&#xff0c;分别是&#xff1a; Brute Force&#xff08;暴力&#xff08;破解&#xff…

微软企业邮箱:安全可靠的企业级邮件服务!

微软企业邮箱的设置步骤&#xff1f;如何注册使用烽火域名邮箱&#xff1f; 微软企业邮箱作为一款专为企业设计的邮件服务&#xff0c;不仅提供了高效便捷的通信工具&#xff0c;更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…

使用UE5.5的Animator Kit变形器

UE5.5版本更新了AnimatorKit内置插件&#xff0c;其中包含了一些内置变形器&#xff0c;可以辅助我们的动画制作。 操作步骤 首先打开UE5.5&#xff0c;新建第三人称模板场景以便测试&#xff0c;并开启AnimatorKit组件。 新建Sequence&#xff0c;放入测试角色 点击角色右…

应用案例丨坤驰科技双通道触发采集实时FFT数据处理系统

双通道触发采集实时FFT数据处理系统 应用案例 双通道采集&#xff0c;每路通道需要2GSPS的采样率&#xff0c;每2毫秒采集一次&#xff0c;每次采集数据量为65536*2 Sample。采集的信号频率满足奈奎斯特采样定律。采集数据后&#xff0c;每路通道的数据均做运算以及FFT实时处理…

OGRE 3D----3. OGRE绘制自定义模型

在使用OGRE进行开发时,绘制自定义模型是一个常见的需求。本文将介绍如何使用OGRE的ManualObject类来创建和绘制自定义模型。通过ManualObject,开发者可以直接定义顶点、法线、纹理坐标等,从而灵活地构建各种复杂的几何体。 Ogre::ManualObject 是 Ogre3D 引擎中的一个类,用…

如何用Excel做数据可视化自动化报表?

作为一个经常需要做数据报表的人&#xff0c;我最常用的工具是Excel&#xff0c;对于我来说用Excel处理繁琐冗杂的数据并不难&#xff0c;但是我发现身边很多人用Excel做的数据报表非常的耗时&#xff0c;而且最后的成品也是难以直视&#xff0c;逻辑和配色等都非常的“灾难”。…

基于FPGA的SD NAND读写测试(图文并茂+源代码+详细注释)

本实验所使用的源代码已同步至个人主页的资源处&#xff0c;可供读者自行学习...... 什么是SD NAND&#xff1f; 1.SD NAND 卡介绍 SD NAND 卡是一种基于 NAND 闪存技术的存储设备&#xff0c;其外观和接口类似于标准的 SD 卡。它将 NAND 闪存芯片和必要的控制电路集成在一个小…

机器学习6-梯度下降法

梯度下降法 目的 梯度下降法(Gradient Descent)是一个算法&#xff0c;但不是像多元线性回归那样是一个具体做回归任务的算法&#xff0c;而是一个非常通用的优化算法来帮助一些机器学习算法求解出最优解的&#xff0c;所谓的通用就是很多机器学习算法都是用它&#xff0c;甚…