2016-12-24 196 views
2

我有一个kubernetes中的DNS映射问题。请看详细信息,将主机映射添加到Kubernetes中的/ etc/hosts中

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

从公司内部,我们添加了具有专用IP的DNS映射到由kubernetes管理的docker容器内的/ etc/hosts以手动访问这些服务器。

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

在另一方面,我们可以包装的启动脚本的泊坞窗容器,

  • 追加映射到/ etc/hosts中首先
  • 启动应用

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

感谢您的帮助。

回答

2

添加主机到主机文件中的一个“半成品”时尚动感,可以使用启动后钩:

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稍微变化一些:一些较旧的版本确实不适用于此,所以升级到至少kube 1.3以使其正常工作)

+0

真的非常感谢您的更新。这很有用。我刚刚阅读了文档http://kubernetes.io/docs/user-guide/container-environment/并尝试了这一点。我认为这个命令需要稍微改成'exec:command: - “sh” - “-c” - “echo someip somedomain>/etc/hosts”。似乎kubernetes只是使用'os/exec exec.Command(args).Run()'来运行命令,以便不支持“|,>,>>”。感谢你的帮助:) – qingdaojunzuo

+0

@qingdaojunzuo是的,你是正确的:所有这些命令部分的命令语法远不是用户友好的,在没有测试的情况下当场猜测它们是错误的方法:) –

1

您应该能够添加Service没有选择和手动创建Endpoint对象,如这里的文档描述 - http://kubernetes.io/docs/user-guide/services/#services-without-selectors

服务一般抽象访问Kubernetes吊舱,但他们可以 也是抽象的其他各种后端。

例如:

你想拥有生产外部数据库集群,但在测试你用你自己的数据库。

您想将您的服务指向另一个 命名空间或其他群集中的服务。

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

+0

感谢响应。这在某些情况下对我很有用。我们可以使用服务名称而不是kubernetes集群内的域名/ IP。现在我们有一个服务A内部集群。 A使用kafka&zookeeper。卡夫卡和动物园管理员在Kube集群外部署。服务A通过域名从zookeeper获取所有卡夫卡经纪人。这些域名不能更改为kube服务名称,因为它们与kube群集外的其他系统共享。这些域名需要被翻译成私人IP,使用服务A.有什么方法可以轻松解决这个问题吗?非常感谢您的帮助。 – qingdaojunzuo

0

创建一个主机系统(或秘密),所有你需要额外的主机(例如,/ tmp目录/额外的主机)

然后在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