十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Talos Linux ResolverConfig 配置指南:nameservers、searchDomains 与 hostDNS 全解析

Talos Linux ResolverConfig 配置指南:nameservers、searchDomains 与 hostDNS 全解析 云原生操作系统容器编排【免费下载链接】talosTalos Linux is a modern Linux distribution built for Kubernetes.项目地址https://gitcode.com/gh_mirrors/ta/talos点击查看免费下载本文基于 Talos Linuxv1.15 参考文档与源码系统讲解ResolverConfig这一配置文档config document的完整用法如何为节点与 Kubernetes Pod 配置 DNS 服务器支持 Do53 / DoT / DoH 三种协议、如何精细控制/etc/resolv.conf中的搜索域以及如何启用宿主机上的本地 DNS 缓存解析器hostDNS。读完本文你将能够编写一份可直接运行的 ResolverConfig 配置并理解其背后的校验逻辑、控制器实现与常见踩坑点。ResolverConfig是 Talos Linux 中用于配置 DNS 解析的独立配置文档config document属于网络配置文档家族位于 pkg/machinery/config/types/network。它取代了传统v1alpha1配置中分散在.machine.network与.machine.features.hostDNS下的 DNS 相关字段将三类能力统一收敛到一个kind: ResolverConfig文档中nameservers宿主机与集群 Pod 使用的上游 DNS 服务器列表支持明文 DNSDo53、DNS over TLSDoT与 DNS over HTTPSDoHsearchDomains写入/etc/resolv.conf的搜索域hostDNS宿主机本地 DNS 缓存解析器用于提升解析性能与可靠性。一、文档骨架一个 ResolverConfig 包含什么ResolverConfigV1Alpha1在 resolver.go 中定义apiVersion: v1alpha1、kind: ResolverConfig包含三个顶层字段字段类型说明nameservers[]NameserverConfig用于解析域名的 DNS 服务器列表。宿主机使用这些服务器解析域名同时它们也会被传播给 Kubernetes DNSCoreDNS供集群内 Pod 使用。该配置会覆盖 DHCP 或平台配置提供的 nameserver。默认配置使用1.1.1.1与8.8.8.8。searchDomainsSearchDomainsConfig搜索域配置写入/etc/resolv.conf。默认从主机名 FQDN 推导搜索域。hostDNSHostDNSConfig宿主机 DNS 解析器配置。在宿主机上部署本地 DNS 缓存解析器提升解析性能与可靠性。注意Talos 默认未配置任何 nameserver 时使用 constants.go 中定义的1.1.1.1DefaultPrimaryResolver与8.8.8.8DefaultSecondaryResolver两个上游服务器。文档注册与版本ResolverConfig通过 registry.Register 注册到配置文档注册表当前仅支持v1alpha1版本。同时它实现了config.NetworkResolverConfig、config.NetworkHostDNSConfig、config.Validator与container.V1Alpha1ConflictValidator四个接口见 resolver.go这意味着它既是合法的配置文档又在加载时会执行冲突校验与合法性校验。二、nameservers配置上游 DNS 服务器nameservers是配置文档中最核心的字段。每个条目是一个NameserverConfig包含三个子字段字段类型说明addressAddrIP 地址字符串nameserver 的 IP 地址格式形如10.0.0.1支持 IPv4 与 IPv6如ff08::1。protocolDNSProtocol枚举DNS 协议取值Do53、DoT、DoH。默认Do53。tlsServerNamestringTLS 服务器名称用于校验 nameserver 证书当protocol为DoT/DoH时必须设置。DNSProtocol枚举定义于 dnsprotocol.goDo53默认DNS over TCP/UDP、DoTDNS over TLS、DoHDNS over HTTP。2.1 基础示例IPv4 IPv6 混合apiVersion: v1alpha1 kind: ResolverConfig # A list of nameservers (DNS servers) to use for resolving domain names. nameservers: - address: 1.1.1.1 # The IP address of the nameserver. # # TLS server name to validate the nameserver certificate against. # tlsServerName: dns1.example.com - address: ff08::1 # The IP address of the nameserver. # # TLS server name to validate the nameserver certificate against. # tlsServerName: dns1.example.com未指定protocol时默认使用Do53明文 DNS。tlsServerName仅在 DoT/DoH 场景下有意义此时保持注释状态即可。2.2 加密 DNSDoTDNS over TLSDoT遵循 RFC 7858使用 TCP 853 端口建立 TLS 加密连接apiVersion: v1alpha1 kind: ResolverConfig # A list of nameservers (DNS servers) to use for resolving domain names. nameservers: - address: 9.9.9.9 # The IP address of the nameserver. protocol: DoT # A DNS protocol to use. tlsServerName: dns.quad9.net # TLS server name to validate the nameserver certificate against. - address: 2620:fe::fe # The IP address of the nameserver. protocol: DoT # A DNS protocol to use. tlsServerName: dns.quad9.net # TLS server name to validate the nameserver certificate against.2.3 加密 DNSDoHDNS over HTTPSDoH遵循 RFC 8484使用 TCP 443 端口、以/dns-query为 URL 路径发起 HTTPS 查询apiVersion: v1alpha1 kind: ResolverConfig # A list of nameservers (DNS servers) to use for resolving domain names. nameservers: - address: 1.1.1.1 # The IP address of the nameserver. protocol: DoH # A DNS protocol to use. tlsServerName: cloudflare-dns.com # TLS server name to validate the nameserver certificate against. - address: 2606:4700:4700::1111 # The IP address of the nameserver. protocol: DoH # A DNS protocol to use. tlsServerName: cloudflare-dns.com # TLS server name to validate the nameserver certificate against.2.4 tlsServerName 的三种用途根据 resolver.go 中的描述tlsServerName在 DoT/DoH 场景下承担三重职责TLS 握手期间发送的SNIServer Name Indication与服务器证书进行比对的证书校验名称对 DoH 而言它还是请求 URL 的主机部分https://tlsServerName/dns-query而网络连接本身建立到配置的address。也就是说即使你的 DoH 服务器 IP 是1.1.1.1请求的 Host 头与 SNI 都会是cloudflare-dns.com连接目的地则是1.1.1.1:443。2.5 校验规则合法组合与常见错误Validate()方法resolver.go会逐条校验 nameserver 配置配合 resolver_test.go 中的测试用例规则如下DoT/DoH 必须设置tlsServerName否则报错tlsServerName must be set when protocol is DoT/DoH: entry NDo53 不允许设置tlsServerName否则报错tlsServerName must be empty when protocol is Do53: entry Naddress必须是合法 IP否则报错nameserver address must be a valid IP: entry N不支持的协议值直接报错unsupported DNS protocol: entry N。2.6 重要警告全加密 DNS 与系统时钟的循环依赖这是文档中特别强调的坑DoT 与 DoH 都需要正确的系统时钟来校验证书。如果你的 NTP 服务器是以主机名配置的而这些主机名又需要通过 DoT/DoH 解析那么启动过程可能卡死——NTP 需要 DNS 才能解析服务器而 TLS 需要有效的时间才能校验证书形成循环依赖。Validate()会在所有 nameserver 都使用加密协议时输出警告resolver.goall configured nameservers use encrypted DNS (DoT or DoH): validating certificates requires a correct system clock, so boot may stall when NTP servers are configured by hostname; consider keeping at least one plain-DNS fallback or configuring NTP servers by IP address应对方案有三种文档原文给出的建议依赖硬件时钟RTC将 NTP 服务器配置为 IP 而非主机名至少保留一个明文 DNSDo53作为兜底 nameserver。测试 resolver_test.go 验证了DoT 混合明文 DNS 不告警、纯 DoT 告警的行为边界。三、searchDomains控制 /etc/resolv.conf 搜索域searchDomains用于配置 DNS 解析时的搜索域对应写入/etc/resolv.conf。它包含两个字段字段类型说明domainsSearchDomainList字符串数组用于 DNS 解析的搜索域列表。解析非限定域名时系统会依次尝试追加这些后缀。disableDefaultbool禁用从主机名 FQDN 推导默认搜索域。设为true后系统不再从主机名 FQDN 推导搜索域便于完全自定义。3.1 搜索域的工作机制搜索域在解析非限定域名unqualified domain names时被追加到域名末尾。例如配置了搜索域example.com当用户尝试解析host时系统会先尝试host.example.com。3.2 基础示例自定义搜索域apiVersion: v1alpha1 kind: ResolverConfig # Configuration for search domains (in /etc/resolv.conf). searchDomains: # A list of search domains to be used for DNS resolution. domains: - example.com3.3 覆盖语义设置 / 清空 / 继承 三态domains字段是三态的这是它最容易用错的地方理解 resolver.go 与 network.go 的接口注释至关重要设置非空列表如domains: [example.com]覆盖 DHCP 或平台配置获得的搜索域设置空列表domains: []清空从 DHCP 或平台获得的搜索域完全不设置该字段未出现继承DHCP 或平台提供的搜索域。这一语义通过SearchDomainList自定义类型保证IsZero()只把nil列表视为零值resolver.go因此显式的空列表[]不会被omitempty丢弃。相关测试 resolver_test.go 验证了空列表的序列化、反序列化与解析行为TestResolverConfigMergeSearchDomains 则验证了合并语义domains: []会替换而非追加已有列表。默认情况下搜索域从主机名 FQDN 推导。也就是说如果主机名是node1.cluster.local默认搜索域即为cluster.local。3.4 禁用默认搜索域如果不想从主机名 FQDN 推导默认搜索域使用disableDefault: trueapiVersion: v1alpha1 kind: ResolverConfig # Configuration for search domains (in /etc/resolv.conf). searchDomains: disableDefault: true # Disable default search domain configuration from hostname FQDN.该配置的默认行为从 FQDN 推导搜索域在 resolver_config.go 的getDefault中实现当主机名状态中存在域名时将hostnameStatus.Domainname作为默认搜索域写入 spec当disableDefault为真、或主机名无域名时则不注入搜索域。四、hostDNS宿主机本地 DNS 缓存解析器hostDNS在宿主机上部署一个本地 DNS 缓存解析器监听127.0.0.53:53见 hostdns_config.go用于提升 DNS 解析性能与可靠性。它包含三个字段字段类型说明enabledbool启用宿主机 DNS 缓存解析器。启用后本地缓存解析器的上游 DNS 服务器由本配置文档的nameservers字段决定。forwardKubeDNSToHostbool让 Kubernetes CoreDNS Pod 以宿主机 DNS 服务器为上游而不是直接使用配置的上游解析器。resolveMemberNamesbool使用宿主机 DNS 解析器解析集群成员主机名与节点名称。需要启用 service discovery。4.1 启用示例apiVersion: v1alpha1 kind: ResolverConfig # Configuration for host DNS resolver. hostDNS: enabled: true # Enable host DNS caching resolver. forwardKubeDNSToHost: true # Use the host DNS resolver as upstream for Kubernetes CoreDNS pods. resolveMemberNames: true # Resolve member hostnames using the host DNS resolver.4.2 forwardKubeDNSToHost 的底层机制当forwardKubeDNSToHost启用时控制器会根据集群的 Pod CIDR 计算出额外的监听地址并绑定到 loopback 接口hostdns_config.go若 Pod CIDR 含 IPv4 网段则额外监听169.254.116.108:53constants.HostDNSAddress见 constants.go若 Pod CIDR 含 IPv6 网段则额外监听fd54:616c:6f73::204f:5320:444e:531:53HostDNSAddressV6。这些地址会被安装到lo接口上作为永久地址CoreDNS 通过它们访问宿主机解析器从而让集群内 Pod 的 DNS 查询也享受到本地缓存。4.3 resolveMemberNames 与 service discoveryresolveMemberNames让宿主机 DNS 解析器承担集群成员主机名与节点名称的解析任务前提是 service discovery服务发现已启用。从源码注释与控制器实现看该选项依赖 Talos 的集群发现机制来填充成员名称到地址的映射。4.4 交叉校验hostDNS 子字段的依赖关系Validate()对 hostDNS 做了严格的依赖校验resolver.goforwardKubeDNSToHost: true而enabled: false→ 报错hostDNS.forwardKubeDNSToHost cannot be enabled when hostDNS.enabled is falseresolveMemberNames: true而enabled: false→ 报错hostDNS.resolveMemberNames cannot be enabled when hostDNS.enabled is false。对应测试见 resolver_test.go。五、与旧版 v1alpha1 配置的冲突检测在引入独立配置文档之前DNS 相关配置散落在传统 v1alpha1 配置中.machine.network.nameservers、.machine.network.searchDomains、.machine.network.disableSearchDomain以及.machine.features.hostDNS。由于新旧两套机制会同时作用于节点ResolverConfig实现了V1Alpha1ConflictValidator在配置加载时检测并拒绝冲突resolver.go新文档ResolverConfig旧 v1alpha1 字段冲突提示nameservers.machine.network.nameservers.machine.network.nameservers is already set in v1alpha1 configsearchDomains.domains.machine.network.searchDomains.machine.network.searchDomains is already set in v1alpha1 configsearchDomains.disableDefault.machine.network.disableSearchDomain.machine.network.disableSearchDomain is already set in v1alpha1 confighostDNS.machine.features.hostDNS.machine.features.hostDNS is already set in v1alpha1 config换句话说同一节点上同一个 DNS 维度只能选择旧 v1alpha1 字段或新的 ResolverConfig 文档之一不能同时配置。完整的冲突测试矩阵见 resolver_test.go。六、配置如何生效控制器调用链理解ResolverConfig从 YAML 到系统行为的完整路径有助于排查问题。关键环节如下文档解析ResolverConfig作为独立配置文档通过registry.Register注册由配置加载器解析为ResolverConfigV1Alpha1冲突与合法性校验加载时执行V1Alpha1ConflictValidate与Validate上述第五、二、四节规则ResolverConfigController 生成 ResolverSpecresolver_config.go 按优先级默认 → 内核 cmdline → 机器配置生成network.ResolverSpec。其中parseMachineConfigurationresolver_config.go读取NetworkResolverConfig()将nameservers与searchDomains映射为 spec并标记搜索域是否被显式覆盖ResolverMergeController 合并各层将默认、cmdline、DHCP、平台、机器配置等各层 resolver spec 合并为最终生效的解析器配置见 resolver_merge.goEtcFileController 写 /etc/resolv.confetcfile.go 将合并结果渲染到/etc/resolv.confHostDNSConfigController 部署本地解析器当hostDNS.enabled时hostdns_config.go 写入network.HostDNSConfig资源含监听地址、上游地址等并安装 loopback 服务地址宿主机本地解析器启动后即按此配置工作CoreDNS 集成forwardKubeDNSToHost开启时Kubelet/CoreDNS 侧见 kubelet_spec.go将上游指向宿主机解析器的服务地址。分层优先级从控制器实现可以推断最终生效的 DNS 配置是多来源分层合并的结果优先级大致为机器配置ResolverConfig 内核 cmdlinetalos.network.interface.*.dns等参数 DHCP / 平台配置 内置默认值1.1.1.1/8.8.8.8。这正是文档中此配置会覆盖 DHCP 或平台配置提供的 nameserver的实现基础。七、完整实战示例7.1 完整组合示例源自仓库测试数据仓库测试数据 resolverconfig.yaml 给出了一个混合配置的完整示例含 DoT 服务器apiVersion: v1alpha1 kind: ResolverConfig nameservers: - address: 10.0.0.1 - address: 2001:4860:4860::8888 protocol: DoT tlsServerName: dns.google searchDomains: domains: - example.org - example.com disableDefault: false7.2 hostDNS 组合示例源自仓库测试数据resolverconfig_with_hostdns.yaml 展示了 hostDNS 与 nameserver 的组合apiVersion: v1alpha1 kind: ResolverConfig nameservers: - address: 10.0.0.1 hostDNS: enabled: true forwardKubeDNSToHost: true resolveMemberNames: false7.3 配置应用方式ResolverConfig作为独立配置文档与应用其他 Talos 配置文档的方式一致均可通过talosctl apply-config、talosctl patch等工具注入到节点例如talosctl apply-config -n node-ip -f resolverconfig.yaml配置文件与文档校验失败时如 DoT 缺少tlsServerName、hostDNS 依赖冲突、与旧 v1alpha1 字段冲突talosctl validate与apply-config会直接报错便于在应用前发现问题。八、参考资源配置文档说明website/content/v1.15/reference/configuration/network/resolverconfig.md文档定义与校验实现pkg/machinery/config/types/network/resolver.go配置接口定义pkg/machinery/config/config/network.go、pkg/machinery/config/config/network.go协议枚举pkg/machinery/nethelpers/dnsprotocol.go单元测试pkg/machinery/config/types/network/resolver_test.go测试数据resolverconfig.yaml、resolverconfig_with_hostdns.yaml运行时控制器resolver_config.go、hostdns_config.go、resolver_merge.go、etcfile.go默认 DNS 服务器常量pkg/machinery/constants/constants.go赞分享云原生操作系统容器编排【免费下载链接】talosTalos Linux is a modern Linux distribution built for Kubernetes.项目地址https://gitcode.com/gh_mirrors/ta/talos点击查看免费下载相关推荐Talos Linux 的 KubeTalosAPIAccessConfig 配置指南让 Kubernetes Pod 通过 ServiceAccount 安全访问 Talos APITalos Linux 的 KubeTalosAPIAccessConfig 配置指南让 Kubernetes Pod 通过 ServiceAccount 安云原生操作系统容器编排Talos Linux 网络配置指南DHCPv4Config 文档详解Talos Linux 网络配置指南DHCPv4Config 文档详解 DHCPv4Config 是 Talos Linux 中用于在指定网络链路上配置 DH云原生操作系统容器编排Talos Linux 网络 Bond 配置指南BondConfig 文档全参数解析与源码验证Talos Linux 网络 Bond 配置指南BondConfig 文档全参数解析与源码验证 BondConfig 是 Talos Linux面向 Kub云原生操作系统容器编排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表