Как использовать зарезервированный внешний IP-адрес из проекта-хоста Shared VPC в службе GKE LoadBalancer проекта-услуги

Вопрос или проблема

Я нашел две ссылки (здесь и здесь) в документации GCP, которые говорят, что я могу зарезервировать IPv4-адрес в проекте-хозяине и использовать его в проекте сервиса.

В моем случае у меня есть проект-хозяин, где я имею сеть Shared VPC и зарезервировал там внешний IP-адрес. Теперь я хотел бы назначить этот IPv4-адрес сервису GKE LoadBalancer, как описано здесь, то есть я хочу ввести его в поле spec.loadBalancerIP в k8s Service.

Я уверен, что Shared VPC настроена правильно, так как у меня есть два кластера (один в проекте-хозяине и один в проекте сервиса), которые работают, и я могу выполнить запрос от podA@host-k8s-cluster к podB@service-k8s-cluster, но для k8s Service с type: LoadBalancer в проекте сервиса я получаю следующее сообщение об ошибке:

Error syncing load balancer: failed to ensure load balancer requested ip "..." is neither static nor assigned to the LB

Как правильно использовать/делиться этим внешним IPv4-адресом для k8s LoadBalancer Service в проекте сервиса?

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


цитаты из документации

Региональный внешний IP-адрес должен быть определён либо в том же проекте, что и балансировщик нагрузки, или в проекте-хозяине Shared VPC.

Статические внешние IPv4-адреса: объекты внешних IPv4-адресов, определённые в проекте-хозяине, могут использоваться ресурсами либо в этом проекте-хозяине, либо в любом прикрепленном проекте сервиса.

У меня такая же проблема с Terraform и IGM:

Error adding new access_config: googleapi: Error 400: Invalid value for field 'resource.natIP': 'projects/***/regions/me-west1/addresses/video-lb-me-west1'. The specified external IP address 'projects/***/regions/me-west1/addresses/video-lb-me-west1' was not found in region 'me-west1'., invalid

но глобальный IP-адрес работает

.

Ответ или решение

Чтобы правильно использовать зарезервированный внешний IP-адрес из хост-проекта Shared VPC в сервисном проекте для сервиса GKE с LoadBalancer, необходимо выполнить ряд шагов и учесть специфику работы Google Cloud Platform и Kubernetes. Ваша цель — обеспечить связь облачной архитектуры, в которой задействованы несколько проектов и совместно используемая VPC. Давайте разберем план действий, учитывая предоставленную информацию и возможные ошибки.

Шаг 1: Удостоверение в правильности настройки Shared VPC

Прежде чем переходить к настройке самих сервисов, убедитесь, что ваша Shared VPC правильно сконфигурирована. Она должна поддерживать связность между проектами. Это включает:

  • Проверку, что оба проекта (хост-проект и сервисный проект) имеют правильно настроенные роли и разрешения.
  • Убедитесь, что политика IAM позволяет вашему сервисному проекту использовать ресурсы, включая IP-адреса, из хост-проекта.

Шаг 2: Резервирование внешнего IP-адреса в хост-проекте

Вы можете зарезервировать статический внешний IP-адрес в хост-проекте. Это можно сделать через Google Cloud Console или используя gcloud CLI. При резервировании убедитесь, что:

  • IP-адрес находится в том же регионе, что и ваш кластер Kubernetes.
  • Это региональный IP-адрес, так как глобальный IP-адрес не может быть использован для Network Load Balancer.

Шаг 3: Предоставление доступа к статическому IP из сервисного проекта

Следует убедиться, что ресурсы в сервисном проекте имеют доступ к IP-адресам в хост-проекте. Это может включать:

  • Настройку IAM ролей и разрешений так, чтобы сервисный проект мог использовать сетевые ресурсы хост-проекта.
  • Убедитесь, что у вас есть надлежащие разрешения для использования IP-адресов в контексте вашего GKE кластера.

Шаг 4: Настройка GKE LoadBalancer сервиса в сервисном проекте

При создании GKE LoadBalancer в вашем кластерном проекте выполните следующие действия:

  1. Используйте Kubernetes манифест, чтобы явно указать зарезервированный IP-адрес в поле spec.loadBalancerIP.

    apiVersion: v1
    kind: Service
    metadata:
     name: my-service
    spec:
     type: LoadBalancer
     loadBalancerIP: <ВАШ_ЗАРЕЗЕРВИРОВАННЫЙ_IP>
     selector:
       app: my-app
     ports:
       - protocol: TCP
         port: 80
         targetPort: 9376
  2. Проверьте, чтобы не возникало конфликтов или ошибок в процессе развертывания. Ошибка, которую вы получаете (failed to ensure load balancer requested ip ... is neither static nor assigned to the LB), указывает на то, что IP-адрес либо не распознается как статический, либо неправильно ассоциирован.

Шаг 5: Техническая проверка и отладка

Если после выполнения всех шагов ошибка сохраняется:

  • Проверьте еще раз, что IP-адрес действительно существует в хост-проекте и что это статический адрес.
  • Перепроверьте, правильно ли настроены IAM-разрешения.
  • Обратитесь к логам событий Kubernetes (kubectl describe service my-service) для выявления более подробной информации об ошибке.
  • Если ошибка касается Terraform и IGM (Instance Group Manager), убедитесь, что Terraform конфигурации согласованы с настройками GCP.

Заключение

При правильной настройке и проверке всех параметров, указанных выше, ваш сервисный проект должен успешно использовать зарезервированный IP-адрес из хост-проекта для GKE LoadBalancer. Следите за изменением документации и управлением разрешениями, и всегда проводите тестирование после внесения изменений в архитектуру облачных проектов.

Оцените материал
Добавить комментарий

Капча загружается...