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.
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"]
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.
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.
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"
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