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

K8S内部DNS解析原理介绍

2024-08-29 09:42:10
63
0

一、K8sDNS策略

Defaultkubelet决定使用何种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:配置其他可选参数,例如ndotstimeout

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

 

二、K8s内域名解析流程

defaultpod为例,查看/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.10k8s集群内部的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 解析到这个虚拟的 ClusterIPA 记录或 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 09:42:10
63
0

一、K8sDNS策略

Defaultkubelet决定使用何种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:配置其他可选参数,例如ndotstimeout

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

 

二、K8s内域名解析流程

defaultpod为例,查看/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.10k8s集群内部的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 解析到这个虚拟的 ClusterIPA 记录或 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:对错误信息镜像日志记录
文章来自个人专栏
专栏文章
4 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0