Локальный кластер Kubernetes Pod hostPort - приложение недоступно - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь получить доступ к веб-API, развернутому в моем локальном кластере Kubernetes, запущенном на моем ноутбуке (Docker -> Настройки -> Включить Kubernetes). Ниже приведен мой Pod Spe c YAML.

kind: Pod
apiVersion: v1
metadata:
  name: test-api
  labels:
    app: test-api
spec:
  containers:
  - name: testapicontainer
    image: myprivaterepo/testapi:latest
    ports:
    - name: web
      hostPort: 55555
      containerPort: 80      
      protocol: TCP

kubectl get pods показывает, что test-api запущен. Однако, когда я пытаюсь подключиться к нему с помощью http://localhost: 55555 / testapi / index со своего ноутбука, я не получаю ответа. Но я могу получить доступ к приложению из контейнера в другом модуле в кластере (я сделал kubectl exe c -it для другого контейнера), используя URL-адрес

http: // IP-адрес кластера подов test-api / testapi / index

. Почему я не могу получить доступ к приложению, используя URL-адрес localhost: hostport?

1 Ответ

1 голос
/ 19 июня 2020

Я бы сказал, что это категорически не рекомендуется. Согласно документации k8s: https://kubernetes.io/docs/concepts/configuration/overview/#services

Не указывайте hostPort для Pod, если это не абсолютно необходимо. Когда вы привязываете Pod к hostPort, это ограничивает количество мест, в которых Pod может быть запланирован, потому что каждый комбинация должна быть уникальной. Если вы не укажете hostIP и протокол явно, Kubernetes будет использовать 0.0.0.0 в качестве hostIP по умолчанию и TCP в качестве протокола по умолчанию.

Если вам нужен только доступ к порту для В целях отладки вы можете использовать прокси-сервер apiserver или kubectl port-forward.

Если вам явно нужно открыть порт модуля на узле, подумайте об использовании службы NodePort, прежде чем прибегать к hostPort.

Итак ... Действительно ли hostPort нужен в вашем случае? Или служба NodePort решит эту проблему?

Если это действительно необходимо, вы можете попробовать использовать IP-адрес, возвращаемый командой:

kubectl get nodes -o wide

http : // ip-from-the-command : 55555 / testapi / index

Кроме того, другой тест, который может помочь в устранении неполадок, - это проверка, доступно ли ваше приложение на IP-адресе модуля.

ОБНОВЛЕНИЕ

Я провел несколько тестов локально и лучше понял, что пытается объяснить документация. Позвольте мне go пройти мой тест:

  • Сначала я создал Pod с помощью hostPort: 55555, я сделал это с помощью простого nginx.
  • Затем я перечислил свои модули и увидел, что этот работает на одном из моих c узлов.
  • После этого я попытался получить доступ к модулю через порт 55555 через IP-адрес главного узла и IP-адрес другого узла. безуспешно, но при попытке доступа через IP-адрес узла, на котором фактически работал этот модуль, он работал.

Итак, «проблема» (и, собственно, поэтому этот подход не рекомендуется), заключается в что Pod доступен только через указанный c Node IP. Если он перезапустится и запустится на другом узле, IP-адрес также изменится.

...