개인적으로 차근차근 공부하는 목적으로 작성한 글입니다.
일부 잘못된 내용이 있을 수도 있습니다. 잘못된 내용은 피드백 해주시면 적극 반영하도록 하겠습니다.
감사합니다 :)
최근에 EKS 업데이트를 했었는데, k8s 버전에 맞는 coreDNS 업데이트도 했다.
coreDNS가 이름만 들어보면 언뜻 DNS 서비스를 뜻하는것 같은데, 정확히 어떤 개념이고 어떤게 동작하는지 궁금했다.
CoreDNS란 무엇인가?
k8s docs를 보면 아래와 같이 쿠버네티스 클러스터의 DNS 역할을 수행하는 서버로 표현되어 있다.
CoreDNS는 쿠버네티스 클러스터의 DNS 역할을 수행할 수 있는, 유연하고 확장 가능한 DNS 서버이다.
쿠버네티스와 동일하게, CoreDNS 프로젝트도 CNCF 가 관리한다.
어렵게 표현했지만 결국에는 k8s cluster에서 사용가능한 DNS 서버라고 보면 된다.
과거에는 kube-dns가 사용되었지만, 지금은 coredns로 대부분 대체되었고 EKS로 설치하면 기본적으로 coredns가 설치된다.
기본적으로 알고 있는 DNS 서버와 차별점이 있다면 pod domain, service domain에 대한 DNS 응답을 한다.
- pod domain: <pod-ip>.<namespace>.pod.cluster.local
- service domain: <service>.<namespace>.svc.cluster.local
그렇다면 DNS 질의 구조는 어떻게 될까?
pod은 기본적으로 DNS 질의를 할 때 kube-dns를 찾는다. 그래서 pod의 /etc/resolv.conf를 보면 kube-dns의 cluster ip가 있다.
그리고 Cluster 내/외부 가리지 않고 모두 Coredns로 우선 요청하고 DNS 응답을 받게 된다.
아래는 Worker node가 다를 때 A nginx에서 B nginx service를 호출하는 경우를 도식화한 경우이다.
조금 더 Flow를 자세히하면 다음와 같다.
- A pod에서 Cluster 내/외부 DNS 요청한다.
- DNS 요청은 kube-dns의 service cluseter ip로 요청을 한다. - kube-dns는 coredns 2개 pod을 endpoints로 잡고 있다.
3. 최종적으로는 coredns pod에 DNS 요청을 하게 되고, 해당 DNS에 대한 응답을 한다.
4. A pod은 coredns에서 전달받은 IP로 통신을 하게 된다.
coredns로 요청 또는 에러 로그를 보기 위해서는 어떻게 해야할까?
예상 가능하지만 codedns의 pod log를 보면 된다. 하지만 기본값은 dns 요청에 대한 로그를 남기지 않는다.
모든 dns 요청을 남기면 log가 너무 많기 때문에 기본값을 조정하는 것 같다. 그렇지만 방법이 없는것도 아니다.
coredns 설정 파일(kube-system.coredns의 configmap)을 수정하고 coredns deploy를 재시작해주면 된다.
- 만약 dns troubleshooting을 해야 한다면, coredns configmap을 수정해서 하면 된다.
이외에도 /etc/resolv.conf 을 보면 search, options이 존재한다.
한번에 모든걸 다 알 수는 없으므로 오늘은 coredns에 대한 개념과 구조에 대해서만 알아보고 다음에 추가로 찾아보자!
'기술 이모저모 > [K8s] Kubernetes' 카테고리의 다른 글
[k8s] helm upgrade fail, remove api 조치 방안 (2) | 2023.02.05 |
---|---|
[k8s] EKS AWS VPC CNI 정리 (0) | 2023.01.29 |
[k8s] Devops kubenetes command tip (0) | 2023.01.18 |
[k8s] Helm이란? Helm 구성과 필수개념 (0) | 2023.01.01 |
[k8s] Kubernetes Init Containers 개념 (0) | 2022.10.25 |