k8s POD hosts 文件怎么与主机保持同步那?
业务使然,很多域名的解析工作依赖主机的 hosts 文件,当使用容器时,也希望容器能应用相同的 hosts 文件内容。 我们面临两个问题:
怎样使容器使用主机的 hosts 文件 ?
在网络模式是 hostnetwork 时,kubelet 会复制一份 hosts 文件到容器工作目录,所以内容是一致的
在 CNI 网络模式时,hosts 文件重新生成,和主机 hosts 文件无任何关系
k8s 的 hostAliases 功能在上面两种情况下,都会主机自定义域名到 hosts 文件中
不同模式 hosts 文件的处理方式不一样,我们采用 volume 挂载的模式的话,方式将得到统一
复制代码
当然 k8s 的 hostAliases 功能将不再生效
主机的 hosts 文件更新了, 容器内部怎么感知变化?
无论怎么形式,其实容器创建时,都是 --bind 方式,将文件 mount 到容器内部,容器内外其实文件的 inode 号是一致的,当主机 hosts 在保持 inode 不变情况下变化,容器内部就同样能感知变化。
vim 修改会改变文件的 inode 号, tee, echo 等不会改变文件 inode 号;
vim 在文件有 link 时,同样不会修改 inode 号
所以重点 保证 inode 号不变化,就可以了
有一天改错了,inode 不一致了额,有办法修复吗
将 主机 /etc 目录挂载进入容器,让容器可见, 如 容器挂载了主机的目录 A, 则 mount --bind /etc A/tmp, 此时容器内部将重新看到主机 /etc 下的文件
nsenter -t PID -m -p mount --bind /A/tmp/hosts /etc/hosts
umount 主机 A/tmp
自此 容器 /etc/hosts 将与主机又保持一致了,且 inode 号相同
评论