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.
Top comments (0)