Как выбрать внешний IP-адрес балансировщика нагрузки Kubernetes в Google Kubernetes Engine

Я развертываю веб-приложение с помощью Google Kubernetes Engine и хочу сделать его доступным через балансировщик нагрузки на существующем статическом IP-адресе, которым я управляю как часть того же проекта в Google Cloud Platform, потому что доменное имя, которое я хочу использовать уже указывает на этот IP.

Файл yaml, который я использовал для модуля:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
  - name: my-container
    image: gcr.io/my-project/my-app:latest

Я могу настроить балансировщик нагрузки, используя:

apiVersion: v1
kind: Service
metadata:
  name: my-load-balancer
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: my-app
  type: LoadBalancer

Это обеспечивает внешний IP-адрес, по которому приложение доступно, но я не могу найти способ настроить его на использование IP-адреса, который я хочу. В документации по сервисам упоминается настройка spec.clusterIP, но, похоже, это не относится к внешнему IP. Аналогично, после настройки балансировщика нагрузки в поле status.loadBalancer.ingress.ip службы устанавливается внешний IP-адрес, но это не настраиваемый параметр.

В качестве альтернативы я попытался вручную создать правило пересылки в консоли Google Compute Engine, чтобы перенаправлять трафик со моего статического IP-адреса в целевой пул, настроенный Kubernetes, но при попытке подключения соединение отклоняется.

Есть ли способ сделать то, что я хочу - выставить модуль Kubernetes (или контроллер репликации) в движке Google Kubernetes на выбранный статический IP-адрес?

3 ответа

Решение

TL;DR Контейнерный движок Google с поддержкой Kubernetes v1.1 loadBalancerIP просто пометьте автоматически назначенный IP как статический в первую очередь.

Kubernetes v1.1 поддерживает внешние IP:

apiVersion: v1
kind: Service
spec:
  type: LoadBalancer
  loadBalancerIP: 10.10.10.10
  ...

Пока нет действительно хорошей последовательной документации о том, как использовать ее на GCE. Несомненно то, что этот IP должен сначала быть одним из ваших предварительно назначенных статических IP.

Документация по межрегиональной балансировке нагрузки в основном предназначена для Compute Engine, а не для Kubernetes/Container Engine, но она по-прежнему полезна, особенно в части "Настройка службы балансировки нагрузки".

Если вы просто создадите Kubernetes LoadBalancer на GCE, он создаст сетевой вычислительный движок> Сеть> Балансировка сетевой нагрузки> Правило пересылки, указывающее на целевой пул, состоящий из ваших машин в кластере (обычно только те, на которых запущены модули, соответствующие селектору служб), Похоже, что удаление пространства имен не очень хорошо очищает созданные правила.


Обновить

На самом деле это теперь поддерживается (хотя и не документировано):

  1. Убедитесь, что вы работаете с Kubernetes 1.1 или более поздней версией (в GKE отредактируйте свой кластер и отметьте "Node version")
  2. В разделе " Сеть"> "Внешние IP-адреса" у вас уже должно быть несколько Ephemeral, помеченных как указывающие на экземпляр виртуальной машины вашего кластера (если нет или не уверены, один раз разверните без loadBalancerIPподождите, пока вы не выделите внешний IP при запуске kubectl get svcи найдите этот IP в списке на этой странице). Отметьте один из них как статический, скажем, внешний адрес 10.10.10.10,
  3. Отредактируйте свой LoadBalancer, чтобы иметь loadBalancerIP=10.10.10.10 как указано выше (адаптируйтесь к IP-адресу, предоставленному вами Google).

Теперь, если вы удалите свой LoadBalancer или даже ваше пространство имен, он должен сохранить этот IP-адрес при повторном размещении в этом кластере. Если вам нужно сменить кластер, возможно, придется поиграть вручную:

  1. В разделе "Балансировка сетевой нагрузки" на вкладке "Целевые пулы" нажмите кнопку "Создать целевой пул":
    • Название: cluster-pool (или любое другое имя)
    • Регион: выберите регион одного из ваших кластеров
    • Проверка работоспособности: по желанию, по желанию
    • Выберите существующие группы экземпляров: ваш кластер Kubernetes
  2. В разделе "Балансировка сетевой нагрузки" на вкладке "Правила пересылки" нажмите кнопку "Создать правило пересылки":
    • Название: http-cross-region-gfr (или любое другое имя)
    • Регион: выберите регион одного из ваших кластеров
    • Внешний IP: выберите loadbalancer-ip-crossregion Вы только что защищены
    • Целевой пул: Выбрать cluster-pool ты только что создал

Хорошие новости. Это будет исправлено в Kubernetes v1.1. Вы можете установить service.spec.loadBalancerIP поле IP, который вы знаете, у вас есть.


Предыдущая:

Это особенность, которая провалилась в трещины. Предполагалось, что он сработает (и, возможно, даже работал в какой-то момент), но не был хорошо протестирован и был сломан по пути, а затем как бы случайно спроектирован (временно).

В моем шорт-листе все исправлено после 1.0.

https://github.com/GoogleCloudPlatform/kubernetes/issues/10323

Если вы пытаетесь использовать Helm для установкиingress-nginxсо статическим внешним IP-адресом, вот команда, которая сработала у меня:

      helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace \
  --debug \
  --set controller.service.loadBalancerIP=<YOUR_STATIC_IP>

Больше информации: