我目前正在建立一个运行私有和公共服务的Kubernetes集群。虽然公共服务应该通过互联网(和FQDN(访问,但私人服务不应该(其想法是在集群内运行VPN,其中私人服务应该通过简单FQDN访问(。
目前,我正在使用nginxingress并配置ingress资源,在那里我设置了公共资源的主机名。外部dns然后添加相应的dns记录(在GoogleCloudDNS中(-这已经起作用了。
我现在面临的问题是:我不确定如何以相同的方式添加DNS记录(即,简单地在Ingress
定义中指定主机并使用一些入口类private
(,但这些DNS记录只能从集群中访问。
我的印象是,我可以将这些记录添加到CoreDNS正在使用的Corefile
中。然而,我不知道如何实现自动化。
谢谢你的帮助!
如果您不希望它们被公开访问,则不希望为它们添加入口规则。Ingress只是将外部流量路由到您的集群中。
您的所有服务都已在CoreDNS中注册,并可使用其本地名称访问,无需添加任何其他内容。
我自己设法解决了这个问题。。。编写了一个小Go应用程序,它监视Ingress
资源,并相应地将rewrite
规则添加到CoreDNS读取的Corefile
中。。。就像一个符咒:(
附言:如果有人想使用这个工具,请告诉我。如果有任何需求,我很乐意将其开源。
Kubernetes有内置的DNS,每个服务都接收内部fqdn。除非,否则无法从外部获得这些服务
- 服务类型为"LoadBalancer">
- 您为该服务定义了ingress(假设您已经部署了像nginx这样的ingress控制器(
因此,部署在"default"命名空间中的示例服务可以在集群内通过service1.default.svc.cluster.local
您可以通过指定自定义ExternalName 来更改名称
apiVersion: v1
kind: Service
metadata:
name: service1
namespace: prod
spec:
type: ExternalName
externalName: service1.database.example.com
请注意,没有进行代理,您需要确保给定的新名称可以从集群内路由(允许出站连接等(
由于您的k8s集群是用gcloud托管的,您可以尝试使用Cloud DNS
。在那里,您可以添加一个带有DNS名称的private zone
。
然后你可以在你的vpn配置中将这个dns服务器推送到你的客户端:
push "dhcp-option DOMAIN gitlab.internal.example.com"
push "dhcp-option DNS 169.254.169.254"
169.254.169.254
是谷歌的dns,只能从谷歌专用网络内部访问
如果您有一个可以解析FQDN的内部DNS服务器,那么您可以配置核心文件将内部服务域解析转发到该DNS服务器。
例如,如果内部域/FDND是*.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/