如何在 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.local
或 frontend.middleware.backend.mycompany.local
的所有请求都将转发到您的内部 DNS 进行解析。
forward
插件的文档可在此处获得:https://coredns.io/plugins/forward/
我目前正在设置一个 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.local
或 frontend.middleware.backend.mycompany.local
的所有请求都将转发到您的内部 DNS 进行解析。
forward
插件的文档可在此处获得:https://coredns.io/plugins/forward/