带GKE内部负载均衡器的DNS

时间:2019-04-25 10:42:15

标签: kubernetes google-cloud-platform dns google-kubernetes-engine

我在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上的内部负载平衡器是否可用?还是有一种解决方法可以使我完成类似的工作?

3 个答案:

答案 0 :(得分:1)

从未听说过GKE中用于负载平衡器的内置DNS,但实际上我们做得很简单。我们拥有External DNS Kubernetes服务,该服务管理诸如负载平衡器和入口之类的各种事情的DNS记录。您可以做什么:

  1. 创建Cloud DNS内部区域。确保将其与VPC集成。
  2. 确保您的Kubernetes节点服务帐户具有DNS管理员(或超宽编辑器)权限。
  3. 安装外部DNS。
  4. external-dns.alpha.kubernetes.io/hostname=your.hostname.here注释内部的Load Balancer服务
  5. 验证DNS记录已创建并且可以在您的VPC中解决。

答案 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在不同集群的吊舱之间可见。

这种方法的缺点是,在自动缩放期间,您将丢失一个工作节点。