본문 바로가기
IT 잡지식/DevOps

[CKA] KodeKloud - CoreDNS in Kubernetes

by 쯀리♥️ 2024. 8. 15.

 

 

안녕하세요, 쯀리입니다.

오늘은 CoreDNS에 관해 알아보도록 하겠습니다. 

https://kubernetes.io/docs/tasks/administer-cluster/coredns/

 

Using CoreDNS for Service Discovery

This page describes the CoreDNS upgrade process and how to install CoreDNS instead of kube-dns. Before you begin You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is recommended

kubernetes.io

 


 

CoreDNS

CoreDNS는 유연하고 확장 가능한 DNS 서버로, 쿠버네티스 클러스터 DNS 역할을 할 수 있습니다. 쿠버네티스와 마찬가지로, CoreDNS 프로젝트는 CNCF에서 호스팅합니다.

기존 배포에서 kube-dns를 대체하거나 클러스터를 배포하고 업그레이드하는 kubeadm과 같은 도구를 사용하여 클러스터에서 kube-dns 대신 CoreDNS를 사용할 수 있습니다.

 

⭐️ DNS 이름 구조

Kubernetes에서 서비스에 접근할 때 사용하는 DNS 이름은 일반적으로 다음과 같은 계층 구조를 가집니다:

  • <service-name>: 현재 네임스페이스에서 서비스에 접근할 때 사용됩니다.
  • <service-name>.<namespace>: 다른 네임스페이스의 서비스에 접근할 때 사용됩니다.
  • <service-name>.<namespace>.svc: 서비스 리소스임을 명시하는 완전한 형태의 DNS 이름입니다.
  • <service-name>.<namespace>.svc.cluster.local: 클러스터 내에서 완전히 정규화된 도메인 이름(FQDN)으로, 클러스터의 루트 도메인까지 포함한 가장 긴 형태의 이름입니다.

 


Quiz.

1. Identify the DNS solution implemented in this cluster.

controlplane ~ ➜  k get pods -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-768b85b76f-548jr               1/1     Running   0          10m
coredns-768b85b76f-thpjb               1/1     Running   0          10m
etcd-controlplane                      1/1     Running   0          10m
kube-apiserver-controlplane            1/1     Running   0          10m
kube-controller-manager-controlplane   1/1     Running   0          10m
kube-proxy-vvcdc                       1/1     Running   0          10m
kube-scheduler-controlplane            1/1     Running   0          10m

DNS로 보여지는 Pod들이 보이나요? Coredns-{파드명}

2.How many pods of the DNS server are deployed?

controlplane ~ ➜  k get deploy -n kube-system
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
coredns   2/2     2            2           11m

 

3. What is the name of the service created for accessing CoreDNS?

controlplane ~ ➜  k get svc -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   13m

 

4. What is the IP of the CoreDNS server that should be configured on PODs to resolve services?
Service에서 Cluster-IP인 10.96.0.10가 CoreDNS 서버의 IP입니다. 

5. Where is the configuration file located for configuring the CoreDNS service?

controlplane ~ ➜  k describe po coredns-768b85b76f-548jr -n kube-system
Name:                 coredns-768b85b76f-548jr
Namespace:            kube-system
Priority:             2000000000
..
    Args:
      -conf
      /etc/coredns/Corefile

config 파일은 /etc/coredns/Corefile에 있다고 명시되어있습니다.

6. How is the Corefile passed into the CoreDNS POD?

controlplane ~ ➜  k describe po coredns-768b85b76f-548jr -n kube-system
...
Volumes:
  config-volume:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      coredns
    Optional:  false
  kube-api-access-p6hqj:

 ConfigMap (a volume populated by a ConfigMap)에서 받아서 CoreDNS POD로 넘겨줍니다.

7. What is the name of the ConfigMap object created for Corefile?

controlplane ~ ➜  kubectl get configmap -n kube-system
NAME                                                   DATA   AGE
coredns                                                1      38m
extension-apiserver-authentication                     6      38m
kube-apiserver-legacy-service-account-token-tracking   1      38m
kube-proxy                                             2      38m
...

coredns

8. What is the root domain/zone configured for this kubernetes cluster?

controlplane ~ ➜  kubectl describe  configmap coredns -n kube-system
Name:         coredns
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>

Data
====
Corefile:
----
.:53 {
    errors
    health {
       lameduck 5s
    }
    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 {
       max_concurrent 1000
    }
    cache 30
    loop
    reload
    loadbalance
}


BinaryData
====

Events:  <none>

Configmap의 '.:53' 부분을 살펴보면 CoreDNS의 Corefile에서 DNS 서버가 어떤 도메인과 포트에서 요청을 처리할지를 정의하는 설정입니다.


kubernetes cluster.local in-addr.arpa ip6.arpa 부분은

  • kubernetes cluster.local in-addr.arpa ip6.arpa: CoreDNS가 클러스터 내에서 cluster.local 도메인과 in-addr.arpa(IPv4 역방향 조회), ip6.arpa(IPv6 역방향 조회) 도메인을 처리합니다.

클러스터 내의 모든 서비스는 기본적으로 cluster.local 도메인 하위에 위치하고 있기 때문에 root domain/zone은 cluster.local입니다.

9. We have deployed a set of PODs and Services in the default and payroll namespaces. Inspect them and go to the next question.

controlplane ~ ➜  k get po
NAME                READY   STATUS    RESTARTS   AGE
hr                  1/1     Running   0          42m
simple-webapp-1     1/1     Running   0          42m
simple-webapp-122   1/1     Running   0          42m
test                1/1     Running   0          42m

controlplane ~ ➜  k get po -n payroll
NAME   READY   STATUS    RESTARTS   AGE
web    1/1     Running   0          42m

controlplane ~ ➜  k get svc
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP        48m
test-service   NodePort    10.103.39.238   <none>        80:30080/TCP   42m
web-service    ClusterIP   10.111.79.175   <none>        80/TCP         42m


controlplane ~ ➜  k get svc -n payroll
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
web-service   ClusterIP   10.97.70.151   <none>        80/TCP    42m

 

10. What name can be used to access the hr web server from the test Application?
You can execute a curl command on the test pod to test. Alternatively, the test Application also has a UI. Access it using the tab at the top of your terminal named test-app.

 

hr 어플리케이션을 접속해보겠습니다. 

controlplane ~ ➜  k get svc
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP        54m
test-service   NodePort    10.103.39.238   <none>        80:30080/TCP   49m
web-service    ClusterIP   10.111.79.175   <none>        80/TCP         49m

controlplane ~ ➜  k describe svc web-service 
Name:              web-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          name=hr
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.111.79.175
IPs:               10.111.79.175
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.0.5:80
Session Affinity:  None
Events:            <none>

web-service의 서비스를 살펴보면 selector가 hr를 선택하고 있기때문에 IP는 web-service의 ip 와 포트를 사용해서 접근해야겠습니다. 

Test Application에 접근해 curl도 날려보겠습니다. 

controlplane ~ ➜  k get po
NAME                READY   STATUS    RESTARTS   AGE
hr                  1/1     Running   0          51m
simple-webapp-1     1/1     Running   0          50m
simple-webapp-122   1/1     Running   0          50m
test                1/1     Running   0          51m

controlplane ~ ➜  k exec -it test -- /bin/sh
/opt/webapp-conntest # curl -k 10.111.79.175:80
 This is the HR server!

 

문제로 돌아가 hr서비스에 접근하기 위한 서비스의 이름은 web-service 입니다.

11. Which of the names CANNOT be used to access the HR service from the test pod?

 

12. Which of the below name can be used to access the payroll service from the test application?

controlplane ~ ➜  k get svc -n payroll
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
web-service   ClusterIP   10.97.70.151   <none>        80/TCP    57m

test에서 접근하기위해서는 {서비스명}.{네임스페이스}로 접근해야합니다. 
web-service.payroll

13.Which of the below name CANNOT be used to access the payroll service from the test application? 

위에서 명시해준 DNS 이름의 순서대로 접근해야합니다. cluster로 접근하려면 web-service.payroll.svc.cluster.local로 접근해야겠죠?

 

14. We just deployed a web server - webapp - that accesses a database mysql - server. However the web server is failing to connect to the database server. Troubleshoot and fix the issue.

They could be in different namespaces. First locate the applications. The web server interface can be seen by clicking the tab Web Server at the top of your terminal.

다른 namespace를 가졌다면 host를 명시해줄때 namespace와 함께 명시해주어야합니다. 

controlplane ~ ➜  k get svc -n payroll
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
mysql         ClusterIP   10.101.237.133   <none>        3306/TCP   3m24s
web-service   ClusterIP   10.104.78.52     <none>        80/TCP     10m

 

default에 있는 web-app의 database host를 찾지 못해 생기는 이슈입니다. 해당 pod를 수정해주겠습니다. 

controlplane ~ ➜  k get po
NAME                    READY   STATUS    RESTARTS   AGE
hr                      1/1     Running   0          8m28s
simple-webapp-1         1/1     Running   0          8m13s
simple-webapp-122       1/1     Running   0          8m13s
test                    1/1     Running   0          8m27s
webapp-9cbdd95f-j9xns   1/1     Running   0          58s


controlplane ~ ✖ k describe po webapp-9cbdd95f-j9xns
Name:             webapp-9cbdd95f-j9xns
....
    Restart Count:  0
    Environment:
      DB_Host:      mysql
      DB_User:      root
      DB_Password:  paswrd
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-2bqnl (ro)
....

DB_Host 부분을 mysql.payroll로 변경해줍니다.

issue !! Pod를 삭제하고 수정해도 자동으로 이전 버전으로 파드가 물려있는것 확인

!Deployment를 수정해주어야 합니다!

controlplane ~ ➜  k edit deploy webapp
'''
    Environment:
      DB_Host:      mysql.payroll
      DB_User:      root
      DB_Password:  paswrd

'''

deployment.apps/webapp edited

그럼 pod도 자동으로 새로 생성이 되며 해결 가능

15. From the hr pod nslookup the mysql service and redirect the output to a file /root/CKA/nslookup.out

controlplane ~ ➜  k exec -it hr -- /bin/sh
~ # nslookup mysql.payroll
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   mysql.payroll.svc.cluster.local
Address: 10.101.237.133

~ # exit

controlplane ~ ➜  k exec -it hr -- nslookup mysql.payroll > /root/CKA/nslookup.out

controlplane ~ ➜  cat /root/CKA/nslookup.out
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   mysql.payroll.svc.cluster.local
Address: 10.101.237.133

 

 


오늘은 CoreDNS에 관해 알아보았습니다. 

다음시간에는 Ingress에 관해 알아보겠습니다. 

 


참조

 Udemy Labs - Certified Kubernetes Administrator with Practice Tests