Kubernetes, K8s로도 알려진 오픈소스 오케스트레이션 시스템은 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하기 위한 시스템입니다. 이 시스템의 이식성, 유연성 및 자동 확장 기능 덕분에 널리 사용되고 있습니다. 무엇보다도 가장 뛰어난 기능 중 하나는 서비스 및 포드에 대한 DNS 레코드를 생성하는 옵션으로, 이는 다른 소프트웨어 시스템과 비교할 수 없는 강점입니다. Kubernetes DNS 서비스를 사용하면 IP 주소 대신 일관된 DNS 이름으로 서비스에 연결할 수 있습니다.
전제 조건
이 튜토리얼을 최대한 활용하고 Kubernetes DNS 서비스를 더 잘 이해하려면, 먼저 다음 내용을 복습해 두시기 바랍니다: Kubernetes 기본 사항. 또한, DNS 개념을 더 잘 이해하기 위해 DNS 용어, 구성 요소 및 개념 개요를 읽어보시는 것도 도움이 됩니다. 아울러, Docker 생태계 개요 및 컨테이너화 기술 의 기본을 알아두시면 큰 도움이 될 것입니다.
DNS 시스템이란 무엇인가요?
도메인 네임 시스템(DNS)은 IP 주소와 같이 기억하기 쉬운 이름과 다양한 종류의 정보를 연결하는 메커니즘입니다. DNS 시스템을 사용하여 요청 이름을 IP 주소로 변환하면 최종 사용자가 대상 도메인 이름에 쉽게 도달할 수 있습니다. 대부분의 Kubernetes 클러스터에는 서비스 검색을 위한 경량화된 접근 방식을 제공하기 위해 기본적으로 구성된 내부 DNS 서비스가 포함되어 있습니다. 포드와 서비스가 생성, 삭제되거나 노드 간에 이동할 때도 내장된 서비스 검색 기능 덕분에 애플리케이션이 Kubernetes 클러스터를 식별하고 통신하는 과정이 간소화됩니다.
최근 Kubernetes 버전에서는 Kubernetes DNS 서비스의 기술적 세부 사항이 변경되었습니다. 이 튜토리얼은 Kubernetes DNS 서비스의 kube-dns 및 CoreDNS 구현을 모두 소개하는 것을 목표로 합니다. 우리는 Kubernetes DNS 레코드를 자세히 알아보고 Kubernetes DNS가 어떻게 작동하는지 시연해 보겠습니다.
Kubernetes DNS 서비스에는 무엇이 포함되어 있나요?
이전에는 버전 1.11 출시 전까지 Kubernetes DNS 서비스가 kube-dns를 기반으로 했습니다. 그러나 보안 및 개인 정보 보호는 여전히 심각한 문제였습니다. 이후 Kubernetes 커뮤니티는 kube-dns의 보안 및 안정성 문제를 해결하기 위해 새 버전 1.11에서 CoreDNS를 도입했습니다.
DNS 레코드를 처리하기 위해 어떤 소프트웨어 버전을 사용하든, kube-dns와 CoreDNS는 유사한 방식으로 작동합니다:
- 하나의 kube-dns 서비스와 하나 이상의 포드가 생성됩니다.
- The kube-dns 서비스는 서비스 및 엔드포인트 이벤트에 대해 Kubernetes API를 모니터링하고 이에 따라 DNS 항목을 변경합니다. 생성, 편집 또는 삭제 작업으로 이러한 Kubernetes 서비스 및 관련 포드를 수정하면 이러한 이벤트가 자동으로 트리거됩니다.
- Kubelet은 kube-dns 서비스의 클러스터 IP를 모든 새 포드의 etc/resolv.conf nameserver 옵션에 할당하며, 더 짧은 호스트 이름을 허용하기 위해 적절한 search 설정도 함께 할당합니다:
|
1 2 3 |
nameserver 10.32.0.10 search namespace.svc.cluster.local svc.cluster.local cluster.local options ndots:5 |
-
그러면 컨테이너화된 애플리케이션은 example-service.namespace 와 같은 호스트 이름을 적절한 클러스터 IP 주소로 해석할 수 있습니다.
Kubernetes DNS 레코드 개요
예시를 통해 Kubernetes DNS 레코드를 더 잘 이해해 보겠습니다. Kubernetes 서비스의 전체 DNS A 레코드는 다음과 같습니다:
service.namespace.svc.cluster.local
포드는 포드의 실제 IP 주소를 나타내는 다음과 같은 형식의 레코드를 갖게 됩니다:
10.32.0.125.namespace.pod.cluster.local
또한, Kubernetes 서비스의 지정된 포트에 대해 SRV 레코드가 생성됩니다:
|
1 |
_port-name._protocol.service.namespace.svc.cluster.local |
결과적으로, 내장된 DNS 기반 서비스 검색 메커니즘 덕분에 애플리케이션이나 마이크로서비스는 간단하고 일관된 호스트 이름을 호출하여 클러스터의 다른 서비스나 포드에 도달할 수 있습니다.
더 짧은 호스트 이름 해석 및 도메인 검색
다음에 설정된 검색 도메인 접미사 덕분에 다른 서비스에 액세스하기 위해 항상 전체 호스트 이름을 사용할 필요는 없습니다. resolv.conf 파일. 동일한 네임스페이스에 있는 서비스에 연결하는 경우, 이름만으로 호출할 수 있습니다:
|
1 |
other-service |
서비스가 다른 네임스페이스에 있는 경우 쿼리에 other-service 를 추가하세요:
|
1 |
other-service.other-namespace |
파드를 대상으로 하는 경우 최소한 다음을 사용해야 합니다:
|
1 |
pod-ip.other-namespace.pod |
기본 .svc 접미사만 자동으로 완성됩니다. resolv.conf 파일에서. 따라서 다음과 같이 설정을 지정하는 것이 필수적입니다. .pod까지. 다음으로, 지금까지 알아본 두 가지 대안적인 Kubernetes DNS 구현의 복잡한 세부 사항을 살펴보겠습니다.
Kubernetes DNS 구현
Kubernetes 버전 1.11은 kube-dns 서비스를 관리하기 위한 새로운 소프트웨어를 제공했습니다. 이는 이전 섹션에서 언급한 바와 같습니다. 새로운 업데이트의 주된 이유는 서비스의 성능과 보안을 개선하기 위함이었습니다. 처음부터 kube-dns 통합으로 시작해 보겠습니다.
-
kube-dns
이전 Kubernetes 1.11 버전에서 kube-dns 서비스는 kube-dns 파드의 kube-system 네임스페이스에서 작동하는 세 개의 컨테이너를 가지고 있었습니다. 아래의 세 컨테이너를 살펴보세요:
- kube-dns: SkyDNS를 실행하고 DNS 쿼리 확인 서비스 역할을 하는 컨테이너입니다.
- dnsmasq: SkyDNS 응답은 일반적인 경량 DNS 확인자이자 캐시인 dnsmasq에 의해 캐싱됩니다.
- sidecar: 메트릭 보고를 수행하고 헬스 체크에 반응하는 서비스 측면의 컨테이너입니다.
CoreDNS는 Dnsmasq의 보안 취약성과 SkyDNS의 확장성 성능 우려의 결과로 만들어졌습니다.
-
CoreDNS
새로운 Kubernetes DNS 서비스인 CoreDNS는 Kubernetes 1.11에서 정식 버전(General Availability)으로 업그레이드되었습니다. 이는 프로덕션 환경에서 사용할 준비가 되었음을 의미하며, 많은 설치 도구 및 관리형 Kubernetes 제공업체에서 기본 클러스터 DNS 서비스로 사용될 것입니다.
CoreDNS 는 Kubernetes DNS 클러스터 역할을 하는 유연하고 확장 가능한 DNS 서버입니다. 이전 시스템의 모든 기능을 수행합니다. DNS 컨테이너는 DNS 쿼리를 확인하고 캐싱하는 역할을 담당합니다. CoreDNS는 단일 컨테이너에서 헬스 체크에 응답하고 메트릭을 제공합니다. 또한 몇 가지 사소한 결함을 해결하고 성능 및 보안 문제를 해결하기 위한 새로운 기능을 제공합니다:
- stubDomains 사용과 외부 서비스 간의 일부 충돌이 해결되었습니다.
- 일부 엔트리가 반환되는 순서를 무작위화함으로써, CoreDNS는 DNS 기반 라운드 로빈 로드 밸런싱을 개선할 수 있습니다..
- By being better about iterating over each of the search domain suffixes defined in resolv.conf에 정의된 각 검색 도메인 접미사를 더 효율적으로 반복함으로써, autopath 라는 기능은 외부 호스트 이름을 확인할 때 DNS 응답 시간을 단축할 수 있습니다.
- 파드가 존재하지 않더라도 kube-dns 10.32.0.125.namespace.pod.cluster.local 은 항상 확인됩니다 10.32.0.125. CoreDNS는 올바른 IP 주소와 네임스페이스를 가진 파드가 존재하는 경우에만 확인하는 파드 검증(pods validated) 모드를 제공합니다.
Kubernetes endpoints, autopaths, 그리고 wildcards에 대한 지식을 넓히려면, 어떻게 Kubernetes가 클러스터에서 영역 데이터를 읽을 수 있도록 지원하는지에 대한 튜토리얼을 확인해 보세요.
사용자 정의 기능
Kubernetes의 사용자 정의 DNS 서비스 덕분에 DNS 파드를 구성하고 클러스터의 DNS 확인을 사용자 정의할 수 있습니다. 관리자는 이러한 서비스를 활용하여 resolv.conf에 정의된 업스트림 네임서버 또는 검색 도메인 접미사를 변경할 수 있습니다. 무엇보다도, dnsConfig 옵션을 사용하여 파드와 컨테이너를 개인화할 수 있는 애드온 기능이 있습니다:

이 구성을 업데이트하면 파드의 resolv.conf가 강제로 다시 작성되어 변경 사항이 적용됩니다. 위의 설정은 nameserver 203.0.113.44 및 search custom.dns.local 행이 포함된 파일을 생성하며, 이는 일반적인 resolv.conf 옵션으로 직접 전달됩니다.
결론
이 튜토리얼에서는 Kubernetes DNS 서비스의 기본 사항과 다양한 버전에서의 구현 방법을 살펴보았습니다. 또한 예제를 통해 Kubernetes DNS 레코드에 대해서도 알아보았습니다. 아울러, 파드(pod)를 사용자 정의하고 DNS 쿼리를 해결하기 위한 몇 가지 추가 구성 옵션도 살펴보았습니다. 이것으로 Kubernetes DNS 서비스의 기본 사항을 다루었지만, 여기서 학습을 멈추지 마세요. 공식 Kubernetes 문서를 확인하여 이 주제에 대해 더 자세히 알아보세요.
DevOps 지식을 넓히고 Kubernetes 필수 개념을 깊이 있게 배우려면 다음 튜토리얼을 저희 블로그에서 확인해 보세요.:
- Helm 소개: Kubernetes용 패키지 관리자
- Ubuntu 20.04에 Kubernetes를 설치하고 사용하는 방법
- Ubuntu 18.04에서 Kubernetes 클러스터에 PHP 애플리케이션 배포하기
즐거운 컴퓨팅 되세요!
댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.