K8s 1.25 的集群里,启动脚本往 /etc/hosts 追加了一条数据库解析,运行几分钟后那条记录就没了,应用开始报 Name or service not known,重启容器能好一阵又复发。

一开始怀疑是「dnsPolicy 是 ClusterFirst,/etc/hosts 里只保留集群内部的记录」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。kubelet 会周期性重写 Pod 的 /etc/hosts,手工追加的内容直接被覆盖。少数情况下是hostAliases 没写进 Pod 模板,改容器里的文件本来就不是持久做法。

还有一种情况,容器重启后文件系统回到镜像状态,之前的改动全部丢失。

先确认文件被重写的时间点

kubectl exec -it web-0 -- stat /etc/hosts && kubectl exec -it web-0 -- cat /etc/hosts

然后看 Pod 里有没有配 hostAliases

kubectl get pod web-0 -o yaml | grep -n -A6 hostAliases

接着在 Deployment 模板里补上别名

kubectl patch deploy web --type merge -p '{"spec":{"template":{"spec":{"hostAliases":[{"ip":"10.0.0.21","hostnames":["db.internal"]}]}}}}'

等前面都确认过,再确认新 Pod 的 hosts 内容

kubectl exec -it $(kubectl get pod -l app=web -o name | head -1) -- cat /etc/hosts

改完先别撤,确认这几项。新 Pod 的 /etc/hosts 里有 db.internal 且十分钟后仍在,应用连接数据库不再报解析失败。

补一句。hostAliases 是唯一受支持的静态解析方式,直接改容器里的文件迟早被覆盖;能用 CoreDNS 内部域名就别往 hosts 里塞。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189