kubectl的命名路径jsonpath表达式

3

我有一个运行着的kube服务,其中有两个命名端口,如下所示:

$ kubectl get service elasticsearch --output json
{
    "apiVersion": "v1",
    "kind": "Service",
    "metadata": {
        ... stuff that really has nothing to do with my question ...
    },
    "spec": {
        "clusterIP": "10.0.0.174",
        "ports": [
             {
                "name": "http",
                "nodePort": 31041,
                "port": 9200,
                "protocol": "TCP",
                "targetPort": 9200
            },
            {
                "name": "transport",
                "nodePort": 31987,
                "port": 9300,
                "protocol": "TCP",
                "targetPort": 9300
            }
        ],
        "selector": {
            "component": "elasticsearch"
        },
        "sessionAffinity": "None",
        "type": "NodePort"
    },
    "status": {
        "loadBalancer": {}
    }
}

我正在尝试获取只包含“http”端口的输出:

$ kubectl get service elasticsearch --output jsonpath={.spec.ports[*].nodePort}
31041 31987

除非我按照这里的作弊表http://kubernetes.io/docs/user-guide/kubectl-cheatsheet/中提示的添加测试表达式,否则在名称上添加时会出错。

$ kubectl get service elasticsearch --output jsonpath={.spec.ports[?(@.name=="http")].nodePort}
-bash: syntax error near unexpected token `('
3个回答

14

()在bash中有特殊含义(请参考子shell),所以你的shell解释器会先执行它们并感到困惑。将jsonpath的参数用单引号括起来即可解决问题:

$ kubectl get service elasticsearch --output jsonpath='{.spec.ports[?(@.name=="http")].nodePort}'

例如:

# This won't work:
$ kubectl get service kubernetes --output jsonpath={.spec.ports[?(@.name=="https")].targetPort}
-bash: syntax error near unexpected token `('

# ... but this will:
$ kubectl get service kubernetes --output jsonpath='{.spec.ports[?(@.name=="https")].targetPort}'
443

10

我在Windows的Powershell上遇到了以下问题:

执行模板时发生错误:不可识别的标识符http2

当在jsonpath中指定双引号包裹的字符串值时,为解决此错误有两种方法:

交换单引号和双引号:

kubectl -n istio-system get service istio-ingressgateway -o jsonpath="{.spec.ports[?(@.name=='http2')].port}"

或者在双引号中转义单引号:

kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name==\"http2\")].port}'

有同样的问题。不知道在Linux上交换双引号和单引号是否也可以? - Don Rhummy

1

对我来说,在 Windows 机器上出现了错误:

kubectl --namespace=app-test get svc proxy --output jsonpath='{.spec.ports[?(@.name=="web")].nodePort}'

> executing jsonpath "'{.spec.ports[?(@.name==web)].nodePort}'":
> unrecognized identifier web

尽管我的json在ports数组中包含name字段,在线上它工作得很好。但是,我尝试使用类型为整数的port字段代替name字段,并且它可以正常工作。因此,如果有人遇到相同的问题并且port字段是预定义的,则可以选择使用它。
kubectl --namespace=app-test get svc proxy --output jsonpath='{.spec.ports[?(@.port==9000)].nodePort}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接