AKS 클러스터에서 실시간으로 DNS 오류 문제 해결
Kubernetes 내의 DNS(도메인 이름 시스템) 문제는 Pod, 서비스 및 외부 리소스 간의 통신을 방해하여 애플리케이션 오류 및 성능 저하를 초래합니다. 이 문서에서는 AKS(Azure Kubernetes Service) 클러스터에서 DNS 오류를 실시간으로 해결하는 방법을 설명합니다.
참고 항목
이 문서에서는 Pod 가이드 내에서 DNS 확인 오류 문제를 보완합니다.
증상
다음 표에서는 AKS 클러스터에서 관찰할 수 있는 일반적인 증상에 대해 간략하게 설명합니다.
증상 | 설명 |
---|---|
높은 오류율 | DNS 쿼리는 실패하거나 예기치 않은 결과를 반환하며, 이는 해당 쿼리에 의존하는 애플리케이션의 성능 및 안정성에 영향을 줄 수 있습니다. |
응답하지 않는 서비스 | DNS 쿼리를 해결하는 데 평소보다 시간이 오래 걸리기 때문에 이를 사용하는 애플리케이션에서 지연 또는 시간 초과가 발생할 수 있습니다. |
서비스 검색이 영향을 받았습니다. | 애플리케이션은 DNS 문제로 인해 클러스터에서 다른 애플리케이션을 찾을 수 없으므로 서비스 중단 또는 오류가 발생할 수 있습니다. |
외부 통신이 영향을 받았습니다. | 애플리케이션은 DNS 문제로 인해 클러스터 외부의 외부 리소스 또는 엔드포인트에 액세스하는 데 문제가 있으며 이로 인해 오류가 발생하거나 성능이 저하될 수 있습니다. |
필수 조건
Azure CLI
Azure CLI를 설치하려면 Azure CLI를 설치하는 방법을 참조하세요.
Kubernetes 명령줄 도구 kubectl과 같이 클러스터에 연결하는 도구 입니다.
Azure CLI를 사용하여 kubectl을 설치하려면 az aks install-cli 명령을 실행합니다.
-
이 도구는 이 문서에서 다루는 대부분의 문제 해결 단계에서 사용되므로 클러스터에 설치해야 합니다. AKS 클러스터에 설치하려면 AKS 클러스터에 Inspektor 가젯을 설치하는 방법을 참조하세요.
가젯에 대한 친숙함.
-
다음 모든 문제 해결 단계에서 사용됩니다.
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μs
20ms
1s
원하는 값으로 변경할 수 있습니다.
$ 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 쿼리의 몇 가지 원인입니다.
- 업스트림 DNS 이름 서버에서 문제가 발생합니다.
- 클러스터의 네트워킹 문제입니다.
- CoreDNS Pod를 사용할 수 없습니다. Pod가 잘 실행되고 있는지 확인하려면 Pod 내에서 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 서버입니다.
및 RCODE
LATENCY
값을 사용하여 ID
업스트림 DNS 서버의 상태를 확인할 수 있습니다. 예를 들어 비정상 업스트림 서버가 있는 경우 다음 출력이 표시됩니다.
- DNS 쿼리(
QR=Q
예b256
: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 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.