docker desktop kubernetes - как сопоставить порты с ClusterFirstWithHostNet

Я использую кубернеты из докера для окон, и у меня возникла проблема. Я использую statefulset со следующей частью конфигурации:

          spec:
      terminationGracePeriodSeconds: 300
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet

В классических кубернетах эта спецификация предоставляет все порты из модуля на IP-адрес узла, поэтому все они могут быть доступны через него. Я пытаюсь разработать его на кубернетах из докера для Windows, но кажется, что я не могу получить доступ к узлу по его IP (например, в minikube или microk8s), но докер для Windows отображает локальный хост в кластер. Итак, вот проблема: эта конфигурация предоставляет все порты на IP-адресе узла, например 192.168.65.4, но я не могу получить к нему доступ из окон - я могу получить доступ только к кластеру через localhost, но он предоставляет только порт, связанный с протоколом, например 443 Итак, когда моя служба работает на порту, то есть 10433, нет доступа с localhost:10433, но также нет доступа в целом через IP-адрес узла. Есть ли способ настроить его для работы как классических кубернетов, где открыты все порты? Я знаю, что единственный порт можно открыть через NodePort,но для меня важно выставить все порты из пода, чтобы имитировать реальное поведение кубернетов

1 ответ

Решение

В общем, сеть хостов Docker не работает на платформах, отличных от Linux. Он принят как допустимый вариант Docker, но сеть «хоста» на самом деле не является сетью физической системы. Вероятно, это относится и к настройке Kubernetes, встроенной в Docker Desktop.

Необходимость в сети хоста должна быть довольно редкой, а в Kubernetes это еще более необычно. Сеть хоста отключает обычные механизмы межконтейнерной связи. В частности, Kubernetes имеет сложную сетевую среду и обычно имеет более одного узла; отказ от такой настройки сети может сделать практически невозможным доступ к вашей службе как изнутри кластера, так и извне.

Вместо сети хоста вы должны использовать обычную сетевую настройку Kubernetes. Практически для каждого создаваемого вами развертывания потребуется соответствующая служба, и если вы установите для этой службы type: nodePort тогда он будет доступен извне кластера (попробуйте оба назначенных nodePort: номер и внутренний кластер службы port:; неясно, какой порт на самом деле использует Docker Desktop).

Для некоторых целей проще всего настроить перенаправление локального порта на службу.

      kubectl port-forward deployment/some-deployment 8888:3000

настроит переадресацию портов с порта 8888 в локальной системе на порт 3000 на некотором модуле, управляемом указанным развертыванием. Это перенаправляет на один модуль (если у вас несколько реплик, он нацелен только на одну из них), это медленнее, чем прямое соединение, и переадресация портов иногда дает сбой, но этого достаточно для задач обслуживания, таких как миграция базы данных.

имитировать поведение настоящих кубернетов

В среде, в которой я обычно работаю, каждый кластер имеет от десятков до сотен узлов. К узлам нельзя получить прямой доступ извне кластера. Также довольно часто можно настроить PodSecurityPolicy для запрета сети хоста, поскольку это может рассматриваться как проблема безопасности.

Другие вопросы по тегам