问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Kubernetes 集群内 DNS 配置详解

创作时间:
作者:
@小白创作中心

Kubernetes 集群内 DNS 配置详解

引用
CSDN
1.
https://m.blog.csdn.net/weixin_39489487/article/details/142334872

在Kubernetes集群中,DNS配置是确保服务间通信的关键环节。本文将深入探讨Kubernetes集群内的DNS工作原理,帮助读者理解Pod的DNS配置文件是如何生成的,以及kubelet在其中扮演的角色。

DNS 简介

在互联网早期,随着连接设备数量的增加,IP 地址的管理与记忆变得越来越复杂。为了简化网络资源的访问,DNS(Domain Name System)应运而生。DNS的核心作用是将用户可读的域名(如 www.example.com)解析为对应的 IP 地址(如 93.184.215.34),从而使用户无需记忆复杂的数字串,便能轻松访问全球各地的网络资源。DNS是一种应用层协议,与HTTP(S)等协议同属OSI网络模型中的最高层。它依赖于client-server模型进行工作,客户端向DNS服务器发出查询请求,服务器返回对应的IP地址。传统的DNS通过UDP或TCP传输,随着互联网安全需求的提升,DNS over TLS、DNS over HTTPS (DoH)、DNS over QUIC等新协议也相继推出,以增强数据隐私和安全性。要实现DNS查询,客户端需要知道DNS服务器地址,而这些信息通常配置在客户端的/etc/resolv.conf文件中。这个文件记录了DNS服务器的IP地址以及查询时的附加选项。接下来我们会详细探讨Kubernetes集群内的/etc/resolv.conf文件和相关的kubelet配置。

K8S DNS 配置详解

在Kubernetes中,每个Pod都拥有一个由kubelet自动生成的/etc/resolv.conf文件,文件内容一般如下:

nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5  

其中:

  • nameserver:指定了DNS server的集群内IP地址,DNS server早期使用的是kube-dns,现在则基本是CoreDNS。如果nameserver设置了多个地址,则表示前一个地址无响应时依次向下一个地址发起DNS查询。

  • search:定义了DNS查询时的域名后缀补全顺序。

  • options ndots:5:这个选项规定域名中至少有5个.才会被认为是FQDN完全限定域名。如果查询的域名中点的数量不足,则会根据search补全后缀。例如,查询mysvc时,其会被补全为mysvc.default.svc.cluster.local.,最后真正请求的是补全后的域名。

/etc/resolv.conf文件是由kubelet在Pod启动时为每个Pod自动生成的。Kubelet的配置(早期通过命令行参数的形式,后面则调整为了配置文件)决定了Pod中/etc/resolv.conf的具体内容,具体关联如下:

  • --cluster-dns或clusterDNS:指定集群内DNS服务器的IP地址,映射到/etc/resolv.conf中的nameserver。

  • --cluster-domain或clusterDomain:用于配置集群的默认域名后缀(如cluster.local),映射到/etc/resolv.conf中的search。

  • options ndots:5这一项则在kubelet代码中写死了,参考kubelet源码。

补充说明:search default.svc.cluster.local ...是kubelet的默认规则,对应.svc.,namespace是pod所在的命名空间名称。

此外,Pod的DNS行为也受dnsPolicy和dnsConfig这两个配置的影响。dnsPolicy决定Pod使用哪种DNS策略。有以下四种取值:

  • Default:虽然名字叫default但并不是默认选型,此时pod的/etc/resolv.conf使用所在node节点的配置,而该配置又通过kubelet的配置项resolvConf指定。

  • ClusterFirst:默认选项,使用集群内的DNS server进行域名解析。

  • ClusterFirstWithHostNet:当pod使用hostNetwork时应该设置此项。

  • None:忽略此前DNS设置,具体配置完全由dnsConfig决定。

dnsConfig自定义pod的/etc/resolv.conf,例如:

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
- name: test
      image: nginx
  dnsPolicy: "None"
  dnsConfig: # 自定义 pod 的 /etc/resolv.conf
    nameservers:
- 192.0.2.1
    searches:
- ns1.svc.cluster-domain.example
- my.dns.search.suffix
    options:
- name: ndots
        value: "2"

总结

DNS是client-server请求-响应模型,日常所说的公网的DNS被称为global DNS,而像kubernetes集群内的DNS则是private DNS。在Kubernetes集群中,Pod的DNS设置由kubelet管理,所有的DNS查询首先由集群内的DNS服务器(通常是CoreDNS)处理。Pod的/etc/resolv.conf文件内容则由kubelet的配置以及Pod的dnsPolicy和dnsConfig设置决定。掌握这些配置项的含义与用法,对于在Kubernetes集群中进行DNS问题排查和优化至关重要。

参考资料:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号