【发布时间】:2021-12-24 09:07:46
【问题描述】:
我在我的 docker ENTRYPOINT 中编写了一个简单的脚本来使用 dnsmasq
if [ ! -f /etc/resolv.dnsmasq ];then
cp /etc/resolv.conf /etc/resolv.dnsmasq
sed -i 's/^nameserver.*/nameserver 127.0.0.1/' /etc/resolv.conf
dnsmasq -r /etc/resolv.dnsmasq
else
dnsmasq -r /etc/resolv.dnsmasq
fi
我的逻辑很简单,k8s第一次启动我的docker contains时,它会将/etc/resolv.conf中的nameserver更新为正确的值,我的脚本会将其复制到/etc/resolv.dnsmasq并更改/etc/resolv.conf中的nameserver 127.0.0.1 使用 dnsmasq 服务。
当 docker 重新启动时,因为 /etc/resolv.dnsmasq 仍然存在,所以 dnsmasq 将刚刚启动。它大部分时间都可以工作,但是当 k8s 重新启动容器由于健康检查失败时,它将无法工作。当这种情况发生时,我的resolv.dnsmasq 拥有nameserver 127.0.0.1,
/var/www/html # cat /etc/resolv.dnsmasq
nameserver 127.0.0.1
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:2 timeout:2
从到目前为止我得到的评论和答案中我意识到这是因为当容器被重新创建时,我有一个修改过的/etc/resolv.conf 而没有/etc/resolv.dnsmasq。所以 then 部分运行。
但是,如果从图像中重新创建,为什么/etc/resolv.conf 中有nameserver 127.0.0.1?
我该如何处理并让 dnsmasq 正常工作?
---更新---
通过我们的调查,似乎有时 Kubernetes 会杀死正在运行的 docker 容器并从镜像启动一个新容器,但是随着 pause 容器的存在,修改后的 /etc/resolve.conf 也存在。发生这种情况时,重新启动的容器没有 /etc/resolv.dnsmasq,但它共享已修改的 /etc/resolv.conf nameserver 127.0.0.1
我不确定 pause 容器背后的整个逻辑。 What is the use of a pause image in Kubernetes? 说“暂停容器保存 pod 的网络命名空间。”那么这是否意味着/etc/resolv.conf 仍然在我的情况下?谁能帮忙解答一下?
【问题讨论】:
-
不是文件被删除了。除非需要从映像重新创建容器,否则在容器内创建的文件将继续存在。如果需要重新创建,则只存在图像上存在的文件。
-
您好,我看到您删除了我的第二个问题。所以我打算重写我的问题来问它,因为这是我问题的重点。根据您的说法,这是因为重新创建了容器。你没问题吗?
-
您好,我已经更新了我的问题。但是,如果从图像中重新创建,为什么我会有修改后的
/etc/resolv.conf? -
您是否考虑过在您的部署中使用
postStart挂钩?您可以将ENTRYPOINT脚本移到那里。它应该可以解决您在 k8s 集群中的问题,但它需要更改 Dockerfile。让我知道您的想法,以及您打算单独使用此容器还是仅在集群中使用此容器。 -
在 Kubernetes 中,你真的需要运行 dnsmasq 吗? Kubernetes 有its own DNS system 和a way to define additional names in it。
标签: docker kubernetes dnsmasq