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を参照)ので、シェルインタープリターは最初にそれを行い、混乱しています。引数を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 に答える