将主机映射添加到Kubernetes中的/ etc / hosts

我有一个与kubernetes DNS映射的问题。 请看细节,

我们有一些可以从互联网上访问的服务器。 全球DNS将这些服务器的域名转换为公共互联网IP。 出于安全考虑,某些服务无法通过公共IP访问。

从公司内部,我们将私有IP地址的DNS映射添加到由kubernetespipe理的docker容器内的/ etc / hosts中以手动访问这些服务器。

我知道docker支持命令–add-host在执行“docker run”时更改/ etc / hosts。 我不确定这个命令是否支持最新的kubernetes,例如kuber 1.4或1.5?

另一方面,我们可以封装Docker容器的启动脚本,

  • 首先将映射追加到/ etc / hosts
  • 开始我们的申请

我只想在每个容器中首次运行后更改文件一次。 有没有一种简单的方法来做到这一点,因为在开发和生产环境之间的映射关系可能是不同的,或者由kubernetes本身提供的任何相关的命令?

感谢您的帮助。

要以“半”dynamic方式将主机名添加到hosts文件,可以使用postStart挂钩:

spec: containers: - name: somecontainer image: someimage lifecycle: postStart: exec: command: - "cat" - "someip" - "somedomain" - ">" - "/etc/hosts" 

然而,更好的方法是在多个阶段使用代表服务的抽象名称。 例如,不是使用database01.production.company.com,而是使用database01并设置环境,以便在生产设置中将其分解为生产,并在分段设置中进行分段。

最后,还可以编辑kubedns设置,以便可以使用kubernetes DNS来检索外部DNS名称。 那么你只需要在代码中使用任何你需要的名字,它只是“自动地”运作。 看例如https://github.com/kubernetes/kubernetes/issues/23474关于如何设置这个(从版本到版本的skydns有所不同:一些较旧的人真的不能用这个,所以升级到至lesskube 1.3使这个工作正常)

您应该可以添加一个没有select器的Service ,并手动创buildEndpoint对象,如文档中所述 – http://kubernetes.io/docs/user-guide/services/#services-without-selectors

服务通常抽象化访问Kubernetes Pods,但是他们也可以抽象其他种类的后端。

例如:

你想在生产中有一个外部数据库集群,但是在testing中你使用自己的数据库。

您希望将您的服务指向另一个名称空间或另一个群集中的服务。

您正在将工作负载迁移到Kubernetes,而您的一些后端则在Kubernetes之外运行。

在主机系统(或秘密)上用所需的所有额外主机创build一个文件(例如/ tmp / extra-hosts)

然后在K8S清单中:

 spec: containers: - name: haproxy image: haproxy lifecycle: postStart: exec: command: ["/bin/sh", "-c", "cat /hosts >> /etc/hosts"] volumeMounts: - name: haproxy-hosts mountPath: /hosts volumes: - name: haproxy-hosts hostPath: path: /tmp/extra-hosts