How to add custom host entries to kubernetes Pods?

4/13/2017

My application communicates to some services via hostnames. When running my application as a docker container i used to add hostnames to the /etc/hosts of the hostmachine and run the container using --net=host.

Now I'm running my containers in kubernetes cluster. I would like to know how can i add the /etc/hosts entries to the pod via yaml.

I'm using kubernetes v1.5.3.

-- Karthik
docker
kubectl
kubernetes

5 Answers

3/26/2020

Another approach could be to use postStart hook on the pod lifecycle as below:

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; echo '192.168.1.30 weblogic-jms3.apizone.io' >> /etc/hosts; echo '192.168.1.40 weblogic-jms4.apizone.io' >> /etc/hosts"]

-- Shoaib Khan
Source: StackOverflow

4/18/2017

This works and also looks simpler:

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

Now you can use the HOST_NAME from the pod directly to access the external machine.

-- Karthik
Source: StackOverflow

4/13/2017

I have not had a need for host entries in PODs myself yet, but the theory would say that you should add those entries in the dockerfile for your containers, and not as part of the Pod yaml - Even though it would be possible with a command parameter, as described in this answer.

The reason being that the Pod is logically a layer wrapped around the containers and should not be concerned with the details of the applications running inside the containers.

-- Oswin Noetzelmann
Source: StackOverflow

2/12/2018

From k8s 1.7 you can add hostAliases. Example 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"
-- isalgueiro
Source: StackOverflow

4/13/2017

Host files are going to give you problems, but if you really need to, you could use a configmap.

Add a configmap like so

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

Then mount that inside your pod, like so:

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