다음을 통해 공유


AKS 클러스터에서 실시간으로 DNS 오류 문제 해결

Kubernetes 내의 DNS(도메인 이름 시스템) 문제는 Pod, 서비스 및 외부 리소스 간의 통신을 방해하여 애플리케이션 오류 및 성능 저하를 초래합니다. 이 문서에서는 AKS(Azure Kubernetes Service) 클러스터에서 DNS 오류를 실시간으로 해결하는 방법을 설명합니다.

참고 항목

이 문서에서는 Pod 가이드 내에서 DNS 확인 오류 문제를 보완합니다.

증상

다음 표에서는 AKS 클러스터에서 관찰할 수 있는 일반적인 증상에 대해 간략하게 설명합니다.

증상 설명
높은 오류율 DNS 쿼리는 실패하거나 예기치 않은 결과를 반환하며, 이는 해당 쿼리에 의존하는 애플리케이션의 성능 및 안정성에 영향을 줄 수 있습니다.
응답하지 않는 서비스 DNS 쿼리를 해결하는 데 평소보다 시간이 오래 걸리기 때문에 이를 사용하는 애플리케이션에서 지연 또는 시간 초과가 발생할 수 있습니다.
서비스 검색이 영향을 받았습니다. 애플리케이션은 DNS 문제로 인해 클러스터에서 다른 애플리케이션을 찾을 수 없으므로 서비스 중단 또는 오류가 발생할 수 있습니다.
외부 통신이 영향을 받았습니다. 애플리케이션은 DNS 문제로 인해 클러스터 외부의 외부 리소스 또는 엔드포인트에 액세스하는 데 문제가 있으며 이로 인해 오류가 발생하거나 성능이 저하될 수 있습니다.

필수 조건

AKS 클러스터에서 DNS 오류를 해결하려면 다음 섹션의 지침을 사용합니다.

1단계: 클러스터 전체에서 실패한 DNS 응답 파악

DNS 가젯을 사용하여 클러스터 전체에서 실패한 모든 DNS 응답을 식별할 수 있습니다. 이 검사를 수행하려면 다음 명령을 사용하여 모든 노드에서 DNS 패킷을 추적하고 실패한 응답을 필터링합니다.

$ kubectl gadget trace dns --all-namespaces --output columns=k8s,name,qtype,rcode --filter qr:R --filter qtype:A --filter 'rcode:!No Error'
K8S.NODE         K8S.NAMESPACE    K8S.POD     K8S.CONTAINER    NAME                  QTYPE        RCODE 
aks-agen...      default          test-pod    nginx            myaks-troubleshoot.   A            Non-Existent Domain 
aks-agen...      default          test-pod    nginx            myaks-troubleshoot.   A            Non-Existent Domain 

명령 매개 변수에 대한 설명은 다음과 같습니다.

  • --all-namespaces: 모든 네임스페이스의 Pod 데이터를 표시합니다.
  • -output columns=k8s,name,qtype,rcode: Kubernetes 정보, DNS 이름, 쿼리 형식 및 DNS 쿼리 결과만 표시합니다.
  • --filter qr:R: DNS 응답만 일치합니다.
  • --filter qtype:A: IPv4 호스트 주소만 일치합니다.
  • --filter 'rcode:!No Error': 포함되지 않은 DNS 응답과 일치합니다 No Error. 자세한 내용은 가능한 rcode 값 또는 관련 RFC를 참조 gopacket 하세요.

다음은 DNS 응답 실패의 몇 가지 원인입니다.

  • 확인 중인 DNS 이름에 오타가 있습니다.
  • 업스트림 DNS 이름 서버에서 문제가 발생합니다.
  • 확장 후 DNS 이름이 유효하지 않습니다. Pod /etc/resolv.conf를 사용하여 DNS 쿼리를 확장하는 방법을 이해하려면 서비스의 네임스페이스를 참조 하세요.

2단계: 클러스터 전체에서 느린 DNS 쿼리 파악

DNS 가젯을 사용하여 클러스터 전체에서 느린 DNS 쿼리를 모두 식별할 수 있습니다. 이 검사를 수행하려면 모든 노드에서 DNS 패킷을 추적하고 느린 응답을 필터링합니다.

다음 예제에서는 대기 시간 값을 5ms 사용하여 느린 패킷을 정의합니다. 다음과 같이 5μs20ms1s원하는 값으로 변경할 수 있습니다.

$ kubectl gadget trace dns --all-namespaces --output columns=k8s,name,rcode,latency --filter 'latency:>5ms'
K8S.NODE        K8S.NAMESPACE      K8S.POD       K8S.CONTAINER      NAME                            RCODE              LATENCY            
aks-agen...     kube-system        coredn...     coredns            global.prod.micro...            No Error           5.373123ms 
aks-agen...     kube-system        coredn...     coredns            global.prod.micro...            No Error           5.373123ms 

명령 매개 변수에 대한 설명은 다음과 같습니다.

  • --all-namespaces: 모든 네임스페이스의 Pod 데이터를 표시합니다.
  • --output columns=k8s,name,rcode,latency: Kubernetes 정보, DNS 이름, DNS 응답 결과 및 응답 대기 시간만 표시합니다.
  • --filter 'latency:>5ms': 대기 시간이 최소 5 ms인 DNS 응답만 일치합니다.

다음은 느린 DNS 쿼리의 몇 가지 원인입니다.

3단계: 업스트림 DNS 서버의 상태 확인

DNS 가젯을 사용하여 CoreDNS에서 사용하는 업스트림 DNS 서버의 상태를 확인할 수 있습니다. 애플리케이션이 외부 도메인에 도달하려고 하면 쿼리가 CoreDNS를 통해 업스트림 DNS 서버로 전달됩니다. 이러한 쿼리의 상태를 이해하려면 CoreDNS Pod에서 나가는 DNS 패킷을 추적하고 이름 서버로 필터링합니다.

다음 예제 에서는 기본 Azure DNS 서버 (IP 주소 168.63.129.16)가 업스트림 이름 서버로 사용됩니다. 사용자 지정 DNS 서버를 사용하는 경우 사용자 지정 DNS 서버의 IP 주소를 업스트림 이름 서버로 사용할 수 있습니다. 노드에서 /etc/resolv.conf를 조회하여 IP 주소를 가져올 수 있습니다.

$ kubectl gadget trace dns -n kube-system -l k8s-app=kube-dns -o columns=k8s,id,qr,name,rcode,nameserver,latency -F nameserver:168.63.129.16
K8S.NODE    K8S.NAMESPACE   K8S.POD                        K8S.CONTAINER   ID        QR    NAME               RCODE           NAMESERVER              LATENCY
aks-agen... kube-system     coredns-6d5bb68c46-ntz2q       coredns         b256      Q     microsoft.com.                     168.63.129.16
aks-agen... kube-system     coredns-6d5bb68c46-ntz2q       coredns         b256      R     microsoft.com.     No Error        168.63.129.16           500.821223ms

명령 매개 변수에 대한 설명은 다음과 같습니다.

  • -n kube-system: 네임스페이스의 kube-system 데이터만 표시합니다.
  • -l k8s-app=kube-dns: 레이블 k8s-app=kube-dns 이 있는 Pod의 데이터만 표시합니다(CoreDNS Pod).
  • -o columns=k8s,id,name,rcode,nameserver,latency: Kubernetes 정보, DNS 쿼리 ID, 쿼리/응답, DNS 이름, DNS 응답 결과, 이름 서버 및 응답 대기 시간만 표시합니다.
  • -F nameserver:168.63.129.16: 이벤트를 필터링하는 데 사용되는 업스트림 DNS 서버입니다.

RCODELATENCY 값을 사용하여 ID업스트림 DNS 서버의 상태를 확인할 수 있습니다. 예를 들어 비정상 업스트림 서버가 있는 경우 다음 출력이 표시됩니다.

  • DNS 쿼리(QR=Qb256: ID )에 일치하는 응답이 없습니다.
  • DNS 응답(QR=R)은 열 아래에 LATENCY 높은 값(예: )을 가집니다 500.821223ms.
  • DNS 응답(QR=R)에는 RCODE "서버 오류" 및 "쿼리 거부됨"과 같은 다른 No Error응답이 있습니다. 자세한 내용은 가능한 rcode 값을 참조 gopacket 하세요.

4단계: DNS 쿼리가 적시에 응답을 가져오는지 확인

DNS 가젯을 사용하여 특정 DNS 쿼리가 적시에 응답을 받는지 확인할 수 있습니다. 이 검사를 수행하려면 DNS 이름으로 이벤트를 필터링하고 쿼리/응답 ID와 일치합니다.

$ kubectl gadget trace dns -l app=test-pod --output columns=k8s,id,qtype,qr,name,rcode,latency --filter name:microsoft.com.
K8S.NODE       K8S.NAMESPACE   K8S.POD     K8S.CONTAINER   ID          QTYPE     QR  NAME              RCODE               LATENCY
aks-agen...    default         test-pod    nginx           97b3        A         Q   microsoft.com.
aks-agen...    default         test-pod    nginx           97b3        A         R   microsoft.com.    No Error            1.954413ms
aks-agen...    default         test-pod    nginx           97b3        A         R   microsoft.com.    No Error
aks-agen...    default         test-pod    nginx           c6c5        AAAA      Q   microsoft.com.
aks-agen...    default         test-pod    nginx           c6c5        AAAA      R   microsoft.com.    No Error            1.885412ms
aks-agen...    default         test-pod    nginx           c6c5        AAAA      R   microsoft.com.    No Error

명령 매개 변수에 대한 설명은 다음과 같습니다.

  • -l app=test-pod: 레이블 app=test-pod이 있는 Pod의 데이터만 표시합니다.
  • --output columns=k8s,id,qtype,qr,name,rcode,latency: Kubernetes 정보, DNS 쿼리 ID, 쿼리 유형, 쿼리/응답, DNS 이름, DNS 응답 결과 및 응답 대기 시간만 표시합니다.
  • --filter name:microsoft.com.: DNS 이름과 microsoft.com. DNS 패킷만 일치하여 필터 값이 FQDN(정규화된 도메인 이름)이 되도록 하려면 이름 끝에 점(.)을 추가합니다.

값(예: 97b3)을 ID 사용하여 쿼리를 응답과 상호 연결할 수 있습니다. 값을 사용하여 LATENCY 적시에 응답을 가져오는지 확인할 수도 있습니다.

5단계: DNS 응답에 예상 IP 주소가 포함되어 있는지 확인

DNS 가젯을 사용하여 특정 DNS 쿼리가 예상 응답을 가져오는지 확인할 수 있습니다. 예를 들어 헤드리스 서비스(myheadless라는 이름)의 경우 응답에 모든 Pod의 IP 주소가 포함됩니다.

$ kubectl gadget trace dns -l app=test-pod  -o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses  -F name:~myheadless 
K8S.NODE         K8S.NAMESPACE      K8S.POD         K8S.CONTAINER   ID    QTYPE   QR  NAME                 RCODE           NUMANSWERS     ADDRESSES
aks-agen...      default            test-pod        nginx           f930  A       R   myheadless.defau...  No Error        2              10.244.2.18,10.244.2.19 
aks-agen...      default            test-pod        nginx           f930  A       R   myheadless.defau...  No Error        2              10.244.2.18,10.244.2.19 
aks-agen...      default            test-pod        nginx           f930  A       Q   myheadless.defau...                  0                              

명령 매개 변수에 대한 설명은 다음과 같습니다.

  • -l app=test-pod: 레이블 app=test-pod이 있는 Pod의 데이터만 표시합니다.
  • -o columns=k8s,id,qtype,qr,name,rcode,numAnswers,addresses: Kubernetes 정보, DNS 쿼리 ID, 쿼리 유형, 쿼리/응답, DNS 이름, DNS 응답 결과, 응답 수 및 IP 주소만 표시합니다.
  • -F name:~myheadless: regex 검사를 통과하는 ~myheadless DNS 패킷만 포함합니다.

NUMANSWERS ADDRESSES 값을 사용하여 가져오는 kubectl get ep myheadless값과 일치시킬 수 있습니다.

$ kubectl get ep myheadless 
NAME                  ENDPOINTS                           AGE 
myheadless            10.244.2.18:8080,10.244.2.19:8080   10d 

타사 정보 고지 사항

이 문서에 나와 있는 다른 공급업체 제품은 Microsoft와 무관한 회사에서 제조한 것입니다. Microsoft는 이들 제품의 성능이나 안정성에 관하여 명시적이든 묵시적이든 어떠한 보증도 하지 않습니다.

도움을 요청하십시오.

질문이 있거나 도움이 필요한 경우 지원 요청을 생성하거나Azure 커뮤니티 지원에 문의하세요. Azure 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.