我需要从另一个 GCP 区域访问在内部负载均衡器上运行的 GKE Nginx Ingress 服务上运行的内部应用程序。
我完全清楚直接使用 Google 网络是不可能的,这是一个巨大的限制(GCP 功能请求)。
内部负载均衡器可以通过 AWS 的 VPN 隧道很好地访问,但我不确定在同一网络下的 GCP 区域之间创建这样的隧道是一个好主意。
欢迎解决方法!
我需要从另一个 GCP 区域访问在内部负载均衡器上运行的 GKE Nginx Ingress 服务上运行的内部应用程序。
我完全清楚直接使用 Google 网络是不可能的,这是一个巨大的限制(GCP 功能请求)。
内部负载均衡器可以通过 AWS 的 VPN 隧道很好地访问,但我不确定在同一网络下的 GCP 区域之间创建这样的隧道是一个好主意。
欢迎解决方法!
在 GCP 的发行说明中指出:
全局访问是内部 LoadBalancer 服务的可选参数,它允许来自您 VPC 中任何区域的客户端访问内部 TCP/UDP 负载均衡器 IP 地址。
使用以下注释为每个服务启用全局访问:
networking.gke.io/internal-load-balancer-allow-global-access: "true"。
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
从位于不同区域的 VM 访问内部负载均衡器 IP 将不起作用。但这帮助我使内部负载均衡器全球化。
我们知道内部负载均衡器不过是一个转发规则,我们可以使用gcloud命令来启用全局访问。
首先使用kubectl获取负载均衡器的内部 IP 地址并保存其 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 为为此负载均衡器创建的转发规则提供一个随机生成的 ID。如果您有多个转发规则,请使用以下命令确定哪一个是您刚刚创建的内部负载均衡器:
# 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更新转发规则(请记住添加beta,因为它仍然是 beta 功能):
# 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].
它已经完成了。现在,您可以从任何区域(但相同的VPC 网络)中的任何实例访问此内部 IP ( 10.123.4.5 )。
另一种可能的方法是在与 GKE 集群相同区域的计算引擎上实现 ngnix 反向代理服务器,并使用计算引擎实例的内部 IP 与 GKE 的服务进行通信。
首先,请注意,从本地位置连接任何 GCP 资源(在本例中为 GKE 集群)的唯一方法是通过 Cloud Interconnect 或 VPN 设置,实际上它们必须位于同一区域和 VPC能够相互交流。
话虽如此,我看到您不喜欢在同一个 VPC 下这样做,因此您的方案的解决方法可能是:
创建一个LoadBalancer 类型的服务,以便通过公开此服务可以通过外部(公共)IP 访问您的集群。如果您担心安全性,例如可以使用Istio来强制执行访问策略。
或者,使用 Ingress 创建HTTP(S) 负载平衡,以便您的集群可以通过其外部(公共)IP 访问。再次,出于安全目的,您可以使用GCP Cloud Armor,它实际上仅适用于 HTTP(S) 负载平衡。