我在GKE上有两个kubernetes集群:一个负责与外界互动的公众,一个私有供内部使用。
公共集群需要访问私有集群上的某些服务,我已经通过internal load balancers将这些服务公开给了公共集群的pod。当前,我正在为负载均衡器指定要使用的内部IP地址,并将这些IP传递给公共Pod,但是我希望负载均衡器可以选择任何可用的内部IP地址,并且可以将其DNS名称传递给公共Pod。
Internal load balancer DNS适用于为VM服务的常规内部负载平衡器,并且DNS的格式为[SERVICE_LABEL].[FORWARDING_RULE_NAME].il4.[REGION].lb.[PROJECT_ID].internal
,但是GKE上的内部负载平衡器是否可用?还是有一种解决方法可以使我完成类似的工作?
答案 0 :(得分:1)
从未听说过GKE中用于负载平衡器的内置DNS,但实际上我们做得很简单。我们拥有External DNS Kubernetes服务,该服务管理诸如负载平衡器和入口之类的各种事情的DNS记录。您可以做什么:
external-dns.alpha.kubernetes.io/hostname=your.hostname.here
注释内部的Load Balancer服务答案 1 :(得分:1)
我怀疑“内部负载平衡器DNS”路由是否有效,但是这里有一些解决方法:
1)入口:在公共集群中,将所有私有服务名称映射到私有集群中的入口控制器。入口可以将每个主机名的请求路由到正确的服务。
2)存根域:为私有服务使用一些常见的后缀(例如* .private),并使用私有集群kube-dns解析这些服务名称(请参见https://kubernetes.io/blog/2017/04/configuring-private-dns-zones-upstream-nameservers-kubernetes/)
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-dns
namespace: kube-system
data:
stubDomains: |
{"private": ["10.2.3.4"]}
upstreamNameservers: |
["8.8.8.8", "8.8.4.4"]
3)尚未尝试过,但是kEdge似乎是在集群之间安全通信的另一种解决方案:https://improbable.io/blog/introducing-kedge-a-fresh-approach-to-cross-cluster-communication
答案 2 :(得分:1)
您可以通过为内部负载均衡器分配工作节点CIDR的ip来实现。在GKE中,当我们创建集群时,我们提供了三个CIDR块 1.工人节点cidr 2. Pod cidr 3.服务端点cidr(通常由负载均衡器使用)。 我们为Pod sand Service提供的CIDR仅在Kubernetes上可见。因此它在外面不可见。
您可以从Worker Node CIDR(从工作节点CIDR)分配一个IP,而不是从VPC中的子网分配一个IP,而不是将服务端点IP用作内部负载平衡器,因此该IP在不同集群的吊舱之间可见。
这种方法的缺点是,在自动缩放期间,您将丢失一个工作节点。