본문 바로가기

Data/MLOps

CoreDNS 관련 정리

반응형

참고자료

CoreDNS?

  • CoreDNS는 CNCF재단에서 관리하는 프로젝트. CoreDNS는 클러스터를 지속적으로 모니터링하고, 새로운 Service, Pod이 추가되는경우 도메인 서버에 이를 업데이트를 함
  • kubelet은 새로운 Pod이 생성될때, Pod의 /etc/resolv.conf파일에 clusterDNS서버의 IP주소를 추가함.
$ kubectl exec -it my-pod -- cat /etc/resolv.conf

search default.svc.cluster.local svc.cluster.local cluster.local # DNS에 질의할 부분 도메인 주소 경로들을 표시
nameserver 10.96.0.10 # CoreDNS Service 오브젝트 IP주소
options ndots:5 # FQDN으로 취급될 도메인에 포함될 .(점)의 최소 개수
  • FQDN: Fully Qualified Domain Name의 약자로 '절대 도메인 네임' 또는 '전체 도메인 네임' 이라고도 불리는. 도메인 전체 이름을 표기하는 방식을 의미한다.
  • Search: 이 옵션에는 부분적인 도메인 목록들을 지정한다. 즉, 클라이언트가 DNS 서버로부터 결과가 없다는 응답을 받으면, 이 부분 도메인 목록을 차례대로 붙여가며 추가로 DNS 서버를 호출한다.
    • (해당 내용은 위 참고 자료에서 이름만 변경했습니다) 위에 케이스에서 만약 존재하지 않는 도메인(test.jaeyung.dev)을 DNS서버에 조회하면 총 4번의 요청이 전달될수 있음
      • 1. test.jaeyung.dev
      • 2. test.jaeyung.dev.testbed.svc.cluster.local
      • 3. test.jaeyung.dev.svc.cluster.local
      • 4. test.jaeyung.dev.cluster.local
[INFO] 10.244.1.18:36652 - 7 "A IN test.jaeyung.dev. udp 34 false 512" NXDOMAIN qr,rd,ra 118 0.198687028s    
[INFO] 10.244.1.18:47210 - 8 "A IN test.jaeyung.dev.testbed.svc.cluster.local. udp 60 false 512" NXDOMAIN qr,aa,rd 153 0.000158582s
[INFO] 10.244.1.18:33116 - 9 "A IN test.jaeyung.dev.svc.cluster.local.
 udp 52 false 512" NXDOMAIN qr,aa,rd 145 0.00014892s
[INFO] 10.244.1.18:59109 - 10 "A IN test.jaeyung.dev.cluster.local. ud
p 48 false 512" NXDOMAIN qr,aa,rd 141 0.000122777s

Service DNS 형식

Kubernetes의 CoreDNS는 DNS 서버로서 클러스터 내부에서 DNS 조회를 처리합니다. CoreDNS는 다양한 DNS 형식을 지원합니다. 아래에는 CoreDNS가 제공하는 일반적인 Service DNS 형식의 예시를 제공합니다

  • service-name.namespace.svc.cluster.local
    이 형식은 동일한 네임스페이스 내의 서비스에 대한 FQDN(Fully Qualified Domain Name)입니다. 예를 들어, my-service.default.svc.cluster.local와 같은 형태로 서비스를 참조할 수 있습니다.
  • service-name.namespace.svc: 이 형식은 동일한 네임스페이스 내의 서비스에 대한 짧은 FQDN입니다. my-service.default.svc와 같이 사용할 수 있습니다.
  • service-name.namespace: 이 형식은 네임스페이스 내에서 서비스에 대한 더 짧은 형태의 FQDN입니다. 예를 들어, my-service.default와 같이 사용할 수 있습니다.
  • service-name: 이 형식은 기본적으로 현재 네임스페이스 내에서 서비스를 참조합니다. 네임스페이스가 명시되지 않은 경우 현재 네임스페이스로 가정됩니다.

장점

  • 서비스 디스커버리
    • CoreDNS는 Kubernetes 클러스터 내에서 서비스 디스커버리를 제공합니다. 컨테이너에서 실행되는 애플리케이션은 IP 주소 대신 DNS 이름을 사용하여 다른 서비스를 찾고 통신할 수 있습니다. 이를 통해 서비스의 확장 또는 마이그레이션 시에도 결합도가 낮아지고 유연성이 향상됩니다.
  • 사용자 정의 및 확장성
    • CoreDNS는 손쉽게 구성, 확장 가능한 서비스입니다. corefile 설정을 통해, 간편하게 플러그인을 추가하여 특정 요구 사항을 충족시킬 수 있는데요. 이러한 유연성은 DNS 캐싱, DNS 기반 보안 정책, 외부 DNS 공급자와의 통합 등의 기능을 가능하게 합니다.
  • Kubernetes API와의 통합
    • CoreDNS는 Kubernetes API 서버와 원활하게 통합됩니다. Kubernetes API를 쿼리함으로써 클러스터 내의 서비스, 엔드포인트 및 기타 리소스를 자동으로 검색합니다.

작업 관련

  • CoreDNS는 Deployment형식으로 떠있음
root@nx-master-1:~# kubectl get deployment -n kube-system
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
calico-kube-controllers   1/1     1            1           53d
coredns                   8/8     8            8           53d
dns-autoscaler            1/1     1            1           53d
  • CoreDNS의 corefile은 kube-system의 configmaps을 통해 관리됨
root@nx-master-1:~# kubectl get configmaps -n kube-system
NAME                                                   DATA   AGE
...
coredns                                                1      53d
...
  • corefile변경이후에는 coredns pod을 다시 띄워야 corefile이 적용됨. 아래와같은 명령어 실행으로 진행
# 라벨을 통한 coredns pod 정보 획득
kubectl get pods -l k8s-app=kube-dns

# coredns pod만 있는지 확인한 이후
kubectl delete pods -l k8s-app=kube-dns

# 혹은 rollout restart 진행
kubectl rollout restart deployment/coredns -n kube-system
반응형