Есть ли способ получить внешние порты кластера кубернетов

Я выставил службу на внешнем порте на всех узлах кластера кубернетов из:

kubectl create -f nginx-service.yaml

Вы выставили свою службу на внешний порт на всех узлах кластера. Если вы хотите предоставить доступ к этой службе для внешнего Интернета, вам может потребоваться настроить правила брандмауэра для служебных портов (tcp: 30002) для обслуживания трафика.

См. http://releases.k8s.io/release-1.2/docs/user-guide/services-firewalls.md для получения дополнительных сведений. сервис "nginx-service" создан.

Есть ли способ получить внешние порты кластера кубернетов?


person kevin    schedule 06.06.2016    source источник
comment
Вы используете облако Google, AWS или локальный докер в качестве поставщика кубернетов? ... Kubernetes должен быть агностиком, но на aws это отрывочно   -  person Scott Stensland    schedule 15.06.2016


Ответы (7)


kubectl get svc --all-namespaces -o go-template='{{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}{{end}}'

Он получает все службы во всех пространствах имен и делает в основном: «для каждой службы, для каждого порта, если определен nodePort, печать nodePort».

person Tim Hockin    schedule 31.08.2016
comment
Можете ли вы добавить пояснение к своему ответу? Это поможет OP понять, что вы публикуете. - person Guillaume Racicot; 01.09.2016
comment
kubectl get svc --all-namespaces -o go-template='{{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{.}}{{"\n"}}{{end}}{{end}}{{end}}' это даст больше информации о каждом из перечисленных NodePort. - person Anum Sheraz; 29.03.2018
comment
Какая команда делает то же самое, но для определенного пространства имен (без диапазона)? - person Akito; 09.03.2020
comment
kubectl get svc -n ‹namespace› -o go-template = '{{range .items}} {{range.spec.ports}} {{if .nodePort}} {{. nodePort}} {{\ n}} {{end}} {{end}} {{end}} ' - person Tim Hockin; 10.03.2020
comment
`` kubectl get svc --all-namespaces -o go-template = '{{range .items}} {{range.spec.ports}} {{if .nodePort}} {{. nodePort}} {{\ t}} {{. name}} {{\ n}} {{end}} {{end}} {{end}} '| sort '', если вы также хотите идентифицировать службы, связанные с каждым nodePort (в порядке возрастания nodePorts) - person Shondeslitch; 24.06.2020

Надеюсь, ответ будет коротким и простым:

kubectl describe service --all-namespaces | grep -i nodeport

Но использование шаблона go - идеальный вариант, который можно использовать для извлечения дополнительных деталей.

person rajdeepbs29    schedule 10.06.2019

Если вы просматриваете свою службу с помощью kubectl describe service NAME, должно отображаться вы какой порт был назначен (в поле NodePort).

person Robert Bailey    schedule 06.06.2016
comment
Да, я знаю это. Есть ли способ получить все внешние порты одной или другой командой? - person kevin; 06.06.2016
comment
Вы имеете в виду порты узлов для всех служб в вашем кластере? - person Robert Bailey; 07.06.2016
comment
да. Как команда: kubectl get endpoints. root @ jya-SBCR: / home / jya / work # kubectl получить конечные точки ИМЯ КОНЕЧНЫЕ ТОЧКИ ВОЗРАСТ ebaserdb-ommp-service 172.16.43.6:3306 10d ebaserdb-service 172.16.43.8:3306 11d ivlm2-service 172.16.43.4:8080 11d kubernetes .178.197: 6443 26d Могу ли я получить порты узлов для всех служб в одном кластере? - person kevin; 07.06.2016
comment
Единственный способ сделать это (о котором я знаю) - это написать короткий сценарий, который выполняет итерацию по службам из kubectl get services и запускает каждую из них через kubectl describe service. - person Robert Bailey; 11.06.2016

Чтобы получить расширенную информацию о сервисных портах:

kubectl describe service -A

Чтобы получить только конечные точки службы:

kubectl get endpoints -A

Чтобы ограничить вывод IP-адресом узла, вы можете использовать grep по сетевой маске или использовать более сложный сценарий.

person Vanuan    schedule 25.06.2020

... и вы можете выполнить то же решение в качестве альтернативы с помощью JsonPath ...

  • получить внешний порт (nodePort) myservice, соответствующий внутреннему порту 1234

     kubectl get svc myservice -o=jsonpath='{.spec.ports[?(@.port==1234)].nodePort}'
    
  • получить список всех IP-адресов узлов, лежащих в основе вашего кластера, в одной строке

     kubectl get node -o=jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}'
    

Очевидно, эту информацию можно легко объединить в удобный сценарий bash для удовлетворения любых конкретных потребностей ...

#!/bin/bash
#
# discoverService - extract the externally visible Node-IP and port for a specific Service in Kubernetes
#
KUBECTL=kubectl
#
if [[ $# < 2 || "$1" == "-h" ]]
    then
    echo discoverService SERVICENAME INTERNALPORT
    exit -1
fi
SERVICENAME=$1
INTERNALPORT=$2

EXTPORT=`${KUBECTL} get svc $SERVICENAME -o=jsonpath="{.spec.ports[?(@.port==${INTERNALPORT})].nodePort}"`

EXTIP=`${KUBECTL} get node -o=jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}'`


if [[ -z $EXTPORT ]]
    then
    echo -e "ERROR: service=$SERVICENAME internal-port=$INTERNALPORT not found.\n"
    exit -2
elif [[ -z $EXTIP ]]
    then
    echo -e "ERROR: could not retrieve underlying node IPs.\n"
    exit -2
fi
# Success...
echo $EXTIP:$EXTPORT
person Ichthyo    schedule 15.02.2019
comment
В примере nodePort есть небольшая опечатка - вместо этого следует читать: kubectl get svc myservice -o=jsonpath='{.items[*].spec.ports[?(@.port==1234)].nodePort} - person Carsten; 22.11.2020

kubectl get svc --all-namespaces -o go-template='{{range .items}}{{ $save := . }}{{range.spec.ports}}{{if .nodePort}}{{$save.metadata.namespace}}{{"/"}}{{$save.metadata.name}}{{" - "}}{{.name}}{{": "}}{{.nodePort}}{{"\n"}}{{end}}{{end}}{{end}}'

Это получает не только используемые nodeport, но и имя nodeport, имя службы и пространство имен службы в следующем формате:

<namespace>/<service name> - <nodeport name>: <nodeport>
person H.Peter    schedule 27.04.2021

Для меня недостающей частью был фактический IP-адрес minikube.

---->$:kubectl describe service --all-namespaces | grep -i nodeport
Name:                     my-nodeport-service
Type:                     NodePort
NodePort:                 <unset>  30007/TCP
---->$:curl $(minikube ip):30007
person Ryu S.    schedule 01.05.2021