Finding DNS hostname for Kubernetes Service

Victor Osório - May 26 '20 - - Dev Community

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.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player