描述
此插件实现了Kubernetes基于DNS的服务发现规范。
运行kubernetes插件的CoreDNS可用于替代kubernetes集群中的kube-dns。有关如何在Kubernetes中部署CoreDNS的详细信息,请参阅部署存储库。
stubDomains和upstreamNameservers通过前向插件实现。请参阅下面的示例。
此插件每个服务器块只能使用一次。
句法
kubernetes [ZONES...]
如果只指定插件,kubernetes插件将默认为服务器块中指定的区域。它将处理该区域中的所有查询,并连接到集群中的Kubernetes。它不会为服务提供PTR记录或为pods提供A记录。如果使用ZONES,它会指定插件应该具有权威性的所有区域。
kubernetes [ZONES...] {
endpoint URL
tls CERT KEY CACERT
kubeconfig KUBECONFIG [CONTEXT]
namespaces NAMESPACE...
labels EXPRESSION
pods POD-MODE
endpoint_pod_names
ttl TTL
noendpoints
fallthrough [ZONES...]
ignore empty_service
}
-
endpoint
指定远程k8s API端点的URL。如果省略,它将使用集群服务帐户连接到集群中的k8s。 -
tls
CERT KEY CACERT是远程k8s连接的TLS证书、密钥和CA证书文件名。如果集群内连接(即未指定端点),则忽略此选项。 -
kubeconfig
KUBECONFIG [CONTEXT]使用kubeconfig文件验证与远程k8s集群的连接。[CONTEXT]是可选的,如果没有设置,则将使用kubeconfig中指定的当前上下文。它支持TLS、用户名和密码或基于令牌的身份验证。如果集群内连接(即未指定端点),则忽略此选项。 -
namespaces
NAMESPACE [NAMESPACE...]仅公开列出的k8s命名空间。如果省略此选项,所有命名空间都会暴露 -
namespace_labels
EXPRESSION仅公开与此标签选择器匹配的Kubernetes命名空间的记录。标签选择器语法在Kubernetes用户指南-标签中描述。一个只公开标记为“istio-injection=enabled”的命名空间的例子将使用:labels istio-injection=enabled
。 -
labels
EXPRESSION only exposes the records for Kubernetes objects that match this label selector. The label selector syntax is described in the Kubernetes User Guide - Labels. An example that only exposes objects labeled as “application=nginx” in the “staging” or “qa” environments, would use:labels environment in (staging, qa),application=nginx
. -
pods
POD-MODE设置了处理基于IP的pod A记录的模式,例如1-2-3-4.ns.pod.cluster.local. in A 1.2.3.4
。提供此选项是为了方便在直接连接到pod时使用SSL证书。POD-MODE的有效值:disabled
:默认。不要处理pod请求,总是返回NXDOMAIN
insecure
:始终从请求中返回带有IP的A记录(无需检查k8s)。如果与通配符SSL证书恶意使用,此选项很容易被滥用。此选项是为了与kube-dns向后兼容而提供的。verified
:如果同一命名空间中存在具有匹配IP的pod,则返回A记录。与不安全模式下相比,此选项需要更多的内存,因为它将在所有pod上维护手表。
-
endpoint_pod_names
使用端点目标pod的pod名称作为A记录中的端点名称,例如,endpoint-name.my-service.namespace.svc.cluster.local. in A 1.2.3.4
默认情况下,端点名称选择如下:使用端点的主机名,如果没有设置主机名,则使用端点IP地址的虚线形式(例如1-2-3-4.my-service.namespace.svc.cluster.local.
)。如果包含此指令,则端点的名称选择更改如下:使用端点的主机名,或者如果没有设置主机名,请使用端点目标pod的pod名称。如果没有端点的目标pod或pod名称超过63,请使用虚线IP地址表单。 -
ttl
允许您为响应设置自定义TTL。默认值为5秒。允许的最小TTL为0秒,最大上限为3600秒。将TTL设置为0将防止记录被缓存。 -
noendpoints
通过禁用端点上的监视来关闭端点记录的服务。所有端点查询和无头服务查询都将导致NXDOMAIN。 -
fallthrough
[区域...]如果对插件具有权威的区域中的记录的查询导致NXDOMAIN,通常这就是响应。但是,如果您指定此选项,查询将转嫁到插件链上,其中可能包括另一个处理查询的插件。如果省略[区域...],则插件具有权威性的所有区域都会发生跌漏。如果列出了特定区域(例如in-addr.arpa
和ip6.arpa
),那么只有对这些区域的查询才会被误导。 -
ignore empty_service
为没有任何现成端点地址(例如,现成的pod)的服务返回NXDOMAIN。这允许查询pod继续在搜索路径中搜索服务。例如,搜索路径可以包括另一个Kubernetes集群。
启用区域传输是通过使用传输插件完成的。
启动
当CoreDNS启用kubernetes插件时,它将延迟DNS服务长达5秒,直到它可以连接到Kubernetes API并同步所有对象监视。如果这无法在5秒内发生,那么CoreDNS将开始提供DNS,而kubernetes插件将继续尝试连接和同步所有对象监视。CoreDNS将回答SERVFAIL对尚未同步的Kubernetes记录的任何请求。
源码分析
初始化
插件在加载时,会注册kubernetes插件。
提供服务的函数ServeDNS:plugin/kubernetes/handler.go
函数本身的业务逻辑比较简单:
state := request.Request{W: w, Req: r}