写点什么

k8s POD hosts 文件怎么与主机保持同步那?

用户头像
Geek_f24c45
关注
发布于: 2021 年 05 月 15 日

业务使然,很多域名的解析工作依赖主机的 hosts 文件,当使用容器时,也希望容器能应用相同的 hosts 文件内容。 我们面临两个问题:

怎样使容器使用主机的 hosts 文件 ?


在网络模式是 hostnetwork 时,kubelet 会复制一份 hosts 文件到容器工作目录,所以内容是一致的


在 CNI 网络模式时,hosts 文件重新生成,和主机 hosts 文件无任何关系


k8s 的 hostAliases 功能在上面两种情况下,都会主机自定义域名到 hosts 文件中


不同模式 hosts 文件的处理方式不一样,我们采用 volume 挂载的模式的话,方式将得到统一

  volumeMounts:   - mountPath: /etc/hosts     name: hosts     readOnly: true volumes:- name: hosts  hostPath:    path: /etc/hosts    type: File
复制代码


当然 k8s 的 hostAliases 功能将不再生效


主机的 hosts 文件更新了, 容器内部怎么感知变化?


无论怎么形式,其实容器创建时,都是 --bind 方式,将文件 mount 到容器内部,容器内外其实文件的 inode 号是一致的,当主机 hosts 在保持 inode 不变情况下变化,容器内部就同样能感知变化。


vim 修改会改变文件的 inode 号, tee, echo 等不会改变文件 inode 号;

vim 在文件有 link 时,同样不会修改 inode 号


所以重点 保证 inode 号不变化,就可以了


有一天改错了,inode 不一致了额,有办法修复吗


  1. 将 主机 /etc 目录挂载进入容器,让容器可见, 如 容器挂载了主机的目录 A, 则 mount --bind /etc A/tmp, 此时容器内部将重新看到主机 /etc 下的文件

  2. nsenter -t PID -m -p mount --bind /A/tmp/hosts /etc/hosts

  3. umount 主机 A/tmp


自此 容器 /etc/hosts 将与主机又保持一致了,且 inode 号相同


用户头像

Geek_f24c45

关注

还未添加个人签名 2018.03.24 加入

还未添加个人简介

评论

发布
暂无评论
k8s POD hosts 文件怎么与主机保持同步那?