将主机映射添加到Kubernetes

时间:2016-12-24 07:52:18

标签: docker dns kubernetes

我在kubernetes中遇到DNS映射问题。请参阅详细信息,

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

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

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

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

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

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

感谢您的帮助。

6 个答案:

答案 0 :(得分:4)

++ 发现这篇文章在 pod 中添加 /etc/hosts 条目:

使用 HostAliases 向 Pod /etc/hosts 添加条目: service/networking/hostaliases-pod.yaml

除了默认的样板文件,您还可以向 hosts 文件添加其他条目。例如:解析 foo.local, bar.local 为 127.0.0.1,解析 foo.remote, bar.remote 为 10.1.2.3,可以为 .spec.hostAliases 下的 Pod 配置 HostAliases:

apiVersion: v1
kind: Pod
metadata:
  name: hostaliases-pod
spec:
  restartPolicy: Never
  hostAliases:
  - ip: "127.0.0.1"
    hostnames:
    - "foo.local"
    - "bar.local"
  - ip: "10.1.2.3"
    hostnames:
    - "foo.remote"
    - "bar.remote"
  containers:
  - name: cat-hosts
    image: busybox
    command:
    - cat
    args:
    - "/etc/hosts"

来源:https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/

答案 1 :(得分:3)

将主机名添加到"半"中的主机文件中动态时尚,可以使用 postStart 钩子:

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

然而,更好的方法是在多个阶段使用表示服务的抽象名称。例如,不使用 database01.production.company.com ,而是使用 database01 并设置环境,以便在生产设置中解析为生产并在暂存设置中暂存。 / p>

最后,还可以编辑kubedns设置,以便kubernetes DNS可用于检索外部DNS名称。那么你只需要在代码中使用你需要的任何名称,它就是自动地"作品。例如,请参阅https://github.com/kubernetes/kubernetes/issues/23474关于如何设置它(从版本到skydns的版本有所不同:一些较旧的版本实际上不能使用它,所以升级到至少kube 1.3以使其正常工作)

答案 2 :(得分:3)

来自kubernetes.io/docs: “除了默认的样板外,我们还可以向主机文件添加其他条目,以将foo.local,bar.local解析为127.0.0.1和foo.remote,bar.remote解析为10.1.2.3,我们可以通过将HostAliases添加到.spec.hostAliases下的Pod:“

您也可以"Configure stub-domain and upstream DNS servers"

答案 3 :(得分:1)

您应该能够在没有选择器的情况下添加Service并手动创建Endpoint对象,如此处的文档中所述 - http://kubernetes.io/docs/user-guide/services/#services-without-selectors

  

服务通常抽象访问Kubernetes Pods,但他们可以   还抽象其他类型的后端。

     

例如:

     

您希望在生产中拥有外部数据库集群,但在测试中您使用自己的数据库。

     

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

     

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

答案 4 :(得分:1)

使用您需要的所有额外主机(例如/ 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

答案 5 :(得分:0)

现在可以直接在部署描述中添加 hostAliases 部分。

作为如何使用 hostAliases 部分的完整示例,我还包含了示例部署的周围代码。

apiVersion : apps/v1
kind: Deployment
metadata:
  name: "backend-cluster"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "backend"
  template:
    metadata:
      labels:
        app: "backend"
    spec:
      containers:
      - name: "backend"
        image: "exampleregistry.azurecr.io/backend"
        ports:
        - containerPort: 80
      hostAliases:
      - hostnames:
        - "www.example.com"
        ip: "10.0.2.4"

重要的部分只是文件的一部分,这里为了清楚起见省略了:

...
      hostAliases:
      - hostnames:
        - "www.example.com"
        ip: "10.0.2.4"