3

我有使用 2 个命名端口运行的 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 `('
4

3 回答 3

14

()在 bash 中表示某些内容(请参阅subshel​​l),因此您的 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
于 2017-01-07T23:33:06.270 回答
8

我在 Powershell 中的 Windows 上遇到了这个问题:

执行模板时出错:无法识别的标识符 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}'
于 2020-01-24T09:34:41.853 回答
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 包含端口数组中的名称字段。在线它工作正常。

然后我没有使用名称字段,而是尝试使用整数类型的端口字段并且它可以工作。

因此,如果任何人面临同样的问题并且端口字段是预定义的,那么他们可以使用它。

kubectl --namespace=app-test get svc proxy --output jsonpath='{.spec.ports[?(@.port==9000)].nodePort}'
于 2017-11-20T11:14:05.217 回答