kubectl与 jq的用法

一、背景
在日常运维工作中,我们需要管理和操作大量的配置文件,这在使用 Kubernetes 集群管理应用时尤为常见。Kubernetes 提供了一个名为 ConfigMap 的资源对象,它用于存储应用的配置信息。有时,我们需要查找哪些 ConfigMap 包含特定的配置值,例如一个特定的 IP 地址或者字符串。

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

[root@master1 ~]# kubectl get cm --all-namespaces -o json | jq -r '.items[] | select(.data and (.data[] | "\(.metadata.namespace) \(.metadata.name)"'kubectl get cm -n mynamespace -o json | jq -r '.items[] | select(.data and (.data[] | contains("10.0.4.65"))) | .metadata.name'
jq: Unknown option -o
Use jq --help for help with command-line options,
or see the jq manpage, or online docs  at https://stedolan.github.io/jq

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

[root@master1 ~]# kubectl get deploy --all-namespaces -o json | jq -r '.items[] | select(.spec.template.spec.containers[].image | contains("minio")) | "\(.metadata.namespace) \(.metadata.name)"'
minio minio

四、检查资源限制

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

此处我们搜索那些内存限制设为 “500Mi” 的 Pod。 jq 是一个功能强大的轻量级命令行 JSON 处理器,它在 Kubernetes 环境管理中充当了一个不可或缺的角色。通过结合 kubectl 的输出和 jq 的处理能力,可以快速发现和处理集群中的数据。

五、使用 jq 过滤和映射数据

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

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

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

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

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

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

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

九、对 JSON 数组和对象进行高级操作
排序和唯一化

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)'

分组和分类

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

你可能感兴趣的:(kubernetes,容器)