我需要从另一个GCP区域访问运行在Internal Load Balancer上的GKE Nginx Ingress服务上运行的内部应用程序。
我完全知道,无法使用直接的Google联网,这是一个巨大的限制(GCP Feature Request)。
可以通过AWS的VPN隧道很好地访问内部负载均衡器,但是我不确定在同一网络下的GCP区域之间创建这样的隧道是一个好主意。
欢迎解决方法!
答案 0 :(得分:6)
GCP的发行说明中指出:
Global access是内部LoadBalancer Services的可选参数,它允许VPC中任何区域的客户端访问内部TCP / UDP负载均衡器IP地址。
使用以下注释按服务启用全局访问:
networking.gke.io/internal-load-balancer-allow-global-access:“真”。
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。但是this帮助我将内部负载均衡器设置为全局。
我们知道内部负载均衡器不过是forwarding rule,因此可以使用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 ,因为它仍然是测试版功能):
# 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 network)中的任何实例访问此内部IP( 10.123.4.5 )。
答案 1 :(得分:1)
首先,请注意,从本地位置连接任何GCP资源(在本例中为GKE群集)的唯一方法是通过Cloud Interconnect或VPN设置,实际上它们必须位于同一位置区域和VPC能够相互通信。
话虽如此,我看到您不希望在同一VPC上执行此操作,因此,针对您的方案的解决方法可能是:
创建一个Service of type LoadBalancer,以便exposing this service可以通过外部IP(公共)访问您的集群。如果您担心安全性,可以使用Istio来强制执行访问策略。
或者,创建一个HTTP(S) load balancing with Ingress,以便可以通过其外部(公共)IP访问群集。同样,出于安全目的,您可以使用GCP Cloud Armor,到目前为止,它实际上仅适用于HTTP(S)负载平衡。
答案 2 :(得分:0)
另一种可能的方法是在与GKE群集相同区域的计算引擎上实现ngnix反向代理服务器,并使用计算引擎实例的内部IP与GKE的服务进行通信。