【问题标题】:What is the proper way to start dnsmasq in my docker ENTRYPOINT?在我的 docker ENTRYPOINT 中启动 dnsmasq 的正确方法是什么?
【发布时间】: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 systema way to define additional names in it

标签: docker kubernetes dnsmasq


【解决方案1】:

...when k8s restarts container due to health check failure it always fail to work

不同于docker restart,K8s 用 new 实例重启容器,你保存在被杀死容器中的任何东西都不会存在。为了让您的文件在 K8s 重启后持续存在,您需要将它们保存在持久卷中(例如 NFS、云提供商提供的存储等)。

【讨论】:

  • 您好,我更新了我的问题,您可以再看一下吗?
  • 查看更新后的答案。
  • 但是如果是从图像重新创建的,为什么我会有一个修改过的 /etc/resolv.conf 呢?
  • 这正是我的问题!我不认为 /etc/resolv.conf 在图像中有 127.0.0.1 。但是是吗?我现在不是 100% 确定。
  • 不确定你的意思,注意默认情况下一个pod继承了节点的名称解析配置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
相关资源
最近更新 更多