kubernetes 如何根据注解“过滤”和“格式化”名称空间

wlzqhblo  于 2023-05-28  发布在  Kubernetes
关注(0)|答案(1)|浏览(316)

我想根据注解过滤名称空间。我不希望命名空间的注解为components\.gke\.io/layer=="addon"
我尝试了kubectl get ns -o=jsonpath='{.items[?(@.metadata.annotations.components\.gke\.io/layer=="addon")].metadata.name}'命令,至少它给了我结果,但它不是以正常的表格格式来的,当你执行kubectl get ns的方式来的。

然而,这不是我想要的,我想要的是相反的,这意味着过滤掉这些GKE行。我试了kubectl get ns -o=jsonpath='{.items[?(@.metadata.annotations.components\.gke\.io/layer=="")].metadata.name}',但它不工作,它给予空结果。
我尝试格式化,但无法创建所需的命令。任何人之前都尝试过-(1.)过滤出具有特定注解(2.)格式的名称空间,以表格格式输出。

3mpgtkmj

3mpgtkmj1#

我认为(!?)你不能在kubectlJSONPath实现中使用否定。
一旦将--output标志与kubectl一起使用,就无法使用默认表格格式呈现命令的输出。例如,Bash column可以提供类似的输出。
考虑使用通用的JSON处理工具,如jq
使用独立工具的一个优点是,一旦熟悉了该工具,就可以将其与任何发出JSON的命令一起使用(而不仅仅是与kubectl一起使用)。

FILTER='
  ["NAME","STATUS"],
(.items[]| 
  [
    select(.metadata.annotations["components.gke.io/layer"]!="addon")
    |.metadata.name,.status.phase
  ]
)
|@tsv'

kubectl get namespaces --output=json \
| jq -r "${FILTER}" \
| column --table --separator $'\t'

关于FILTER
1.返回一个JSON数组,通过管道传输到@tsv(制表符格式的输出)
1.第一个数组条目是一个数组(!)的栏标题

  1. .items通过select传输,该select过滤不包含annotation的命名空间
    1.将未筛选的命名空间名称和状态作为JSON数组项发出
    然后,jq发出的制表符格式(不再是JSON)被输送到columncolumn将结果格式化为表格。

相关问题