如何在Kubernetes中添加内部DNS记录

时间:2019-10-25 03:51:04

标签: kubernetes dns kubernetes-ingress nginx-ingress coredns

我目前正在建立一个同时运行私有和公共服务的Kubernetes集群。虽然应该可以通过Internet(和FQDN)访问公共服务,但不能访问私有服务(其思想是在可以通过简单 FQDN访问私有服务的群集中运行VPN)。

目前,我正在使用nginx-ingress并配置Ingress资源,并在其中设置公共资源的主机名。然后,external-dns添加相应的DNS记录(在Google CloudDNS中)-这已经起作用。

我现在面临的问题:我不确定如何以相同的方式添加DNS记录(即简单地在Ingress定义中指定主机并使用一些入口类private ),但只能从集群内部访问这些DNS记录。

给我的印象是,可以将这些记录添加到CoreDNS正在使用的Corefile中。但是,我无法弄清楚如何将其自动化。

谢谢您的帮助!

4 个答案:

答案 0 :(得分:1)

我设法自己解决了这个问题...写了一个小的Go应用程序,它监视Ingress资源,并向rewrite添加Corefile规则,从而使CoreDNS读取的{... 1 ...魅力:)

PS:如果有人想使用该工具,请告诉我。如果有需求,我很乐意将其开源。

答案 1 :(得分:0)

如果您不希望公开访问它们,则不想为其添加入口规则。入口仅用于将外部流量路由到您的群集中。

您的所有服务均已在CoreDNS中注册,并可以使用其本地名称进行访问,而无需添加其他任何内容。

答案 2 :(得分:0)

由于您的k8s集群由gcloud托管,因此您可以尝试使用Cloud DNS。您可以在其中添加带有DNS名称的private zone

然后,您可以使用以下方法将此dns服务器以您的vpn配置推送到客户端:

 push "dhcp-option DOMAIN gitlab.internal.example.com"
 push "dhcp-option DNS 169.254.169.254"

169.254.169.254是Google的DNS,只能从Google专用网络内部访问

答案 3 :(得分:0)

Kubernetes具有内置的DNS,每个服务都接收内部fqdn。 除非从外部无法提供这些服务,否则

  • 服务类型为“ LoadBalancer”
  • 您为该服务定义入口(假设您已经部署了nginx之类的入口控制程序)

因此,可以通过以下方式在群集内部直接访问部署在“默认”名称空间中的示例服务: service1.default.svc.cluster.local

您可以通过指定自定义ExternalName来更改名称

apiVersion: v1
kind: Service
metadata:
  name: service1
  namespace: prod
spec:
  type: ExternalName
  externalName: service1.database.example.com

请注意,没有代理可完成此工作,您需要确保从集群内部可以路由给定的新名称(允许出站连接等)