使用 kubectl 时 JSONPath 范围不起作用

JSONPath range not working when using kubectl

我正在通过 CLI 工具访问 Kubernetes kubectl,我正在尝试获取所有上下文名称的列表,每行一个。

我知道 JSONPath 可用于提取和格式化特定输出。我真的很接近我想要的

kubectl config view -o=jsonpath="{.contexts[*].name}"

但这会将所有名称放在同一行。我正在尝试使用 range 列出所有由换行符分隔的名称:

kubectl config view -o=jsonpath='{range .contexts[*]}{.name}{"\n"}{end}'

但这只是给我一个错误:

error: unexpected arguments: [.contexts[*]}{.name}{"\n"}{end}]
See 'kubectl config view -h' for help and examples.

我查看了 kubectl 文档,我所做的与 https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/#list-containers-by-pod 非常相似,其中的命令是

kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\
sort

但我看不出哪里错了。

你的命令在 kubectl 1.9.2 中对我有效

如果还是不行,可以在bash中使用tr来换行:

kubectl config view -o=jsonpath="{.contexts[*].name}" | tr " " "\n" 

我明白了。我一直在使用@ahmetb 的 kubectl-aliases 脚本,它工作正常没有问题,但 README 中的建议之一是:

Print the full command before running it: Add this to your .bashrc or .zshrc file:

function kubectl() { echo "+ kubectl $@"; command kubectl $@; }

我的 .bashrc 中有那个函数声明,它去掉了我的 jsonpath 参数的引号。一旦我注释掉该声明并打开一个新的 shell,该命令就可以正常工作。