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

How to Add Internal DNS Records in Kubernetes

我目前正在设置一个 Kubernetes 集群,其中私有和 public 服务都是 运行。虽然 public 服务应该可以通过互联网(和 FQDN)访问,但私人服务不应该(想法是 运行 集群内的 VPN,私人服务应该可以通过 simple FQDN)。

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

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

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

感谢您的帮助!

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

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

我自己设法解决了这个问题...编写了一个小的 Go 应用程序,它监视 Ingress 资源并相应地向 CoreDNS 读取的 Corefile 添加 rewrite 规则...工作起来很有魅力:)

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

由于您的 k8s 集群是使用 gcloud 托管的,您可以尝试使用 Cloud DNS。您可以在那里添加一个 private zone 和您的 DNS 名称。

然后您可以在您的 vpn 配置中将此 dns 服务器推送到您的客户端:

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

169.254.169.254 是 googles dns,只能从 google 专用网络内部访问

Kubernetes 具有内置 DNS,每个服务都接收内部 fqdn。 除非

,否则无法从外部获得这些服务
  • 服务类型是'LoadBalancer'
  • 您为该服务定义了入口(假设您已经部署了像 nginx 这样的入口控制器)

因此,部署在 'default' 命名空间中的示例服务可以在集群内开箱即用地访问 service1.default.svc.cluster.local

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

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

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

如果您有可以解析 FQDN 的内部 DNS 服务器,则可以配置 Corefile 以将内部服务域解析转发到该 DNS 服务器。

例如,如果内部 domains/FQDN 是 *.mycompany.local,Corefile 可能有一个部分:

mycompany.local {
        log
        errors
        ready
        cache 10
        forward . <internal DNS server IP> {
        }

}

app.mycompany.localfrontend.middleware.backend.mycompany.local 的所有请求都将转发到您的内部 DNS 进行解析。

forward 插件的文档可在此处获得:https://coredns.io/plugins/forward/