描述
此插件允许额外的区域来解析Kubernetes服务和无头服务的外部IP地址。仅当kubernetes插件也加载时,此插件才有用。
该插件使用外部区域来解析集群内的IP地址。它只处理A、AAAA、SRV和PTR记录的查询;为了使其成为适当的DNS区域,它处理该区域顶点的SOA和NS查询。
默认情况下,该区域的顶点将如下所示(假设使用的区域是example.org
):
example.org. 5 IN SOA ns1.dns.example.org. hostmaster.example.org. (
12345 ; serial
14400 ; refresh (4 hours)
3600 ; retry (1 hour)
604800 ; expire (1 week)
5 ; minimum (4 hours)
)
example.org 5 IN NS ns1.dns.example.org.
ns1.dns.example.org. 5 IN A ....
ns1.dns.example.org. 5 IN AAAA ....
请注意,我们使用dns
子域来满足DNS需求的记录(见顶点指令)。另请注意,SOA的序列号是静态的。名称服务器记录的IP地址是CoreDNS服务的IP地址。
k8s_external插件处理子域dns
和区域本身的顶点;所有其他查询都会解析到集群中的地址。
语法
k8s_external [ZONE...]
- ZONES区域k8s_external应该是权威的。
如果您想更改顶点域或为返回的记录使用不同的TTL,您可以使用此扩展语法。
k8s_external [ZONE...] {
apex APEX
ttl TTL
}
- APEX是用于顶点记录的名称(DNS标签);它默认为
dns
。 ttl
允许您为响应设置自定义TTL。默认值为5(秒)。
如果您想启用无头服务解决方案,您可以通过添加headless
选项来做到这一点。
k8s_external [ZONE...] {
headless
}
- 如果有设置了外部IP的无头服务,外部IP将被解决
如果查询的域不存在,您可以通过添加fallthrough
选项落入下一个插件。
k8s_external [ZONE...] {
fallthrough [ZONE...]
}
实例配置
使example.org
下的名称解析为集群内的DNS地址。
. {
kubernetes cluster.local
k8s_external example.org
}
使用上面的Corefile,以下服务将获得IP地址为192.168.200.123
的test.default.example.org
的A
记录。
apiVersion: v1
kind: Service
metadata:
name: test
namespace: default
spec:
clusterIP: None
externalIPs:
- 192.168.200.123
type: ClusterIP
k8s_external插件可以与传输插件结合使用,以启用区域传输。不支持通知。
. {
transfer example.org {
to *
}
kubernetes cluster.local
k8s_external example.org
}
使用fallthrough
选项,如果查询的域不存在,它将传递给与该区域匹配的下一个插件。
. { kubernetes cluster.local k8s_external example.org { fallthrough } forward . 8.8.8.8 }
源码分析
k8s-external插件提供服务的入口:
plugin/k8s_external/external.go
67~84是根据dns查询的domain name查找zone,k8s-external要求查询时使用FQDN全限定域名查询。zone是config配置时k8s-external指定的zone。
86行是调用externalFunc获取state.Name(dns查询时fqdn域名)对应的service。
externalFunc的初始化:在plugin初始化时,调用plugin的setup,初始化externalFunc为x.External
External函数位于:plugin/kubernetes/external.go,可以看出k8s_external插件依赖kubernetes插件,如果想配置使用k8s_external插件功能,coredns
必须配置加载kubernetes插件,才能正常运行
External函数主要做的事情是,根据查询的domain Name获取serviceKey,根据serviceKey,通过SvcIndex Api获取serviceKey对应的k8s service.
如果在配置k8s service时,使用loadbalancer service或者endpoint,或者创建service时,yml文件中指定externalIPs,都可以使用k8s_external插件获取到
external IP,实现通过coredns解析serivce对外的external IP信息。