ZHDYA(七哥),9年互联网一线K8S从业者,专注分享K8S生态为主的实战经验,助力大家更高效、可靠地构建和管理容器!
最近更新:K8S架构、公有云、持久化存储、HELM、CICD、负载均衡、监控告警、可观察性、服务治理、架构探索等文章。
01 为什么需要集群 DNS
在 Kubernetes 中,DNS 配置对于服务发现和服务间通信比较重要。Kubernetes 提供了一种内置的 DNS 服务,这个服务自动为每个服务创建 DNS 记录,这样集群内的服务可以通过名称相互访问。
以下是对 Kubernetes DNS 配置文件 /etc/resolv.conf
中几个关键选项的详细解释:
# cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5
1. nameserver 10.96.0.10
这是指向 Kubernetes 集群 DNS 服务的 IP 地址。默认情况下,Kubernetes 会在集群网络的一个特定 IP 地址上运行 DNS 服务,这个地址通常是 10.96.0.10
。Pod 可以通过这个地址查询集群内外的服务名。
2. search default.svc.cluster.local svc.cluster.local cluster.local
这些是 DNS 搜索域。当 Pod 尝试解析一个未完全限定的域名(FQDN)时,Kubernetes 会自动追加这些搜索域,以帮助找到正确的服务。
例如,如果一个 Pod 尝试访问名为 web
的服务,DNS 查询可能会尝试以下几种形式:
web.default.svc.cluster.local
web.svc.cluster.local
web.cluster.local
这种机制简化了服务间的调用,因为 Pod 只需知道服务的短名称,而不需要完整的域名。
3. options ndots:5
ndots
参数定义了在进行 DNS 查询前,域名中需要包含的点数(即子域名的数量)。如果一个域名中包含的点数大于或等于 ndots
的值,那么 DNS 解析器将直接对该域名进行解析,而不添加搜索域。这个设置有助于 避免不必要的 DNS 查找延迟,并且可以更好地控制 DNS 解析行为。
02 /etc/resolv.conf 文件的由来和作用
/etc/resolv.conf
是一个用于配置主机 DNS 设置的文本文件,常见于 Unix 和类 Unix 系统(如 Linux)。该文件主要用于指定 DNS 服务器的 IP 地址和 DNS 搜索路径。当应用程序需要解析域名时,系统会读取此文件中的配置信息,确定如何进行 DNS 查询。
在 Kubernetes 中,每个 Pod 都有一个独立的网络命名空间,这意味着每个 Pod 都有自己的 /etc/resolv.conf
文件。Kubernetes 会根据集群的 DNS 配置自动更新这些文件,以确保 Pod 可以正确地解析集群内外的服务名。
03 dnsPolicy 与 Pod DNS 策略
Kubernetes 允许通过 dnsPolicy 字段来指定 Pod 的 DNS 策略。dnsPolicy 可以设置为以下几种值:
Default:Pod 继承其所在节点的 DNS 配置。这意味着 Pod 的 /etc/resolv.conf
文件将与宿主机相同。
ClusterFirst:这是最常见的设置。Pod 使用 Kubernetes 的 DNS 服务来解析域名,只有当无法解析时才会使用宿主机的 DNS 服务器。
ClusterFirstWithHostNet:类似于 ClusterFirst
,但适用于使用宿主机网络的 Pod。
None:Pod 忽略集群的 DNS 设置,而是使用自定义的 DNS 配置。这通常通过在 Pod 规范中设置 dnsConfig 字段来实现。
案例分享:
假设我们有一个 Pod 需要访问外部数据库服务,同时还需要访问集群内的其他服务。我们可以这样配置 Pod 的 YAML 文件:
apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
spec:
containers:
- name: my-app-container
image: my-app-image
dnsPolicy: ClusterFirstWithHostNet
dnsConfig:
nameservers:
- 10.96.0.10
- 114.114.114.114 # 中国 Public DNS
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
- example.com # 假设外部数据库位于 example.com 域下
options:
- name: ndots
value: "5"
在这个例子中,我设置了 dnsPolicy
为 ClusterFirstWithHostNet
,这是因为 Pod 使用了宿主机的网络栈。
我们还指定了两个 nameservers
,一个是集群内部的 DNS 服务,另一个是外部的公共 DNS 服务(如 国内的公共 DNS)。
通过这种方式,Pod 可以优先使用集群内的 DNS 服务解析集群内部的服务,同时也能有效地解析外部域名。
近期搞了个 K8S 技术陪伴群,主要就想把自己多年沉淀的 K8S 经验分享出来,入门收费,不过门槛特别低,感兴趣的小伙伴扫码私我~
●
●
●
●
●
●
●
●
●
●
●
● 😉【加群】扫码,备注:进群,云原生|K8S技术沟通
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...