Как узнать url-адрес сервиса в кубернетах?

У меня есть локальный кластер Kubernetes на моем локальном рабочем столе докера.

Вот как выглядит моя служба kubernetes, когда я выполняю команду kubectl description

Name:              helloworldsvc
Namespace:         test
Labels:            app=helloworldsvc
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"helloworldsvc"},"name":"helloworldsvc","namespace":"test...
Selector:          app=helloworldapp
Type:              ClusterIP
IP:                10.108.182.240
Port:              http  9111/TCP
TargetPort:        80/TCP
Endpoints:         10.1.0.28:80
Session Affinity:  None
Events:            <none>

Эта служба указывает на развертывание с веб-приложением.

У меня вопрос, как мне найти URL-адрес этой услуги? Я уже пробовал http://localhost:9111/, и это не сработало.

Я проверил, что модуль, на который указывает эта служба, работает.


person Foo    schedule 02.01.2020    source источник


Ответы (3)


Созданная вами служба относится к типу ClusterIP и доступна только изнутри кластера. У вас есть два способа получить к нему доступ со своего рабочего стола:

  1. Создайте службу типа nodeport, а затем получите доступ к ней через nodeip:nodeport

  2. Используйте Kubectl переадресацию портов и затем войдите в него через localhost:forwardedport

person Arghya Sadhu    schedule 02.01.2020
comment
Никогда не используйте IP, если вы можете использовать DNS, если вы точно не знаете, что делаете. - person Alexey Vazhnov; 10.02.2021

URL-адрес службы имеет следующий формат:

<service-name>.<namespace>.svc.cluster.local:<service-port>

В вашем случае это:

helloworldsvc.test.svc.cluster.local:9111
person P Ekambaram    schedule 02.01.2020
comment
Спасибо за ответ, есть ли способ избежать ‹namespace› в URL-адресе? Я запускаю cron, а затем должен сделать запрос к службе в том же пространстве имен. - person Kostanos; 09.02.2021
comment
если обе службы находятся в одном пространстве имен, просто используйте имя службы. остальное можно игнорировать - person P Ekambaram; 10.02.2021

Получите название службы: kubectl get service -n test

URL-адрес службы kubernetes: имя-службы.namespace.svc.cluster.local: порт службы, где cluster.local - это имя кластера kubernetes.

Чтобы получить имя кластера: kubectl config get-contexts | awk {'print $2'}

URL службы в вашем случае будет helloworldsvc.test.svc.cluster.local: 9111.

То, как вы пытаетесь сделать, не сработает, поскольку для того, чтобы сделать его доступным на вашем локальном хосте, вам нужно сделать сервис доступным по адресу nodeport или с помощью port-forward или с помощью kubectl proxy.

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

kubectl exec -it container-name -n its-namespace-name sh

тогда сделай

curl localhost:80 or curl helloworldsvc.test.svc.cluster.local:9111 or curl 10.1.0.28:80

но обе команды curl будут работать только внутри модуля Kubernetes, а не на вашем компьютере localhost.

Для доступа на вашем хост-компьютере kubectl port-forward svc/helloworldsvc 80:9111 -n test

person redzack    schedule 02.01.2020