В настоящее время я работаю над небольшим хобби-проектом, который я сделаю открытым исходным кодом, как только он будет готов. Этот сервис работает на Google Container Engine. Я выбрал GCE, чтобы избежать проблем с конфигурацией, затраты доступны и изучать новые вещи.
Мои модули работают нормально, и я создал службу с типом LoadBalancer
для предоставления службы на порты 80 и 443. Это работает отлично.
Однако я обнаружил, что для каждой LoadBalancer
службы создается новый балансировщик нагрузки Google Compute Engine. Этот балансировщик нагрузки довольно дорогой и действительно закончен для хобби-проекта в одном экземпляре.
Чтобы сократить расходы, я ищу способ выставить порты без балансировки нагрузки.
Что я пробовал до сих пор:
Разверните
NodePort
сервис. К сожалению, запрещено выставлять порт ниже 30000.Разверните Ingress, но это также создаст балансировщик нагрузки.
Пытался отключить
HttpLoadBalancing
( https://cloud.google.com/container-engine/reference/rest/v1/projects.zones.clusters#HttpLoadBalancing ), но он все равно создает балансировщик нагрузки.
Есть ли способ выставить порты 80 и 443 для одного экземпляра в Google Container Engine без балансировщика нагрузки?
источник
externalIp
В дополнение к отличному и работающему решению ConnorJC : в этом вопросе также описывается то же решение: Kubernetes - можно ли избежать использования балансировщика нагрузки GCE для снижения затрат?
«InternalIp» относится к внутреннему ip (например, на Google Cloud Platform -> Google Compute Engine -> экземпляры виртуальных машин) экземпляра вычислительного экземпляра (или узла).
Этот комментарий дает подсказку о том, почему следует настроить внутренний, а не внешний ip.
Кроме того, после настройки службы для портов 80 и 443 мне пришлось создать правило брандмауэра, разрешающее трафик на мой экземплярный узел:
После этой настройки я мог получить доступ к своему сервису через http (s): // externalIp
источник
Если у вас есть только один модуль, вы можете использовать
hostNetwork: true
для этого:Обратите внимание, что при этом ваш модуль будет наследовать DNS-преобразователь хоста, а не Kubernetes. Это означает, что вы больше не можете разрешать службы кластеров по имени DNS. Например, в приведенном выше примере вы не можете получить доступ к
static
службе по адресу http: // static . Вы по-прежнему можете обращаться к сервисам по их IP-адресу кластера, которые вводятся переменными среды .Это решение лучше, чем использование внешнего IP-адреса службы, поскольку оно обходит kube-proxy, и вы получите правильный IP-адрес источника.
источник
Чтобы обобщить ответы @ConnorJC @ derMikey в то, что сработало для меня:
Учитывая пул кластера, работающий на экземпляре Compute Engine :
Я сделал сервис:
а затем открыл брандмауэр для всех (?) ips в проекте:
а затем
my-app
был доступен через публичный IP-34.56.7.001
адрес GCE (не ip кластера)источник
Я предпочитаю не использовать облачные балансировщики нагрузки, если это необходимо, из-за стоимости и привязки к поставщику.
Вместо этого я использую это: https://kubernetes.github.io/ingress-nginx/deploy/
Это модуль, который запускает балансировщик нагрузки для вас. На этой странице есть замечания по установке GKE.
источник