k8s POD hosts 文件怎么与主机保持同步那?
业务使然,很多域名的解析工作依赖主机的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不一致了额,有办法修复吗
自此 容器 /etc/hosts 将与主机又保持一致了,且inode号相同