Доступ к GCP Internal Load Balancer из другого региона
Мне нужно получить доступ к внутреннему приложению, работающему на GKE Nginx Ingress, работающему на Internal Load Balancer, из другого региона GCP.
Я полностью осознаю, что использование прямой сети Google невозможно, и это огромное ограничение ( GCP Feature Request).
Доступ к внутреннему балансировщику нагрузки можно получить с помощью туннеля VPN от AWS, но я не уверен, что создание такого туннеля между областями GCP в одной сети - хорошая идея.
Обходные пути приветствуются!
1 ответ
В примечаниях к выпуску от GCP говорится, что:
Глобальный доступ - это необязательный параметр для внутренних служб LoadBalancer, который позволяет клиентам из любого региона вашего VPC получать доступ к внутреннему IP-адресу балансировщика нагрузки TCP/UDP.
Глобальный доступ разрешен для каждой службы с использованием следующей аннотации:
network.gke.io/internal-load-balancer-allow-global-access: "true".
ОБНОВЛЕНИЕ: сервис ниже работает для GKE v1.16.x и более новых версий:
apiVersion: v1
kind: Service
metadata:
name: ilb-global
annotations:
# Required to assign internal IP address
cloud.google.com/load-balancer-type: "Internal"
# Required to enable global access
networking.gke.io/internal-load-balancer-allow-global-access: "true"
labels:
app: hello
spec:
type: LoadBalancer
selector:
app: hello
ports:
- port: 80
targetPort: 8080
protocol: TCP
Для GKE v1.15.x и более ранних версий:
Доступ к IP-адресу внутреннего балансировщика нагрузки с виртуальной машины, находящейся в другом регионе, не будет работать. Но это помогло мне сделать внутренний балансировщик нагрузки глобальным.
Поскольку мы знаем, что внутренний балансировщик нагрузки - это не что иное, как правило переадресации, мы можем использовать команду gcloud для включения глобального доступа.
Сначала получите внутренний IP-адрес балансировщика нагрузки с помощью kubectl и сохраните его IP, как показано ниже:
# COMMAND: kubectl get services/ilb-global # OUTPUT: NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ilb-global LoadBalancer 10.0.12.12 10.123.4.5 80:32400/TCP 18m
Обратите внимание на значение "EXTERNAL-IP" или просто запустите команду ниже, чтобы сделать это еще проще:
# COMMAND: kubectl get service/ilb-global \ -o jsonpath='{.status.loadBalancer.ingress[].ip}' # OUTPUT: 10.123.4.5
GCP присваивает случайно сгенерированный идентификатор правилу переадресации, созданному для этого балансировщика нагрузки. Если у вас несколько правил переадресации, используйте следующую команду, чтобы выяснить, какое из них является только что созданным внутренним балансировщиком нагрузки:
# COMMAND: gcloud compute forwarding-rules list | grep 10.123.4.5 # OUTPUT NAME REGION IP_ADDRESS IP_PROTOCOL TARGET a26cmodifiedb3f8252484ed9d0192 asia-south1 10.123.4.5 TCP asia-south1/backendServices/a26cmodified44904b3f8252484ed9d019
ПРИМЕЧАНИЕ. Если вы не работаете в Linux или grep не установлен, просто запустите
gcloud compute forwarding-rules list
и вручную найдите правило переадресации с искомым IP-адресом.Обратите внимание на имя правила переадресации и выполните следующую команду, чтобы обновить правило пересылки с помощью --allow-global-access (не забудьте добавить бета-версию, поскольку это все еще бета-функция):
# COMMAND: gcloud beta compute forwarding-rules update a26cmodified904b3f8252484ed9d0192 \ --region asia-south1 --allow-global-access # OUTPUT: Updated [https://www.googleapis.com/compute/beta/projects/PROJECT/regions/REGION/forwardingRules/a26hehemodifiedhehe490252484ed9d0192].
И дело сделано. Теперь вы можете получить доступ к этому внутреннему IP- адресу (10.123.4.5) из любого экземпляра в любом регионе (но в той же сети VPC).
Другой возможный способ - реализовать прокси-сервер ngnix reverser на вычислительной машине в том же регионе, что и кластер GKE, и использовать внутренний IP-адрес экземпляра вычислительной машины для связи со службами GKE.
Прежде всего, обратите внимание, что единственный способ подключить любой ресурс GCP (в данном случае ваш кластер GKE) из локального местоположения, это либо через облачное межсоединение, либо через настройку VPN, которая фактически должна быть в одном регионе и в VPC. чтобы иметь возможность общаться друг с другом.
Сказав это, я вижу, что вам не понравится делать это под тем же VPC, поэтому обходной путь для вашего сценария может быть:
Создание службы типа LoadBalancer, чтобы ваш кластер мог быть доступен через внешний и общедоступный IP, предоставляя эту службу. Если вы беспокоитесь о безопасности, вы можете использовать Istio, например, для применения политик доступа.
Или создать балансировку нагрузки HTTP(S) с Ingress, чтобы ваш кластер мог быть доступен через его внешний (публичный) IP. И опять же, в целях безопасности вы можете использовать GCP Cloud Armor, который на самом деле работает только для балансировки нагрузки HTTP(S).