본문 바로가기
MLOps/Doker & Kubernetes

Udemy CKA 강의 정리 223: CoreDNS in kubernetes

by 공부하는 무니 2023. 1. 25.
반응형

해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.

⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.


이 강의에서는 Kubernetes가 클러스터에서 DNS를 구현하는 방법에 대해 설명합니다. 이전 강의에서는 다른 파드에서 서비스 또는 파드를 어드레싱하는 방법을 살펴보았습니다. 이번 강의에서는 Kubernetes가 어떻게 이를 가능하게 하는지 살펴보겠습니다.

2개의 IP 주소가 있는 2개의 파드이 주어졌다고 가정하면 어떻게 하시겠습니까? DNS에 대한 필수 강의에서 배운 내용을 기반으로 서로를 해결하는 쉬운 방법은 각각의 etc 호스트 파일에 항목을 추가하는 것입니다. 첫 번째 파드에서 두 번째 파드인 web은 10.244.2.5에 있고 두 번째 파드에서는 첫 번째 파드인 test가 10.244.1.5에 있다고 말할 수 있습니다. 물론 클러스터에 수천 개의 파드가 있고 매분 수백 개가 생성 및 삭제되는 경우 이는 적합한 솔루션이 아닙니다.

따라서 이러한 항목을 중앙 DNS 서버로 이동합니다. 그런 다음 etc/resolv.conf 파일에 항목을 추가하고 이름 서버가 DNS 서버의 IP 주소(이 경우 10.96.0.10)에 있음을 지정하여 이러한 파드를 DNS 서버로 지정합니다. 새 파드가 생성될 때마다 다른 파드가 새 파드에 액세스하고 파드의 etc/resolv.conf 파일이 DNS 서버를 가리키도록 구성할 수 있도록 해당 파드의 DNS 서버에 레코드를 추가합니다. 새 파드가 클러스터의 다른 파드를 확인할 수 있도록 합니다. 이것은 쿠버네티스가 수행하는 방식과 비슷하지만 이전 강의에서 본 것처럼 파드 이름을 IP 주소에 매핑하기 위해 파드에 대한 유사한 항목을 생성하지 않습니다. 서비스를 위해 그렇게합니다.

파드의 경우 파드의 IP 주소에서 점을 대시로 대체하여 호스트 이름을 구성합니다. Kubernetes는 동일한 방식으로 DNS를 구현합니다. 클러스터 내에 DNS 서버를 배포합니다. 버전 1.12 이전에는 Kubernetes에 의해 구현된 DNS 서버가 Kube DNS로 알려졌으며 Kubernetes 버전 1.12에서는 권장 DNS 서버가 CoreDNS입니다. 필수 강의 중 하나에서 CoreDNS를 간략하게 살펴보았습니다. 그렇다면 클러스터에서 CoreDNS는 어떻게 설정됩니까? coreDNS 서버는 Kubernetes 클러스터의 Kube 시스템 네임스페이스에 파드로 배포됩니다. replicas 세트의 일부로 중복성을 위해 두 개의 파드로 배포됩니다. 실제로 배포 내의 replicas 세트이지만 실제로는 중요하지 않습니다. 하지만 이 강의에서는 CoreDNS를 파드로 볼 것입니다.

이 파드는 CoreDNS 실행 파일을 실행합니다. CoreDNS를 직접 배포할 때 실행한 것과 동일한 실행 파일입니다. CoreDNS에는 configuration 파일이 필요합니다. 우리의 경우 Core file이라는 파일을 사용했고 Kubernetes도 마찬가지입니다. etc/coredns에 위치한 Core File이라는 파일을 사용합니다. 이 파일에는 여러 플러그인이 구성되어 있습니다.

플러그인은 오류 처리, 상태 보고, 메트릭 모니터링, 현금 등을 위해 구성됩니다. CoreDNS가 Kubernetes와 작동하도록 하는 플러그인은 Kubernetes 플러그인입니다. 그리고 클러스터의 최상위 도메인 이름이 설정되는 곳입니다. 이 경우 cluster.local입니다. 따라서 CoreDNS DNS 서버의 모든 레코드는 이 도메인에 속합니다.

Kubernetes 플러그인에는 여러 가지 옵션이 있습니다. 여기에서 볼 수 있는 파드 옵션은 클러스터의 파드에 대한 레코드 생성을 담당합니다. IP를 파선 형식으로 변환하여 각 파드에 대해 생성되는 레코드에 대해 이야기했음을 기억하세요. default로 비활성화되어 있지만 여기에서 이 항목을 사용하여 활성화할 수 있습니다.

예를 들어 파드가 www.google.com에 도달하려고 한다고 말하면 DNS 서버가 해결할 수 없는 모든 레코드는 CoreDNS 파드 등 resolv.conf 파일에 지정된 이름 서버로 전달됩니다. etc/resolv.conf 파일은 Kubernetes 노드에서 이름 서버를 사용한다고 합니다. 또한 이 코어 파일은 configmap 오브젝트로 파드에 전달됩니다. 이렇게 하면 이 configuration을 수정해야 하는 경우 configmap 오브젝트를 편집할 수 있습니다. 이제 적절한 Kubernetes 플러그인을 사용하여 CoreDNS 파드를 실행하고 있습니다. Kubernetes 클러스터에서 새로운 파드 또는 서비스를 감시하고 파드 또는 서비스가 생성될 때마다 데이터베이스에 레코드를 추가합니다.

다음 단계는 Pod가 CoreDNS 서버를 가리키는 것입니다. 파드는 DNS 서버에 도달하기 위해 어떤 주소를 사용할까요? CoreDNS 솔루션을 배포할 때 클러스터 내의 다른 컴포넌트에서 사용할 수 있도록 서비스도 생성합니다. 서비스 이름은 default로 kube-dNS로 지정됩니다. 이 서비스의 IP 주소는 파드에서 이름 서버로 구성됩니다. 이제 직접 구성할 필요가 없습니다. 파드의 DNS config은 파드가 생성될 때 Kubernetes에 의해 자동으로 수행됩니다.

이를 담당하는 Kubernetes 구성요소를 추측하고 싶으신가요? kubelet입니다. kubelet의 config 파일을 보면 그 안에 DNS 서버와 도메인의 IP가 보인다. 파드가 올바른 이름 서버로 config되면 이제 다른 파드 및 서비스를 확인할 수 있습니다. web service 또는 web service.default 또는 web service.default.svc 또는 webservice.default.svc.cluster.local를 사용하여 웹 서비스에 액세스할 수 있습니다.

NS lookup 또는 호스트 웹 서비스 명령을 사용하여 웹 서비스를 수동으로 조회하려고 하면 웹 서비스의 정규화된 도메인 이름(web-service.default.svc.cluster.local)이 반환됩니다. 하지만 당신은 그것을 요구하지 않았습니다. 당신은 방금 웹 서비스를 말했습니다다. 그렇다면 전체 이름은 어떻게 찾았을까요?
resolv.conf 파일에도 default.service.cluster.local, svc.cluster.local 및 cluster.local로 설정된 검색 항목이 있습니다. 이렇게 하면 이름, 웹 서비스 또는 웹 service.default 또는 웹 service.default.svc를 사용하여 서비스를 찾을 수 있습니다. 그러나 서비스에 대한 검색 항목만 있으므로 동일한 방식으로 포드에 연결할 수 없습니다. 이를 위해서는 포드의 전체 FQDN을 지정해야 합니다. 

반응형

댓글