如何将自定义主机条目添加到kubernetes Pods?

时间:2017-04-13 05:59:30

标签: docker kubernetes kubectl

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

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

我正在使用kubernetes v1.5.3。

5 个答案:

答案 0 :(得分:4)

从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"

答案 1 :(得分:1)

主机文件会给你带来麻烦,但如果你真的需要,可以使用配置图。

像这样添加一个配置图

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

然后将其安装在您的吊舱内,如下所示:

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

答案 2 :(得分:0)

我自己还没有需要POD中的主机条目,但理论上会说你应该在dockerfile中为容器添加这些条目,而不是作为一部分Pod yaml的内容 - 即使command参数可以使用,如this answer中所述。

原因是Pod在逻辑上是一个包裹在容器周围的层,不应该关注容器内运行的应用程序的细节。

答案 3 :(得分:0)

这样做起来也很简单:

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

现在,您可以直接使用pod中的HOST_NAME访问外部计算机。

答案 4 :(得分:0)

另一种方法可能是使用Pod 生命周期上的 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”]