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

K8S内部DNS解析原理介绍

2024-08-29 17:42:10
314
0

一、K8s的DNS策略

Default: 由kubelet决定使用何种DNS策略,通过–resolv-conf=/etc/resolv.conf 来配置DNS解析文件地址,默认使用宿主机的resolv.conf文件。

ClusterFirst:优先使用kubernetes环境的dns服务,将无法解析的域名转发到从宿主机继承的dns服务器

ClusterFirstWithHostNet:和ClusterFirst相同,对于以hostNetwork模式运行的Pod应显式配置使用该策略

None: 忽略kubernetes环境的dns配置,通过spec.dnsConfig自定义DNS配置

自定义Dns配置可以通过spec.dnsConfig字段进行设置,可以设置如下信息

  • nameservers:一组dns服务器的列表,最多可设置3个
  • searchs:一组用于域名搜索的dns域名后缀,最多6个
  • options:配置其他可选参数,例如ndots、timeout等

k8s默认使用的DNS策略是ClusterFirst,这点需要注意,也就是说域名解析会优先使用集群的DNS进行查询,如果k8s的DNS解析失败,会转发到宿主机的DNS进行解析。

 

二、K8s内域名解析流程

以default下pod为例,查看/etc/resolv.conf文件

nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local host.com
options ndots:5
  • nameserver 10.96.0.10是k8s集群内部的dns服务的ClusterIP,无法ping,但是可以访问。
  • options ndots:5 表示如果查询的域名包含的点"."不到5个,那么进行DNS查找将使用非完全限定名称(非绝对域名);如果查询的域名包含点数大于等于5,那么DNS查询默认使用绝对域名进行查询。
  • search default.svc.cluster.local svc.cluster.local cluster.local host.com

使用非绝对域名查找时,将域名依次带入search域进行查找,例如b.default.svc.cluster.local -> b.svc.cluster.local -> b.cluster.local

普通的 Service 拥有自己的 ClusterIP 地址,service name 会被 DNS 解析到这个虚拟的 ClusterIP(A 记录或 CNAME 记录),然后被 kubectl proxy 转发到具体的 Pod。

而 Headless Service 没有自己的 ClusterIP(这个值被指定成了 None),service name 只提供 SRV 记录的 DNS 解析,返回一个 Pods 的 ip/dns 列表。

三、coredns配置解析

.:53 {
    log
    errors
    health {
       lameduck 5s
    }
    ready
    kubernetes cluster.local in-addr.arpa ip6.arpa {
       pods insecure
       fallthrough in-addr.arpa ip6.arpa
       ttl 30
    }
    prometheus :9153
    forward . /etc/resolv.conf
    cache 30
    loop
    reload
    loadbalance
}

coredns的主要功能是通过插件系统实现的。它实现了一种链式插件的结构,将dns的逻辑抽象成了一个个插件。常见的插件如下:

  • loadbalance:提供基于dns的负载均衡功能
  • loop:检测在dns解析过程中出现的简单循环问题
  • cache:提供前端缓存功能
  • health:对Endpoint进行健康检查
  • kubernetes:从kubernetes中读取zone数据
  • etcd:从etcd读取zone数据,可以用于自定义域名记录
  • file:从文件中读取zone数据
  • hosts:使用/etc/hosts文件或者其他文件读取zone数据,可以用于自定义域名记录
  • auto:从磁盘中自动加载区域文件
  • reload:定时自动重新加载Corefile配置文件的内容
  • forward:转发域名查询到上游dns服务器
  • proxy:转发特定的域名查询到多个其他dns服务器,同时提供到多个dns服务器的负载均衡功能
  • prometheus:为prometheus系统提供采集性能指标数据的URL
  • pprof:在URL路径/debug/pprof下提供运行是的西能数据
  • log:对dns查询进行日志记录
  • errors:对错误信息镜像日志记录
0条评论
作者已关闭评论
l****n
4文章数
0粉丝数
l****n
4 文章 | 0 粉丝
l****n
4文章数
0粉丝数
l****n
4 文章 | 0 粉丝
原创

K8S内部DNS解析原理介绍

2024-08-29 17:42:10
314
0

一、K8s的DNS策略

Default: 由kubelet决定使用何种DNS策略,通过–resolv-conf=/etc/resolv.conf 来配置DNS解析文件地址,默认使用宿主机的resolv.conf文件。

ClusterFirst:优先使用kubernetes环境的dns服务,将无法解析的域名转发到从宿主机继承的dns服务器

ClusterFirstWithHostNet:和ClusterFirst相同,对于以hostNetwork模式运行的Pod应显式配置使用该策略

None: 忽略kubernetes环境的dns配置,通过spec.dnsConfig自定义DNS配置

自定义Dns配置可以通过spec.dnsConfig字段进行设置,可以设置如下信息

  • nameservers:一组dns服务器的列表,最多可设置3个
  • searchs:一组用于域名搜索的dns域名后缀,最多6个
  • options:配置其他可选参数,例如ndots、timeout等

k8s默认使用的DNS策略是ClusterFirst,这点需要注意,也就是说域名解析会优先使用集群的DNS进行查询,如果k8s的DNS解析失败,会转发到宿主机的DNS进行解析。

 

二、K8s内域名解析流程

以default下pod为例,查看/etc/resolv.conf文件

nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local host.com
options ndots:5
  • nameserver 10.96.0.10是k8s集群内部的dns服务的ClusterIP,无法ping,但是可以访问。
  • options ndots:5 表示如果查询的域名包含的点"."不到5个,那么进行DNS查找将使用非完全限定名称(非绝对域名);如果查询的域名包含点数大于等于5,那么DNS查询默认使用绝对域名进行查询。
  • search default.svc.cluster.local svc.cluster.local cluster.local host.com

使用非绝对域名查找时,将域名依次带入search域进行查找,例如b.default.svc.cluster.local -> b.svc.cluster.local -> b.cluster.local

普通的 Service 拥有自己的 ClusterIP 地址,service name 会被 DNS 解析到这个虚拟的 ClusterIP(A 记录或 CNAME 记录),然后被 kubectl proxy 转发到具体的 Pod。

而 Headless Service 没有自己的 ClusterIP(这个值被指定成了 None),service name 只提供 SRV 记录的 DNS 解析,返回一个 Pods 的 ip/dns 列表。

三、coredns配置解析

.:53 {
    log
    errors
    health {
       lameduck 5s
    }
    ready
    kubernetes cluster.local in-addr.arpa ip6.arpa {
       pods insecure
       fallthrough in-addr.arpa ip6.arpa
       ttl 30
    }
    prometheus :9153
    forward . /etc/resolv.conf
    cache 30
    loop
    reload
    loadbalance
}

coredns的主要功能是通过插件系统实现的。它实现了一种链式插件的结构,将dns的逻辑抽象成了一个个插件。常见的插件如下:

  • loadbalance:提供基于dns的负载均衡功能
  • loop:检测在dns解析过程中出现的简单循环问题
  • cache:提供前端缓存功能
  • health:对Endpoint进行健康检查
  • kubernetes:从kubernetes中读取zone数据
  • etcd:从etcd读取zone数据,可以用于自定义域名记录
  • file:从文件中读取zone数据
  • hosts:使用/etc/hosts文件或者其他文件读取zone数据,可以用于自定义域名记录
  • auto:从磁盘中自动加载区域文件
  • reload:定时自动重新加载Corefile配置文件的内容
  • forward:转发域名查询到上游dns服务器
  • proxy:转发特定的域名查询到多个其他dns服务器,同时提供到多个dns服务器的负载均衡功能
  • prometheus:为prometheus系统提供采集性能指标数据的URL
  • pprof:在URL路径/debug/pprof下提供运行是的西能数据
  • log:对dns查询进行日志记录
  • errors:对错误信息镜像日志记录
文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0