kubectl与 jq的另外一些用法

背景:

在日常运维工作中,我们需要管理和操作大量的配置文件,这在使用 Kubernetes 集群管理应用时尤为常见。Kubernetes 提供了一个名为 ConfigMap 的资源对象,它用于存储应用的配置信息。有时,我们需要查找哪些 ConfigMap 包含特定的配置值,例如一个特定的 IP 地址或者字符串。在这篇技术博客中,我将演示如何使用 kubectljq 工具来高效地搜索含有特定值的 ConfigMaps。
前面已经完成了:kubectl获取ConfigMap导出YAML时如何忽略某些字段 ,kubectl获取命名空间下所有configmap集合的方法,在Kubernetes中优雅地导出和清理Ingress资源。现在继续去扩展一下jq的用户

使用 kubectl 和 jq 搜索 ConfigMaps

kubectl 是 Kubernetes 的命令行工具,使用者可以通过它与 Kubernetes 集群进行交互。jq 是一个轻量级且灵活的命令行 JSON 处理器。结合这两个工具可以让我们更加方便地处理 JSON 格式的输出。

下面是我的一个应用场景:我有命令空间下confgimap中引用了**10.0.4.65,**我想要知道我在那个命名空间,那一个cm中使用了该变量内容,应该如何操作呢?

kubectl get cm --all-namespaces -o json | jq -r '.items[] | select(.data and (.data[] | contains("10.0.4.65"))) | "\(.metadata.namespace) \(.metadata.name)"'

image.png
这个命令做了什么:

  1. kubectl get cm --all-namespaces -o json:获取集群中所有命名空间的 ConfigMaps,并以 JSON 格式输出。
  2. jq -r:使用 jq 进行原样(raw)格式化处理,并传入后续查询。
  3. .items[]:遍历 JSON 中的 items 数组。
  4. select(.data and (.data[] | contains("10.0.4.65"))):选择具有 data 字段的 items,并且该字段中包含特定字符串 “10.0.4.65”。
  5. "\(.metadata.namespace) \(.metadata.name)":输出每个匹配项的命名空间和名称。

发散思维:其他用法和场景

过滤特定命名空间的 ConfigMap

有时候我们只需关注特定命名空间的配置信息:

kubectl get cm -n mynamespace -o json | jq -r '.items[] | select(.data and (.data[] | contains("10.0.4.65"))) | .metadata.name'

在这个命令中,-n mynamespace 参数确保只有 mynamespace 命名空间中的 ConfigMaps 被获取。

查找使用特定镜像的 Deployment

可能我们还想知道正在哪些 Deployment 中使用了特定的镜像:

kubectl get deploy --all-namespaces -o json | jq -r '.items[] | select(.spec.template.spec.containers[].image | contains("myimage:mytag")) | "\(.metadata.namespace) \(.metadata.name)"'

这个查询会返回所有使用名为 “myimage:mytag” 镜像的 Deployment 的命名空间和名称。

检查资源限制

我们还可以检查哪些 Pod 被设置了特定的资源限制,例如内存使用限制:

kubectl get po --all-namespaces -o json | jq -r '.items[] |select(.spec.containers[]?.resources?.limits?.memory // "" | contains("500Mi")) | "\(.metadata.namespace) \(.metadata.name)"'

image.png

此处我们搜索那些内存限制设为 “500Mi” 的 Pod。
jq 是一个功能强大的轻量级命令行 JSON 处理器,它在 Kubernetes 环境管理中充当了一个不可或缺的角色。通过结合 kubectl 的输出和 jq 的处理能力,运维工程师可以快速发现和处理集群中的数据。本节将进一步探讨 jq 的其他高级用法,帮助技术人员优化日常工作流程。

使用 jq 过滤和映射数据

映射数据属性

jq 可以将 JSON 对象中的数据映射到一个新的结构中去。例如,我们可能想要提取所有 ConfigMaps 的名称和创建时间:

kubectl get cm --all-namespaces -o json | jq -r '.items[] | {name: .metadata.name, creationTime: .metadata.creationTimestamp}'

这个命令会创建一个新的 JSON 对象,每个对象包含 namecreationTime 两个字段。
image.png

使用 jq 函数

jq 有一组内建的函数可以用来处理数据。若要对时间戳进行格式化,我们可以使用 fromdate 函数:

kubectl get cm --all-namespaces -o json | jq -r '.items[] | {name: .metadata.name, creationTime: (.metadata.creationTimestamp | fromdate)}'

这里,我们将 ISO 8601 格式的时间戳转换成 Unix 时间戳格式。
image.png

过滤特定的字段

jq 允许您选择性地查看所需的特定字段。例如,若要在输出中只包含特定名称的 ConfigMaps:

kubectl get cm --all-namespaces -o json | jq -r '.items[] | select(.metadata.name | test("deploy.*")) | .metadata.name'

image.png

统计数量

如果您想统计匹配特定条件的 ConfigMaps 的数量,可以使用 jq

kubectl get cm --all-namespaces -o json | jq '[.items[] | select(.data and (.data[] | contains("10.0.4.65")))] | length'

此命令返回一个数组,包含所有满足条件的 ConfigMaps,并使用 length 获取其数量。
image.png

对 JSON 数组和对象进行高级操作

排序和唯一化

jq 可以对数组进行排序,同时删除重复元素:

kubectl get pods --all-namespaces -o json | jq '[.items[] | {name: .metadata.name, namespace: .metadata.namespace, timestamp: .metadata.creationTimestamp}] | unique_by(.name, .namespace) | sort_by(.timestamp)'

如此一来,我们得到了一个按创建时间排序,并且包含唯一 Pod 名称的列表。

分组和分类

集群中的资源可以按照一定的属性进行分组。比如,我们想按照命名空间对 Pods 进行分组:

kubectl get pods --all-namespaces -o json | jq '[.items | group_by(.metadata.namespace)[] | {namespace: (.[0].metadata.namespace), pods: map(.metadata.name)}]'

该命令返回每个命名空间的 Pod 名称列表。
image.png

进行复杂查询的 jq 脚本

对于更复杂的查询,我们可以编写一小段 jq 脚本。例如,我们想要获取所有 ConfigMaps 并对其进行某些复杂的转换:

kubectl get cm --all-namespaces -o json | jq 'include "my_jq_lib"; .items[] | my_complex_transformation'

这里,my_jq_lib 是包含我们自定义的 jq 函数的脚本,而 my_complex_transformation 是我们定义的具体转换函数。
注:这里是chatgpt帮生成的没有使用过这种脚本的方式

结论

使用 kubectljq 可以大幅简化 Kubernetes 的配置管理和搜索工作。在本文中,我们探讨了如何搜索包含特定配置值的 ConfigMaps,并且讨论了一些其他实用场景。这些工具的强大组合为运维人员提供了灵活性和效率,使其能够更好地管理和操作 Kubernetes 集群的资源。随着需求的不断变化,我们也应该不断探索这些工具的新用法,以适应不断变化的技术挑战。

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

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

相关文章

2、python函数和获取帮助

调用函数、定义自己的函数以及使用Python的内置文档 你已经见过并使用了print和abs等函数。但是Python还有许多其他函数,而定义自己的函数是Python编程的一个重要部分。 在这个课程中,你将学习更多关于使用和定义函数的知识。 文章目录 1.获取帮助1.1定义函数1.1.1注释1.2无…

基于SSM的驾校信息管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue、HTML 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是…

人机协同中存在一个独特的时空体系

一、在人机协同中存在一个独特的时空体系 在人机这个独特的时空体系中,人和机器之间的时间和空间的交织和共同作用。 在时间维度上,人机协同体系中的人和机器具有不同的时间节奏和速度。人类有限的生命周期和有时候需要休息的需求使得他们的工作时间和生…

机器人制作开源方案 | 智能循迹避障小车

作者:刘元青、邹海峰、付志伟、秦怀远、牛文进 单位:哈尔滨信息工程学院 指导老师:姚清元 智能小车是移动式机器人的重要组成部分,而移动机器人不仅能够在经济、国防、教育、文化和生活中起到越来越大的作用,也是研究…

【Redis】windows上安装的Redis,并在springboot中配置并且连接详细(排坑)

比如在开发测试阶段,为了方便就直接使用自己windows装好redis进行简单测试了,在项目中不去单独配置yam的redis属性可以正常操作,但是在springboot的yam中配置redis连接属性时候却连不上,特意记录一下方便后续再遇到能快速解决 一、Redis配置文件位置(windows) 一般情况下…

Codeforces Round 114 (Div. 1) C. Wizards and Numbers(思维题 辗转相除+博弈 巴什博弈)

题目 t(t<1e4)组询问&#xff0c;每次询问(a,b)&#xff08;0<a,b<1e18&#xff09;&#xff0c; 不妨a<b&#xff08;a>b时需要交换两个数考虑&#xff09; ①令b减去a的k次方&#xff08;k>1&#xff09;&#xff0c;要求减完之后b非负 ②令bb%a 当a和…

java处理16进制字符串的一些方法和基础知识

前言&#xff1a;本篇文章是对于基础数据的处理的一些简单经验总结里边包含了一些基础的数据储存和数据转化的一些知识&#xff0c;同样也包含有部分快捷的数据处理方法。主要用于个人知识的一个记录和方便进行对应的数据转换和处理。 1、bit,字节和字的关系 1.1 bit和字节的…

2024全新开发API接口调用管理系统网站源码 附教程

2024全新开发API接口调用管理系统网站源码 附教程 用layui框架写的 个人感觉很简洁 方便使用和二次开发

腾讯云MPS为出海媒体企业助力

在如今互联网发达的时代&#xff0c;一个视频通过网络发布即可供给全球用户进行观看。其中视频媒体企业便其中的领头先锋&#xff0c;为了让创作者们以及全球各大用户的视频进行快速推广&#xff0c;出海则是不二之选。但是因为各地区域的不同&#xff0c;带宽的不同与网络的限…

深信服技术认证“SCSA-S”划重点:逻辑漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

桌面显示器type-c接口方案

在当今时代&#xff0c;TYPE-C接口桌面显示器已经成为了我们生活和工作中不可或缺的重要设备之一。与传统显示器相比&#xff0c;新型的TYPE-C接口桌面显示器具有更多的功能和优势&#xff0c;其中最显著的特点就是支持视频传输和充电功能。 首先&#xff0c;TYPE-C接口桌面显示…

Python Socketio 介绍

socketio是一个Python库&#xff0c;用于处理实时网络通信&#xff0c;它实现了Socket.IO协议。Socket.IO是一个JavaScript库&#xff0c;用于实时、双向和基于事件的通信。它在浏览器和服务器之间建立一个持久的连接&#xff0c;允许它们进行实时通信。 socketio.Client()是so…

【金猿人物展】白鲸开源CEO郭炜:数据要素是未来数据“新能源”产业么?

纵观2023年中国数据行业发展与2024年数据产业趋势&#xff0c;就不得不提到2023年全年国家全年强调的数据要素的概念以及在2023年12月中国国家数据局等17个部门联合印发了《“数据要素”三年行动计划&#xff08;2024—2026年&#xff09;》。 从2020年-2023年政策发展脉络来看…

第九部分 使用函数 (五)

目录 一、origin 函数 “undefined” “default” “file” “command line” “override” “automatic” 二、shell 函数 三、控制 make 的函数 1、error 2、warning 一、origin 函数 origin 函数不像其它的函数&#xff0c;他并不操作变量的值&#xff0c;他只是…

[ACM 学习] 最长上升子序列

LIS&#xff08;最长上升子序列&#xff09;的三种经典求法 - 一只不咕鸟 - 博客园 (cnblogs.com) 理解一下第三种方法&#xff08;贪心二分查找&#xff09; 因为构建的是上升子序列&#xff0c;所以是可以用二分查找找到最大的小于当前 A[i] 的在子序列中的 F[j]&#xff0…

【Git】GitHub上手动解决冲突

在 GitHub 上手动解决冲突通常涉及使用 Pull Request&#xff08;PR&#xff09;来进行合并。以下是一些基本的步骤&#xff0c;以帮助你手动解决冲突&#xff1a; 创建 Pull Request&#xff1a; 在 GitHub 仓库页面&#xff0c;切换到你的分支。 点击 “Pull Requests” 选…

可计算理论的优点及缺陷

可计算理论对计算机科学的发展和理论基础起到了重要的作用&#xff0c;它提供了计算问题可解性和不可解性的理论依据&#xff0c;并且对计算机算法的设计和性能分析有着重要的指导作用。同时&#xff0c;可计算理论也与形式语言、自动机理论、复杂性理论等其他计算科学领域有着…

关于steam游戏搬砖,想给大家的几点忠告

关于CSGO游戏搬砖&#xff0c;想给大家的几点忠告&#xff1a; 1、新出的箱子&#xff0c;里面开出的皮肤短时间内会溢价&#xff0c;价格虚高&#xff0c;后期会呈逐渐下跌趋势&#xff0c;这就是我们不让大家碰新品的原因&#xff0c;哪怕利润再高也不建议购入或者囤货&…

Linux Mii management/mdio子系统分析之五 PHY状态机分析及其与net_device的关联

&#xff08;转载&#xff09;原文链接&#xff1a;https://blog.csdn.net/u014044624/article/details/123303714 前面几章基本上完成了mdio模块驱动模型的分析&#xff0c;本篇文章主要讲述phy device的状态机以及phy device与net_device的关联。Phy device主要是对phy的抽象…

【Android开发】移动程序设计复习大纲

《移动程序设计》复习大纲 考试题型和分值&#xff1a; 一、判断题&#xff08;共10小题&#xff0c;每题1分&#xff0c;共10分&#xff09; 二、单选题(共10小题&#xff0c;每题1分&#xff0c;共10分) 三、填空题&#xff08;共10小题&#xff0c;每空1分&#xff0c;共…