Azure Kubernetes Service LocalDNS 구성

LocalDNS는 클러스터에서 실행되는 워크로드에 대한 DNS(도메인 이름 시스템) 확인 성능 및 복원력을 향상시키기 위해 설계된 AKS(Azure Kubernetes Service) 기능입니다. 각 노드에 DNS 프록시를 배포할 때 LocalDNS는 DNS 쿼리 대기 시간을 줄이고, 네트워크 중단 중에 안정성을 향상시키며, DNS 캐싱 및 전달을 위한 고급 구성 옵션을 제공합니다. 이 문서에서는 LocalDNS의 작동 방식, 구성 옵션 및 AKS 클러스터에서 LocalDNS를 사용하도록 설정, 확인 및 문제를 해결하는 방법을 설명합니다.

LocalDNS가 무엇인지, 아키텍처 세부 정보 및 주요 기능을 포함하여 알아보려면 AKS(Azure Kubernetes Service)에서의 DNS 확인을 참조하세요.

LocalDNS 구성에 대한 모범 사례

AKS 클러스터에서 LocalDNS를 구현하는 경우 다음 모범 사례를 고려합니다.

  • 최소 구성으로 시작: Preferred 모드를 사용하여 LocalDNS 구성 구문의 유효성을 검사하는 간단한 구성으로 시작한 후 Required 모드로 이동합니다. 이 모드는 Preferred LocalDNS를 사용하지 않고 구성의 유효성을 검사하므로 클러스터에 영향을 주지 않고 구성 오류를 조기에 catch할 수 있습니다.

  • 적절한 캐싱 전략 구현: 워크로드 특성에 따라 캐시 설정을 구성합니다.

    • 레코드를 자주 변경하는 경우 더 짧은 cacheDurationInSeconds 값을 사용합니다. 이렇게 할 때 cacheDurationInSeconds는 DNS 레코드 TTL의 한도 역할을 하지만 증가하지는 않는다는 점에 유의해야 합니다. 결과 TTL은 업스트림에서 반환되거나 캐시 플러그 인에 설정된 값 중 더 작습니다.
    • 안정적인 레코드의 경우 더 긴 캐시 기간을 사용하여 DNS 쿼리를 줄입니다.
    • 적절한 설정을 사용하여 serveStale DNS 중단 중에도 서비스를 유지할 수 있도록 설정하십시오.
    • LocalDNS를 사용한 캐싱은 최상의 노력으로 작동하며 부실 응답을 보장하지 않습니다. 캐시는 256개의 분할된 데이터베이스로 나뉘며 기본 최대 항목은 10,000개이므로 각 분할된 데이터베이스는 약 39개의 항목을 보유할 수 있습니다. 분할된 데이터베이스가 가득 차서 새 항목을 추가해야 하는 경우 기존 항목 중 하나가 임의로 선택되어 제거됩니다. 이전 또는 만료 항목에 대한 기본 설정은 없습니다. 따라서 부실 레코드를 항상 사용할 수 있는 것은 아니며, 특히 높은 쿼리 볼륨에서 사용할 수 있는 것은 아닙니다.
  • DNS 성능 모니터링: LocalDNS를 사용하도록 설정한 후 다음을 사용하여 애플리케이션의 DNS 성능을 모니터링합니다.

    • 애플리케이션 성능 메트릭.
    • 감소된 네트워크 압력을 감지하는 노드 메트릭입니다.
    • queryLoggingLog로 설정할 때 로그 항목을 기록합니다.
  • 최소 권한 원칙을 따릅니다. DNS 전달 규칙을 구성할 때 필요한 DNS 서버 및 도메인에 대한 액세스만 허용합니다.

  • 프로덕션 배포 전 테스트: 프로덕션 클러스터에 배포하기 전에 항상 비프로덕션 환경에서 LocalDNS 구성을 테스트합니다.

  • IaC(Infrastructure as Code) 사용: localdnsconfig.json 파일을 인프라 리포지토리에 저장하고 AKS 배포 템플릿에 포함합니다.

  • TCP 전달을 위한 네트워크 구성: VnetDNS에 DNS 전달에 TCP를 사용하는 경우 NSG(네트워크 보안 그룹), 방화벽 또는 NVA(네트워크 가상 어플라이언스)가 CoreDNS/LocalDNS 및 VnetDNS 서버 간의 TCP 트래픽을 차단하지 않는지 확인합니다.

  • NodeLocal DNSCache와 LocalDNS를 모두 사용하도록 설정하지 마세요. 노드 풀에서 업스트림 Kubernetes NodeLocal DNSCache 및 LocalDNS를 모두 사용하도록 설정하는 것은 권장되지 않습니다. AKS가 이 구성을 차단하지는 않지만 모든 DNS 트래픽은 LocalDNS를 통해 라우팅되므로 NodeLocal DNSCache의 예기치 않은 동작 또는 감소된 이점이 발생할 수 있습니다.

필수 조건

  • LocalDNS를 사용하려면 Kubernetes 버전 1.31 이상이 있는 기존 AKS 클러스터가 있어야 합니다. AKS 클러스터가 필요한 경우 Azure CLI, Azure PowerShell 또는 Azure 포털 사용하여 만들 수 있습니다.

  • 이 문서에는 Azure CLI 버전 2.80.0 이상이 필요합니다. Azure Cloud Shell 사용하는 경우 최신 버전이 이미 설치되어 있습니다.

  • LocalDNS는 Linux 또는 Ubuntu 22.04 이상에서 Azure 실행되는 노드 풀에서만 지원됩니다.

  • 노드 풀에 사용되는 VM(Virtual Machine) SKU는 LocalDNS를 지원하려면 4개 이상의 vCPU(코어)가 있어야 합니다.

  • LocalDNS는 ACNS(Advanced Container Networking Services)의 적용된 FQDN(정규화된 도메인 이름) 필터 정책과 호환되지 않습니다.

AKS 클러스터에서 LocalDNS 관리

LocalDNS는 AKS의 노드 풀 수준에서 구성됩니다. 즉, 클러스터의 각 노드 풀에 대해 LocalDNS를 독립적으로 사용하거나 사용하지 않도록 설정할 수 있습니다. 이렇게 하면 다양한 워크로드 또는 환경의 특정 요구 사항에 따라 DNS 확인 동작이 조정됩니다. 노드 풀에서 LocalDNS를 사용하도록 설정하려면 해당 노드 풀에 대해 LocalDNS가 작동하는 방식을 정의하는 localdnsconfig.json 구성 파일을 제공해야 합니다.

비고

NAP(노드 자동 프로비저닝)를 사용하는 경우 NAP에서 LocalDNS 를 사용하도록 설정하는 방법에 대한 지침은 LocalDNS 구성을 참조하세요.

노드 풀을 만드는 동안 LocalDNS를 사용하도록 설정하려면 사용자 지정 구성 파일과 함께 다음 명령을 사용합니다.

az aks nodepool add --name mynodepool1 --cluster-name myAKSCluster --resource-group myResourceGroup --localdns-config ./localdnsconfig.json

기존 노드 풀에서 LocalDNS를 사용하도록 설정하려면 사용자 지정 구성 파일과 함께 다음 명령을 사용합니다.

az aks nodepool update --name mynodepool1 --cluster-name myAKSCluster --resource-group myResourceGroup --localdns-config ./localdnsconfig.json

중요합니다

노드 풀에서 LocalDNS를 사용하도록 설정하면 해당 풀 내의 모든 노드에서 이미지 다시 설치 작업이 시작됩니다. 이 프로세스로 인해 워크로드 실행이 일시적으로 중단될 수 있으며 제대로 관리되지 않는 경우 애플리케이션 가동 중지 시간이 발생할 수 있습니다. 이 설정을 사용하도록 설정하기 전에 잠재적인 서비스 중단을 계획하고 애플리케이션이 고가용성을 위해 구성되었거나 적절한 중단 예산이 있는지 확인해야 합니다.