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

16

Я развертываю веб-приложение с помощью 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-адрес?

Бен
источник

Ответы:

9

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только что созданный
Wernight
источник
Они все еще актуальны?
Бен
8

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


Предыдущая:

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

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

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

Тим Хокин
источник
Вероятно, это должен быть комментарий, а не ответ.
Опека - Восстановите Монику
5
@Ward: «Это невозможно» от разработчика - это ответ, ИМХО, и это было принято как таковое.
Свен