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

qin*_*zuo 6 dns docker kubernetes

我在kubernetes中的DNS映射有问题。请查看详细信息,

我们有一些可以从互联网访问的服务器。全局DNS将这些服务器的域名转换为公共Internet 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本身提供的与此相关的任何命令也是如此?

感谢您的帮助。

eik*_*ooc 19

现在可以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"
Run Code Online (Sandbox Code Playgroud)

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

...
      hostAliases:
      - hostnames:
        - "www.example.com"
        ip: "10.0.2.4"
Run Code Online (Sandbox Code Playgroud)

  • 应该是接受的答案恕我直言 (2认同)

Nor*_*len 8

要以“半”动态方式向主机文件添加主机名,可以使用postStart钩子:

spec:
  containers:
  - name: somecontainer
    image: someimage
    lifecycle:
      postStart:
        exec:
          command:
            - "cat"
            - "someip"
            - "somedomain"
            - ">"
            - "/etc/hosts"
Run Code Online (Sandbox Code Playgroud)

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

最后,还可以编辑 kubedns 设置,以便 kubernetes DNS 可用于检索外部 DNS 名称。然后您只需在代码中使用您需要的任何名称,它就可以“自动”工作。例如,请参阅https://github.com/kubernetes/kubernetes/issues/23474了解如何设置(skydns 的版本与版本略有不同:一些较旧的版本确实不适用于此,因此至少升级到kube 1.3 使其正常工作)

  • 真的感谢更新。它很有用。我刚刚阅读了文档 http://kubernetes.io/docs/user-guide/container-environment/ 并尝试了这个。我认为该命令需要稍微更改为`exec: command: - "sh" - "-c" - "echo someip somedomain > /etc/hosts"`。似乎 kubernetes 只是使用 `os/exec exec.Command(args).Run()` 来运行命令,因此不支持“|,>,>>”。感谢你的帮助 :) (2认同)

war*_*den 6

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


小智 6

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

您也可以“配置存根域和上游 DNS 服务器”


Sye*_*mar 5

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

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

除了默认样板之外,您还可以向主机文件添加其他条目。例如:要将 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"
Run Code Online (Sandbox Code Playgroud)

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