Bird
Raised Fist0
Kubernetesdevops~5 mins

DNS in Kubernetes (CoreDNS) - Commands & Configuration

Choose your learning style10 modes available
Introduction
Kubernetes uses DNS to let pods find each other by name instead of IP addresses. CoreDNS is the default DNS service in Kubernetes that answers these name requests inside the cluster.
When your application pods need to communicate using service names instead of IPs.
When you want to access a pod or service by a friendly name inside the cluster.
When you deploy multiple services and want automatic name resolution without manual IP tracking.
When you want to debug DNS issues inside your Kubernetes cluster.
When you need to customize DNS behavior for your cluster using CoreDNS plugins.
Config File - coredns.yaml
coredns.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
          ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }

This ConfigMap defines the CoreDNS configuration for the Kubernetes cluster.

Corefile is the main configuration file for CoreDNS.

  • .:53 means CoreDNS listens on port 53 for all domains.
  • kubernetes cluster.local in-addr.arpa ip6.arpa enables DNS for Kubernetes services and pods.
  • forward . /etc/resolv.conf forwards DNS queries CoreDNS can't answer to the upstream DNS servers.
  • Other plugins like cache, health, and loadbalance improve performance and reliability.
Commands
This command applies the CoreDNS ConfigMap to the kube-system namespace to configure DNS inside the cluster.
Terminal
kubectl apply -f coredns.yaml -n kube-system
Expected OutputExpected
configmap/coredns configured
→
-f - Specifies the file to apply
→
-n - Specifies the namespace where CoreDNS runs
This command lists the CoreDNS pods to check if they are running after applying the configuration.
Terminal
kubectl get pods -n kube-system -l k8s-app=kube-dns
Expected OutputExpected
NAME READY STATUS RESTARTS AGE coredns-558bd4d5db-abcde 1/1 Running 0 2m
→
-n - Namespace to look in
→
-l - Label selector to filter CoreDNS pods
This command runs nslookup inside a pod to test if DNS resolves the Kubernetes service name correctly.
Terminal
kubectl exec -n default -it busybox -- nslookup kubernetes.default
Expected OutputExpected
Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: kubernetes.default.svc.cluster.local Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
→
-n - Namespace where the pod runs
→
-it - Interactive terminal to run commands inside the pod
Key Concept

If you remember nothing else from this pattern, remember: CoreDNS runs inside Kubernetes to translate service and pod names into IP addresses automatically.

Common Mistakes
Not applying the CoreDNS ConfigMap in the kube-system namespace
CoreDNS only works when configured in the kube-system namespace where it runs.
Always use '-n kube-system' when applying or checking CoreDNS configurations.
Trying to resolve service names from outside the cluster without proper DNS forwarding
CoreDNS only resolves names inside the cluster; external DNS needs separate setup.
Test DNS resolution from inside a pod using commands like nslookup or dig.
Forgetting to check CoreDNS pod status after configuration changes
If CoreDNS pods are not running or crash, DNS resolution will fail.
Always verify CoreDNS pods are running with 'kubectl get pods -n kube-system -l k8s-app=kube-dns'.
Summary
Apply the CoreDNS ConfigMap in the kube-system namespace to configure cluster DNS.
Check CoreDNS pods are running to ensure DNS service is active.
Test DNS resolution inside a pod using nslookup to confirm service names resolve correctly.

Practice

(1/5)
1. What is the main role of CoreDNS in a Kubernetes cluster?
easy
A. To manage container images in the cluster
B. To provide DNS resolution for services and pods inside the cluster
C. To schedule pods on nodes
D. To monitor cluster resource usage

Solution

  1. Step 1: Understand CoreDNS function

    CoreDNS acts as the DNS server inside Kubernetes, resolving names of services and pods.
  2. Step 2: Compare with other options

    Managing images, scheduling pods, and monitoring are done by other components like container registries, kube-scheduler, and metrics servers.
  3. Final Answer:

    To provide DNS resolution for services and pods inside the cluster -> Option B
  4. Quick Check:

    CoreDNS = DNS resolution inside Kubernetes [OK]
Hint: CoreDNS is Kubernetes' internal DNS server [OK]
Common Mistakes:
  • Confusing CoreDNS with pod scheduling
  • Thinking CoreDNS manages container images
  • Assuming CoreDNS monitors resources
2. Which Kubernetes resource holds the CoreDNS configuration?
easy
A. Secret named coredns in default namespace
B. Deployment in kube-system namespace
C. ConfigMap named coredns in kube-system namespace
D. ServiceAccount named coredns in kube-system namespace

Solution

  1. Step 1: Identify CoreDNS configuration storage

    The CoreDNS configuration is stored in a ConfigMap named 'coredns' inside the 'kube-system' namespace.
  2. Step 2: Eliminate other options

    Deployment runs CoreDNS pods but does not hold config; Secrets store sensitive data; ServiceAccounts manage permissions.
  3. Final Answer:

    ConfigMap named coredns in kube-system namespace -> Option C
  4. Quick Check:

    CoreDNS config = ConfigMap coredns in kube-system [OK]
Hint: CoreDNS config is a ConfigMap in kube-system [OK]
Common Mistakes:
  • Confusing ConfigMap with Secret
  • Looking in default namespace instead of kube-system
  • Thinking Deployment holds config data
3. Inside a pod, you run nslookup kubernetes.default.svc.cluster.local. What is the expected result?
medium
A. An IP address of the Kubernetes API service
B. An error saying domain not found
C. The pod's own IP address
D. The IP address of the CoreDNS pod

Solution

  1. Step 1: Understand the DNS query

    The domain 'kubernetes.default.svc.cluster.local' is the default Kubernetes API service DNS name inside the cluster.
  2. Step 2: Determine expected DNS resolution

    CoreDNS resolves this to the IP address of the Kubernetes API service, not the pod or CoreDNS pod IP.
  3. Final Answer:

    An IP address of the Kubernetes API service -> Option A
  4. Quick Check:

    Default service DNS resolves to API server IP [OK]
Hint: Default service DNS resolves to API server IP [OK]
Common Mistakes:
  • Expecting pod IP instead of service IP
  • Assuming CoreDNS pod IP is returned
  • Thinking query fails inside pod
4. You modified the CoreDNS ConfigMap but DNS queries inside pods still fail. What is the most likely fix?
medium
A. Restart the CoreDNS pods to reload the new config
B. Delete all pods in the default namespace
C. Reinstall Kubernetes cluster
D. Change pod DNSPolicy to Default

Solution

  1. Step 1: Recognize CoreDNS config reload behavior

    CoreDNS pods need to reload the ConfigMap changes, which usually requires restarting the pods.
  2. Step 2: Evaluate other options

    Deleting unrelated pods or reinstalling the cluster is unnecessary; changing DNSPolicy may break cluster DNS.
  3. Final Answer:

    Restart the CoreDNS pods to reload the new config -> Option A
  4. Quick Check:

    CoreDNS pods restart reloads ConfigMap changes [OK]
Hint: Restart CoreDNS pods after ConfigMap changes [OK]
Common Mistakes:
  • Deleting unrelated pods expecting DNS fix
  • Reinstalling cluster unnecessarily
  • Changing pod DNSPolicy incorrectly
5. You want to add a custom DNS entry for myapp.local inside your Kubernetes cluster using CoreDNS. Which step is required?
hard
A. Deploy a pod named myapp.local with a static IP
B. Create a new Service named myapp.local in default namespace
C. Modify the kubelet to add myapp.local to /etc/hosts on all nodes
D. Add a hosts plugin entry in the CoreDNS ConfigMap with myapp.local mapping

Solution

  1. Step 1: Understand how to add custom DNS entries in CoreDNS

    CoreDNS supports a hosts plugin where you can add static hostname-to-IP mappings in its ConfigMap.
  2. Step 2: Evaluate other options

    Creating a Service named myapp.local won't create a DNS entry for that domain; modifying kubelet hosts is manual and not scalable; pod names don't create DNS entries.
  3. Final Answer:

    Add a hosts plugin entry in the CoreDNS ConfigMap with myapp.local mapping -> Option D
  4. Quick Check:

    Custom DNS via hosts plugin in CoreDNS ConfigMap [OK]
Hint: Use hosts plugin in CoreDNS ConfigMap for custom DNS [OK]
Common Mistakes:
  • Thinking Service name creates arbitrary DNS names
  • Modifying node hosts files manually
  • Assuming pod names create DNS entries
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard