searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

coredns kubernetes插件分析

2023-11-30 01:25:42
30
0

描述

此插件实现了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.arpaip6.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}

    qname := state.QName()
    zone := plugin.Zones(k.Zones).Matches(qname)
根据dns request中查询信息,查找匹配zone 域信息。后面switch则根据查询的类型,调用对应的处理函数进行处理。
 
比如:如果查询A记录,则调用plugin.A Api进行处理,返回处理后的records结果。
    m := new(dns.Msg) 
    m.SetReply(r) 
    m.Truncated = truncated
    m.Authoritative = true
    m.Answer = append(m.Answer, records...)
    m.Extra = append(m.Extra, extra...)
    w.WriteMsg(m)
 
最后调用WriteMsg返回消息。
0条评论
作者已关闭评论
刘****飞
3文章数
1粉丝数
刘****飞
3 文章 | 1 粉丝
刘****飞
3文章数
1粉丝数
刘****飞
3 文章 | 1 粉丝
原创

coredns kubernetes插件分析

2023-11-30 01:25:42
30
0

描述

此插件实现了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.arpaip6.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}

    qname := state.QName()
    zone := plugin.Zones(k.Zones).Matches(qname)
根据dns request中查询信息,查找匹配zone 域信息。后面switch则根据查询的类型,调用对应的处理函数进行处理。
 
比如:如果查询A记录,则调用plugin.A Api进行处理,返回处理后的records结果。
    m := new(dns.Msg) 
    m.SetReply(r) 
    m.Truncated = truncated
    m.Authoritative = true
    m.Answer = append(m.Answer, records...)
    m.Extra = append(m.Extra, extra...)
    w.WriteMsg(m)
 
最后调用WriteMsg返回消息。
文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0