ARTICLE DETAIL

资讯详情

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

rkt 容器的 DNS 配置指南:`/etc/resolv.conf` 与 `/etc/hosts` 的生成、优先级与实战

rkt 容器的 DNS 配置指南:`/etc/resolv.conf` 与 `/etc/hosts` 的生成、优先级与实战 容器运行时云原生网络【免费下载链接】rkt[Project ended] rkt is a pod-native container engine for Linux. It is composable, secure, and built on standards.项目地址https://gitcode.com/gh_mirrors/rk/rkt点击查看免费下载rkt 是一款 pod 原生的 Linux 容器引擎它能在启动时自动为 pod 内所有应用生成或注入/etc/resolv.conf与/etc/hosts从而让容器内的名称解析开箱即用。本指南以 Documentation/networking/dns.md 为主体结合仓库源码完整讲解--dns、--dns-domain、--dns-opt、--dns-search、--hosts-entry五个参数的使用方式、两个magic值host/none的行为、多组件间的优先级规则并给出可复现的命令示例。阅读完本文你将能够为 rkt pod 精确控制其 DNS 解析行为。概述rkt 如何为 pod 提供名称解析rkt 可以为 pod 内的应用自动准备两份关键文件/etc/resolv.conf决定应用通过哪个 DNS 服务器、以何种搜索域和选项解析域名/etc/hosts决定应用如何通过静态主机名映射解析地址。这两份文件既可以在运行时动态生成也可以直接复用宿主机的配置。生成策略完全由rkt run以及rkt prepare、rkt run-prepared、rkt app sandbox等命令的若干命令行参数决定。在源码层面rkt 的 DNS 处理被划分为两个阶段stagestage0宿主机侧解析用户传入的 DNS 参数生成etc/rkt-resolv.conf与etc/rkt-hosts到 stage1 rootfs。相关代码见 stage0/run.go 中的writeResolvConf与writeEtcHostsstage1pod 内部stage1 的 init 根据 stage0 传入的--dns-conf-moderesolv...,hosts...决定最终行为——是 bind-mount 宿主机的文件、使用 rkt 生成的 pod 级文件还是使用镜像自带的文件。相关代码见 stage1/init/init.go。这一两阶段协作的架构正是 rkt DNS 特性能够同时兼顾灵活性逐 pod 定制与一致性默认回退链的底层原因。/etc/resolv.conf的配置四个参数控制/etc/resolv.conf的生成方式参数说明--dns指定 DNS 服务器 IP或使用magic值host/none--dns-domain写入 resolv.conf 的domain参数--dns-opt一个或多个 resolv.conf 的option参数--dns-search一个或多个 search list 域--dns与--dns-opt、--dns-search均为可重复传递的参数flagStringList定义见 rkt/run.go 与 rkt/app_sandbox.go。最简单的配置$ sudo rkt run --dns8.8.8.8 pod.aci完整配置示例$ sudo rkt run \ --dns8.8.8.8 --dns4.2.2.2 \ --dns-domainexample.org \ --dns-optdebug --dns-optrotate \ --dns-searchexample.com --dns-searchexample.gov \ pod.acirkt 会为应用生成如下的/etc/resolv.conf# Generated by rkt run search example.com example.gov nameserver 8.8.8.8 nameserver 4.2.2.2 options debug rotate domain example.org注意该文件头部的注释# Generated by rkt run——它由 common/resolv_conf.go 的MakeResolvConf函数写入该函数负责把 DNS 配置按标准格式序列化为文本。字段的排列顺序固定为注释 →search→nameserver按传递顺序→options→domain。Magic 参数--dns支持两个特殊值hosthost会将宿主机的/etc/resolv.conf只读 bind-mount进应用容器。其实现位于 stage1/init/common/dns_config.go 的UseHostResolv先把宿主机/etc/resolv.conf挂载到 stage1 的etc/rkt-resolv.confstage1 init 在 stage1/init/init.go 中调用再由prepare-app把该文件逐应用挂载进各 stage2 的/etc/resolv.conf。由于整个挂载链是只读的pod 内应用无法修改该文件。nonenone会忽略任何来自 CNI 插件的 DNS 配置确保镜像自身的/etc/resolv.conf优先。这是满足我的镜像自带 DNS 配置不希望被网络插件覆盖这类需求的入口。优先级Precedence/etc/resolv.conf可能由多个组件生成rkt 按照以下优先级决定最终采用哪一个--dns等参数显式传给rkt runCNI 插件返回的 DNS 信息除非传入--dnsnone卷挂载在/etc/resolv.conf上应用镜像自带的/etc/resolv.conf。这张流程图完整呈现了上述判断链从rkt run ...开始先判断是否显式传入--dns等参数--dnsnone除外是则直接生成 pod 级resolv.conf否则判断是否有 CNI 插件返回 DNS此时若未传--dnsnone也生成 pod 级文件最后逐应用判断镜像内是否自带resolv.conf是则使用镜像的否则不生成。在源码中这一优先级由 networking/podenv.go 的setupNets落实只有当 stage0 没有预先生成etc/rkt-resolv.conf即没有传--dns且网络插件返回了非空 DNS 配置、且没有传--dnsnone时才会用 CNI 插件返回的 DNS 生成该文件——第一个返回非空 DNS 的插件生效后续插件即使返回 DNS 也只会输出一条Warning: network %v plugin specified DNS configuration, but DNS already supplied警告。参数冲突校验rkt/run.go 的parseDNSFlags负责在参数解析期就拦截明显的错误组合包括--dnshost或--dnsnone只能单独出现不得与其他--dns值混用否则报错no other --dns options allowed when --dns... is passed--dns-opt/--dns-search/--dns-domain不能与--dnshost/--dnsnone一起使用否则报错Cannot call --dns-opt, --dns-search, or --dns-domain with --dns...传入的每个--dns值都会被net.ParseIP校验非法 IP 直接报错Invalid IP passed to --dns。/etc/hosts的配置rkt run提供一个参数、两种模式来控制/etc/hosts--hosts-entry IPHOST追加自定义的 IP 与主机名映射--hosts-entry host只读 bind-mount 宿主机的/etc/hosts到每个应用。使用宿主机/etc/hosts$ rkt run ... --hosts-entry host该模式下宿主机/etc/hosts会被只读挂载进每个应用实现与--dnshost类似的机制见 stage1/init/common/dns_config.go 的UseHostHosts。追加自定义条目$ rkt run ... --hosts-entry 198.51.100.0host1,198.51.100.1host2 --hosts-entry 198.51.100.0host3rkt 会先写入一组标准默认条目再追加请求的条目 the default entries 198.51.100.0 host1 host3 198.51.100.1 host2观察输出可以看到两个细节同一个 IP 可以出现在多个--hosts-entry中rkt 会把它们合并到同一行198.51.100.0 host1 host3不同的 IP 分行列出。这一合并逻辑在 stage1/init/common/dns_config.go 的AddHostsEntry中实现它逐行扫描现有 hosts 文件若某行首字段IP已存在则把新主机名追加到该行末尾若不存在则另起一行并以 Tab 分隔 IP 与主机名。仓库中还有对应的单元测试 stage1/init/common/dns_config_test.go。所谓标准默认条目来自 stage1 内置的 fallback 模板 stage1/net/rootfs/etc/hosts-fallback包含 localhost、IPv6 loopback、ip6-localnet、ip6-mcastprefix、ip6-allnodes、ip6-allrouters、ip6-allhosts等常规条目。writeEtcHosts会先读取该模板再追加--hosts-entry的内容见 stage0/run.go。参数校验parseDNSFlags对--hosts-entry同样做了防御性校验每条必须符合IPHOST格式否则报错Did not understand --hosts-entryIP 部分必须是合法 IPnet.ParseIP否则报错Invalid IP passed to --hosts-entry--hosts-entry host与任意自定义条目互斥否则报错cannot pass --hosts-entryhost with multiple hosts-entries。优先级/etc/hosts的生成优先级为--hosts-entry显式传给rkt run卷挂载在/etc/hosts上应用镜像自带的/etc/hosts否则创建 fallback stub/etc/hosts。在 stage1 init 中stage1/init/init.go可以看到三种模式的分支host调用UseHostHosts直接挂载宿主机文件default在hosts-fallback模板中追加 pod 主机名后作为各应用的/etc/hostsstage0rkt 已生成 pod 级rkt-hosts含默认条目与用户追加条目在其中追加 pod 主机名。无论哪种模式rkt 都会把 pod 自身的主机名默认形如rkt-$PODUUID追加进 hosts 文件确保容器内localhost与本机名解析正常。实战示例让 pod 成功解析域名下面的示例使用--nethost共享宿主机网络、--dns8.8.8.8指定公共 DNS并交互式运行ping来验证名称解析$ sudo rkt run --nethost --dns8.8.8.8 quay.io/coreos/alpine-sh --exec/bin/ping --interactive -- -c 1 coreos.com ... PING coreos.com (104.20.47.236): 56 data bytes 64 bytes from 104.20.47.236: seq0 ttl63 time5.421 ms --- coreos.com ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max 5.421/5.421/5.421 ms命令要点--nethostpod 直接使用宿主机的网络栈不会创建独立网络命名空间因此--dns的 nameserver 配置必须显式给出而不是依赖 CNI 网络返回--dns8.8.8.8把公共 DNS 服务器写入 pod 的/etc/resolv.conf--exec/bin/ping -- -c 1 coreos.com覆盖镜像默认 entrypoint直接执行一次ping coreos.com输出中的0% packet loss证明 pod 内的名称解析已成功把coreos.com解析为 IP 并完成通信。如果解析失败可以按优先级链条逐步排查先确认是否传入了--dns或--dns-search再检查 CNI 网络是否返回了 DNS 配置可用rkt status与 pod 内的cat /etc/resolv.conf复核最后确认是否存在卷挂载或镜像自带文件覆盖了 pod 级配置。小结rkt 通过--dns、--dns-domain、--dns-opt、--dns-search与--hosts-entry五个参数将 DNS 配置从镜像内固定文件提升为可按 pod 动态定制的能力并辅以host/none两个 magic 值衔接宿主机复用与镜像自带的边界场景。其两阶段stage0 生成 stage1 挂载/落盘实现、明确的参数冲突校验与文档化的优先级链保证了该特性在多组件协作用户参数、CNI 插件、卷挂载、镜像内容下行为可预期。若需进一步深入网络配置可继续阅读 Documentation/networking/overview.md 了解 rkt 的完整网络模型。赞分享容器运行时云原生网络【免费下载链接】rkt[Project ended] rkt is a pod-native container engine for Linux. It is composable, secure, and built on standards.项目地址https://gitcode.com/gh_mirrors/rk/rkt点击查看免费下载相关推荐rkt 应用环境完全指南App Container 规范下的 /etc/hosts、resolv.conf 与 journal 套接字rkt 应用环境完全指南App Container 规范下的 /etc/hosts、resolv.conf 与 journal 套接字 本文以 rkt 项目官容器运行时云原生网络Podman --dns-option 详解为容器自定义 /etc/resolv.conf 的 DNS 选项Podman dns option 详解为容器自定义 /etc/resolv.conf 的 DNS 选项 dns option 是 Podman 网络选项家族容器运行时云原生CLIPodman --dns 选项全解自定义容器 DNS 服务器、none 特殊值、/etc/resolv.conf 生成机制与 aardvark-dns 转发原理Podman dns 选项全解自定义容器 DNS 服务器、 none 特殊值、 /etc/resolv.conf 生成机制与 aardvark dns 转发原容器运行时云原生CLI上一篇3分钟上手企业级文档管理JeeSite CMS零代码解决方案下一篇Darklang错误上报异常监控与报告创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表