【问题标题】:How to add custom host entries to kubernetes Pods?如何将自定义主机条目添加到 kubernetes Pod?
【发布时间】:2017-09-09 02:55:25
【问题描述】:

我的应用程序通过主机名与某些服务通信。 当我的应用程序作为 docker 容器运行时,我曾经将主机名添加到主机的 /etc/hosts 并使用 --net=host 运行容器。

现在我在 kubernetes 集群中运行我的容器。我想知道如何通过yaml 将 /etc/hosts 条目添加到 pod。

我正在使用 kubernetes v1.5.3。

【问题讨论】:

    标签: docker kubernetes kubectl


    【解决方案1】:

    从 k8s 1.7 开始,您可以添加 hostAliasesExample from the docs:

    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"
    

    【讨论】:

    • 这是我必须在当前集群中添加的新 pod 吗?
    • 不,这是一个关于如何添加自定义主机条目的示例
    【解决方案2】:

    主机文件会给你带来问题,但如果你真的需要,你可以使用 configmap。

    像这样添加一个配置图

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-app-hosts-file-configmap
    data:
      hosts: |-
        192.168.0.1 gateway
        127.0.0.1 localhost
    

    然后将它安装在您的 pod 中,如下所示:

      volumeMounts:
        - name: my-app-hosts-file
          mountPath: /etc/
    volumes:
      - name: my-app-hosts-file
        configMap:
        name: my-app-hosts-file-configmap
    

    【讨论】:

    • 但这会覆盖包含 pod 主机名的默认 hosts 文件。
    • 您是否找到任何解决方法来保留 pod 的主机名?
    【解决方案3】:

    这很有效,看起来也更简单:

    kind: Service
    apiVersion: v1 
    metadata:
        name: {HOST_NAME} 
        spec:
          ports:
            - protocol: TCP
              port: {PORT}
              targetPort: {PORT}
          type: ExternalName
          externalName: {EXTERNAL_IP}
    

    现在您可以直接使用 pod 中的HOST_NAME 来访问外部机器。

    【讨论】:

    • 唉,这不允许您添加 FQDN:Invalid value: "example.com": a DNS-1035 label must consist of lower case alphanumeric characters or '-', start with an alphabetic character, and end with an alphanumeric character (e.g. 'my-name', or 'abc-123', regex used for validation is '[a-z]([-a-z0-9]*[a-z0-9])?')
    • @beatcracker 为此,您可以使用 HostAliases 来解决问题。 kubernetes.io/docs/concepts/services-networking/…
    • @sunnykrgupta 我正在使用 terraform,它的 k8s 提供程序还不支持 HostAliases。我希望通过这个 hack 来实现它,但是唉......
    【解决方案4】:

    另一种方法是在 pod lifecycle 上使用 postStart 挂钩,如下所示:

    lifecycle:
          postStart:
            exec:
             command: ["/bin/sh", "-c", "echo '192.168.1.10 weblogic-jms1.apizone.io' >> /etc/hosts; echo '192.168.1.20
    

    weblogic-jms2.apizone.io' >> /etc/hosts;回声'192.168.1.30 weblogic-jms3.apizone.io' >> /etc/hosts;回声'192.168.1.40 weblogic-jms4.apizone.io' >> /etc/hosts"]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-04
      • 2015-03-18
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 2018-04-24
      相关资源
      最近更新 更多