Как указать статический IP-адрес для балансировки нагрузки Kubernetes?

У меня есть кластер Kubernetes, работающий на Google Compute Engine, и я бы хотел назначить статические IP-адреса для моих внешних сервисов (type: LoadBalancer). Я не уверен, возможно ли это в данный момент или нет. Я нашел следующие источники по этой теме:

  • Документация по обслуживанию Kubernetes позволяет вам определять внешний IP-адрес, но он терпит неудачу, так как не может развязать объект в значение Go типа [] v1. LoadBalancerIngress
  • Поле publicIPs, как мне кажется, позволяет мне указывать внешние IP-адреса, но, похоже, это не работает.
  • Эта проблема Github утверждает, что то, что я пытаюсь сделать, пока не поддерживается, но будет в Kubernetes v1.1
  • поле clusterIP также позволяет мне указать IP-адрес, но с ошибкой "если IP не находится в допустимом диапазоне"

Мне кажется, что использование статических IP-адресов очень важно при настройке веб-сервисов. Я что-то упустил? Я был бы очень благодарен, если бы кто-нибудь мог просветить меня здесь!

EDIT: для пояснения: я не использую Container Engine, я сам создал кластер, используя официальные инструкции по установке для Compute Engine. Все IP-адреса, связанные с моими службами k8s, помечены как "эфемерные", что означает, что воссоздание службы kubernetes может привести к другому внешнему IP-адресу (поэтому мне нужно, чтобы они были статическими). ​​

Ответы

Ответ 1

Kubernetes v1.1 внесет несколько изменений.

Во-первых, все балансировки нагрузки в GCE получат статические IP-адреса. Это позволяет нам моделировать операции "обновления", которые GCE не поддерживает.

Во-вторых, https://github.com/kubernetes/kubernetes/pull/13005 предлагает новое поле для явного задания IP-адреса балансировки нагрузки.

Обратите внимание, что ваш "эфемерный" IP является вашим, пока существует ваша Служба. Это примерно похоже на то, что AWS делает с именами ELB (произвольно назначенные, ваши, пока вы не отпустите его).

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

clusterIP - это адрес внутри кластера и обычно недоступен вне кластера или "проекта" или VPC (в терминах GCE или AWS).

Ответ 2

TL; DR Google Container Engine, работающий с Kubernetes v1.1, поддерживает loadBalancerIP, сначала помечает автоматически назначенный IP как статический.

Kubernetes v1.1 поддерживает externalIPs:

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

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

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

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


Update

В настоящее время поддерживается (хотя и под документированным):

  • Убедитесь, что вы запускаете Kubernetes 1.1 или более поздней версии (под GKE отредактируйте свой кластер и отметьте "Node версия" )
  • Выделить статические IP-адреса под "Сеть" > "Внешние IP-адреса" :
    • Разверните один раз без loadBalancerIP, дождитесь выделения внешнего IP-адреса при запуске kubectl get svc и найдите этот IP-адрес в списке на этой странице и измените его с Ephemeral на Static.
    • Нажмите "Восстановить статический адрес" в регионе вашего кластера, привязанный к None.
  • Измените свой LoadBalancer на loadBalancerIP=10.10.10.10, как указано выше (адаптируйте к IP-адресу, предоставленному вами Google).

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


Обновление 2016-11-14

См. также статья Kubernetes, описывающая, как настроить статический IP-адрес для одного или нескольких доменов на Kubernetes.

Ответ 3

Если вы работаете в Google Container Engine и используете type: LoadBalancer, то Google Cloud Platform должна была создать балансировку сетевой нагрузки для вас со статическим IP-адресом, который будет перенаправляться на эту услугу. Вам не нужно указывать какие-либо IP-адреса.

Чтобы найти сетевой балансировщик сети IP, запустите:

gcloud compute forwarding-rules list --project "YOUR-PROJECT-ID"

Вы также можете запустить:

kubectl get services

который вернет как кластер, так и внешний IP и порт для ваших услуг.