DEV Community

loading...
Cover image for Finding DNS hostname for Kubernetes Service

Finding DNS hostname for Kubernetes Service

Victor Os贸rio
Since 2005 years working in highly challenging projects
銉2 min read

Kubernetes is very difficult! If someone says it is easy, do not believe! But we can learn! 馃槑

There there is a little trick to find the internal DNS for a service.

I have created a service for a Cassandra Database using the following YAML:

apiVersion: v1
kind: Pod
metadata:
  name: my-service
  labels:
    app: my-service
spec:
  containers:
  - name: my-service
    image: my-service
---
apiVersion: v1
kind: Service
metadata:
    name: my-service
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 30080
      protocol: TCP
  selector:
    app: my-service
---
apiVersion: v1
kind: Pod
metadata:
  name: cassandra-db
  labels:
    app: cassandra-db
spec:
  containers:
  - name: cassandra-db
    image: cassandra:3
---
apiVersion: v1
kind: Service
metadata:
  name: cassandra-db
spec:
  selector:
    app: cassandra-db
  type: ClusterIP
  ports:
    - port: TCP
      port: 7000

So I have a question? How can I know where I can find my database? I'm using a ClusterIP, so if I redeploy my database, it can change.

So the first approach is to not directly use my database hostname/port on code. I should retrieve it thought Environment Variables.

The I have to find the cassandra-db service hostname.

Finding the hostname

I have to create a pod in the environment, to access the environment topology:

apiVersion: v1
kind: Pod
metadata:
  name: dnsutils
  namespace: default
spec:
  containers:
  - name: dnsutils
    image: gcr.io/kubernetes-e2e-test-images/dnsutils:1.3
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

Apply the created yaml file:

$ kubectl apply -f dnsutils.yaml
pod/dnsutils created

Then I can easily search for the DNS with nslookup on dnsutils:

$ kubectl exec -ti dnsutils -- nslookup cassandra-db
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   cassandra-db.default.svc.cluster.local
Address: 10.98.98.138

Easy?

Now that I do not need dnsutils pod anymore, I can delete it:

$ kubectl delete pod dnsutils
pod "dnsutils" deleted

Using the found value as Environment Variable

Now we can use found value as environment variable:

apiVersion: v1
kind: Pod
metadata:
  name: my-service
  labels:
    app: my-service
spec:
  containers:
  - name: my-service
    image: my-service
    env:
    - name: DATABASE_HOST
      value: "cassandra-db.default.svc.cluster.local"
    - name: DATABASE_PORT
      value: "7000"

Conclusion

Using Kubernetes is not easy, but we can learn. Here we can find an easy way to find how can we access services internal Kubernetes DNS.

Discussion (0)