выражение kubectl jsonpath для именованного пути

У меня есть служба 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 `('

person Lev Kuznetsov    schedule 07.01.2017    source источник


Ответы (3)


( и ) что-то означают в bash (см. подоболочку) , поэтому ваш интерпретатор оболочки делает это первым и запутывается. Заключите аргумент 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
person Amit Kumar Gupta    schedule 07.01.2017

У меня были эти проблемы в Windows в Powershell:

Ошибка выполнения шаблона: неизвестный идентификатор http2

При указании в jsonpath строкового значения, заключенного в двойные кавычки - для решения ошибки есть 2 пути:

Поменяйте местами одинарные и двойные кавычки:

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}'
person AC81    schedule 24.01.2020
comment
Была такая же проблема. Есть идеи, можно ли поменять местами двойные и одинарные кавычки в Linux? - person Don Rhummy; 27.04.2021

Для меня это выдавало ошибку на машине 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}'
person Utkarsh Yeolekar    schedule 20.11.2017