Kubernetes 从其他区域访问GCP内部负载平衡器

Kubernetes 从其他区域访问GCP内部负载平衡器,kubernetes,google-kubernetes-engine,google-cloud-internal-load-balancer,Kubernetes,Google Kubernetes Engine,Google Cloud Internal Load Balancer,我需要从另一个GCP区域访问在内部负载平衡器上运行的GKE Nginx Ingress服务上的内部应用程序 我完全知道,使用直接谷歌网络是不可能的,这是一个巨大的限制() 通过AWS的VPN隧道可以很好地访问内部负载平衡器,但我不确定在同一网络下的GCP区域之间创建这样的隧道是一个好主意 欢迎采取变通办法 首先,请注意,从本地位置连接任何GCP资源(在本例中是您的GKE群集)的唯一方法是通过云互连或VPN设置,实际上它们必须位于同一区域和VPC中,才能相互通信 话虽如此,我知道您不喜欢在同一VP

我需要从另一个GCP区域访问在内部负载平衡器上运行的GKE Nginx Ingress服务上的内部应用程序

我完全知道,使用直接谷歌网络是不可能的,这是一个巨大的限制()

通过AWS的VPN隧道可以很好地访问内部负载平衡器,但我不确定在同一网络下的GCP区域之间创建这样的隧道是一个好主意


欢迎采取变通办法

首先,请注意,从本地位置连接任何GCP资源(在本例中是您的GKE群集)的唯一方法是通过云互连或VPN设置,实际上它们必须位于同一区域和VPC中,才能相互通信

话虽如此,我知道您不喜欢在同一VPC下这样做,因此您的场景的解决方案可以是:

  • 创建,以便可以通过和外部(公共)IP访问群集。如果您担心安全性,例如,可以使用强制执行访问策略

  • 或者,创建一个,以便可以通过其外部(公共)IP访问群集。同样,出于安全目的,您可以使用到目前为止仅适用于HTTP负载平衡的


另一种可能的方法是在GKE集群所在区域的计算引擎上实现ngnix reverser代理服务器,并使用计算引擎实例的内部IP与GKE的服务进行通信。

在GCP的发行说明中指出:

是内部负载平衡器服务的可选参数,允许VPC中任何区域的客户端访问内部TCP/UDP负载平衡器IP地址

使用以下注释对每个服务启用全局访问:
networking.gke.io/internal-load-balancer-allow-global-access:“true”。

更新:以下服务适用于GKE v1.16.x及更新版本:
对于GKE v1.15.x及更早版本: 从位于不同区域的VM访问内部负载平衡器IP将不起作用。但帮助我使内部负载平衡器全球化

正如我们所知,内部负载平衡器只不过是一个应用程序,我们可以使用命令来启用全局访问

  • 首先使用获取负载平衡器的内部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功能):


  • 一切都结束了。现在,您可以从任何区域的任何实例访问此内部IP(10.123.4.5)(但相同)。

    顺便说一句,我遇到了内部LB的相同限制,发现没有比将多区域服务公开为NodePort服务更好的解决方案。更好的办法是通过Nginx入口代理这类服务,Nginx入口也是NodePort。我知道,这不是您想要的,但可能会有所帮助。这正是我在部分服务中所做的-这种方法的问题是内部节点IP地址会定期更改(主要是在节点升级时)。我目前所做的是用节点IP创建一个云DNS条目。但我仍在考虑如何在节点升级或更改时自动更改IP。想法?我所做的是编写python脚本,该脚本使用Kube API获取所有节点的IP地址,并使用所有这些IP在Google云中创建DNS记录。此脚本使用cronjob每5分钟运行一次。它当然需要使用serviceaccount访问Kube和使用另一个serviceaccount访问Google云。@VasilyAngapov-干得好!你能把你的剧本贴在什么地方吗?这个答案和被问到的完全无关。我不是要求从prem位置连接,只是从另一个GCP区域连接。我明确要求创建内部负载平衡器(因为我们不希望任何资源具有公共IP)。很抱歉,我以为您的意思是将GKE的ILB与on prem连接起来,因为您的应用程序运行在GKE Nginx Ingres服务上。不过,概念是一样的。当您使用ILB(无论是否使用GKE)时,必须使用相同的VPC和区域,无论是否使用VPN隧道。这就是为什么我要求解决此限制的原因。也就是说,我能够通过VPN隧道从AWS访问ILB,没有问题。我还可以通过NAT访问ILB。也许有一个简单的解决办法可以在不同的GCP区域之间实现类似的功能。我遇到的另一个解决办法可能是:-如果他们在同一个网络上,但在不同的区域,你可以考虑使用代理VM,然后可以访问ILB。只要确保VM与ILB位于同一区域即可。-如果他们在不同的地区和专有网络,您将需要使用外部入口点。全局访问注释仍然是测试版。这对我很有用。Thx。@RammusXu它现在是稳定的,我已经相应地更新了我的答案。
    # 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
    
    # 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].