이 페이지에서는 Google Kubernetes Engine (GKE)에서 Cloud DNS 관련 문제를 해결하는 방법을 보여줍니다.
Cloud DNS에서 DNS 문제의 원인 파악
dial tcp: i/o timeout
, no such
host
, Could not resolve host
과 같은 오류는 Cloud DNS의 쿼리 확인 기능에 문제가 있음을 나타내는 경우가 많습니다.
이러한 오류 중 하나가 표시되었지만 원인을 모르는 경우 다음 섹션을 참고하여 원인을 찾으세요. 섹션은 가장 도움이 될 만한 단계부터 시작되도록 정렬되어 있으므로 각 섹션을 순서대로 시도해 보세요.
기본 설정 확인
포드가 DNS 조회를 확인할 수 없는 경우 Cloud DNS가 원하는 방식으로 구성되어 있는지 확인하세요. 이 섹션에서는 Cloud DNS를 사용 중인지 확인하고, GKE 클러스터의 비공개 DNS 영역이 있는지 확인하고, 대상 서비스의 DNS 레코드가 정확한지 확인하는 데 도움이 됩니다.
이러한 설정을 확인하려면 다음 명령어를 완료합니다.
포드에서 사용 중인 DNS 서버를 확인합니다.
kubectl exec -it POD_NAME -- cat /etc/resolv.conf | grep nameserver
POD_NAME
을 DNS 확인에 문제가 있는 포드의 이름으로 바꿉니다.Cloud DNS를 사용하는 경우 출력은 다음과 같습니다.
nameserver 169.254.169.254
다른 값이 표시되면 Cloud DNS를 사용하고 있지 않은 것입니다. Cloud DNS가 올바르게 사용 설정되었는지 확인합니다.
관리 ZONE이 있는지 확인합니다.
gcloud dns managed-zones list --format list
출력은 다음과 비슷합니다.
- creationTime: 2021-02-12T19:24:37.045Z description: Private zone for GKE cluster "" with cluster suffix "CLUSTER_DOMAIN" in project "PROJECT_ID" dnsName: CLUSTER_DOMAIN. id: 5887499284756055830 kind: dns#managedZone name: gke-CLUSTER_NAME-aa94c1f9-dns nameServers: ['ns-gcp-private.googledomains.com.'] privateVisibilityConfig: {'kind': 'dns#managedZonePrivateVisibilityConfig'} visibility: private
이 출력에는 다음 값이 포함됩니다.
CLUSTER_DOMAIN
: 클러스터에 자동으로 할당된 DNS 도메인 서픽스입니다.PROJECT_ID
: 프로젝트 ID입니다.CLUSTER_NAME
: 비공개 영역이 있는 클러스터의 이름입니다.
이 출력에서
name
필드의 값은Google Cloud 에서gke-CLUSTER_NAME-aa94c1f9-dns
라는 영역을 만들었음을 보여줍니다.관리 영역이 표시되지 않으면 클러스터에 비공개 영역이 생성되지 않았거나 올바르게 인증되지 않았을 수 있습니다. 문제를 해결하려면 Cloud DNS 문서의 비공개 영역을 참고하세요.
서비스의 DNS 레코드를 확인합니다.
gcloud dns record-sets list --zone ZONE_NAME | grep SERVICE_NAME
다음을 바꿉니다.
ZONE_NAME
: 비공개 영역 이름입니다.SERVICE_NAME
: 서비스의 이름입니다.
출력은 다음과 비슷합니다.
dns-test.default.svc.cluster.local. A 30 10.47.255.11
이 출력은 Cloud DNS에 도메인
dns-test.default.svc.cluster.local.
의 A 레코드가 포함되어 있고 클러스터의 IP 주소가10.47.255.11
임을 보여줍니다.레코드가 잘못된 것으로 보이면 Cloud DNS 문서의 리소스 레코드 세트 패치를 참고하여 업데이트하세요.
응답 정책 확인
응답 정책이 있고 이름이 올바른지 확인합니다.
모든 응답 정책 목록을 확인하려면 다음 단계를 따르세요.
gcloud dns response-policies list --format="table(responsePolicyName, description)"
출력은 다음과 비슷합니다.
RESPONSE_POLICY_NAME DESCRIPTION gke-CLUSTER_NAME-52c8f518-rp Response Policy for GKE cluster "CLUSTER_NAME" with cluster suffix "cluster.local." in project "gke-dev" with scope "CLUSTER_SCOPE".
이 출력에서
gke-CLUSTER_NAME-52c8f518-rp
는Google Cloud 에서gke-CLUSTER_NAME-aa94c1f9-rp
라는 비공개 영역을 만들었음을 보여줍니다.Google Cloud 에서 만드는 응답 정책에는gke-
접두사가 있습니다.특정 비공개 영역의 응답 정책을 확인합니다.
gcloud dns response-policies rules list ZONE_NAME \ --format="table(localData.localDatas[0].name, localData.localDatas[0].rrdatas[0])"
ZONE_NAME
을 문제가 발생한 비공개 영역의 이름으로 바꿉니다.출력은 다음과 비슷합니다.
1.240.27.10.in-addr.arpa. kubernetes.default.svc.cluster.local. 52.252.27.10.in-addr.arpa. default-http-backend.kube-system.svc.cluster.local. 10.240.27.10.in-addr.arpa. kube-dns.kube-system.svc.cluster.local. 146.250.27.10.in-addr.arpa. metrics-server.kube-system.svc.cluster.local.
첫 번째 열에는 규칙이 일치하는 IP 주소 또는 도메인 이름 패턴이 표시됩니다. 두 번째 열은 IP 주소와 연결된 호스트 이름입니다.
이러한 명령어의 출력에 문제가 있는 경우 Cloud DNS 문서의 응답 정책 규칙 업데이트를 참고하세요.
로그, 대시보드, 측정항목으로 조사
Cloud DNS에는 DNS 문제를 자세히 조사하는 데 도움이 되는 여러 로깅 및 모니터링 옵션이 포함되어 있습니다.
영역 및 레코드와 같은 리소스의 로그를 보려면 Cloud DNS용 Cloud Logging을 사용 설정하세요.
DNS 쿼리 차트를 보고 비공개 영역의 오류율, QPS, 99번째 백분위수 지연 시간 데이터를 확인하려면 Cloud DNS 모니터링 대시보드를 사용하세요.
DNS 쿼리의 지연 시간과 성공률을 시각화하려면 측정항목 탐색기에서
query/latencies
및query/response_count
측정항목을 사용하세요.
새 레코드 확인
로그를 검토하여 관리형 Cloud DNS 비공개 영역에 새 레코드가 생성되었는지 확인합니다. 이는 클러스터에서 갑자기 DNS 확인 실패가 발생하는 경우에 유용할 수 있습니다.
새 레코드를 확인하려면 다음 단계를 완료하세요.
Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.
쿼리 창에 다음 쿼리를 입력합니다.
resource.type="dns_managed_zone" protoPayload.request.change.additions.name="headless-svc-stateful.default.svc.cluster.local." protoPayload.methodName="dns.changes.create"
쿼리 실행을 클릭합니다.
출력을 검토합니다. 오류가 처음 발견된 시점에 해당하는 변경사항을 발견하면 되돌리는 것이 좋습니다.
맞춤 스텁 도메인 및 네임서버 확인
맞춤 스텁 도메인 또는 업스트림 네임서버가 있는 GKE 표준 클러스터를 사용하는 경우 ConfigMap을 검토하고 값이 올바른지 확인합니다.
Cloud DNS는 stubDomains
및 upstreamNameservers
값을 Cloud DNS 전달 영역으로 변환합니다. Google에서 이러한 리소스를 관리하므로 오류가 발견되면 Cloud Customer Care에 문의하여 지원을 받으세요.
클라우드 고객 지원에 문의
이전 섹션을 진행했지만 문제의 원인을 진단할 수 없는 경우 Cloud Customer Care에 문의하세요.
특정 오류 해결
특정 오류나 문제가 발생한 경우 다음 섹션의 안내를 따르세요.
문제: Compute Engine VM에서 GKE 클러스터 서비스를 확인할 수 없음
Compute Engine VM에서 GKE 클러스터 서비스를 확인할 수 없는 경우 클러스터의 Cloud DNS 범위를 확인합니다.
Cloud DNS에서 사용하는 범위에 따라 확인할 수 있는 리소스가 결정됩니다.
클러스터 범위: DNS 확인은 Kubernetes 클러스터 내의 리소스 (포드 및 서비스)로 제한됩니다. 이는 기본 설정이며 Kubernetes 클러스터 또는 GKE Virtual Private Cloud (VPC) 외부의 외부 리소스를 확인할 필요가 없는 경우에 적합합니다.
VPC 범위: DNS 변환은 Compute Engine VM과 같은 리소스를 포함하여 전체 VPC로 확장됩니다. 이렇게 하면 클러스터가 GKE 클러스터 외부이지만 동일한 VPC 내에 있는 리소스(예: Google Cloud VM)의 내부 DNS 레코드를 확인할 수 있습니다.
클러스터의 Cloud DNS 범위를 확인하려면 다음 단계를 완료하세요.
Google Cloud 콘솔에서 Kubernetes 클러스터 페이지로 이동합니다.
DNS 문제가 발생한 클러스터의 이름을 클릭합니다.
클러스터 세부정보 페이지의 클러스터 네트워킹 섹션에서 DNS 제공업체 행의 정보를 검토합니다.
Cloud DNS (클러스터 범위)가 표시되면 클러스터 범위를 사용 중인 것입니다. DNS 범위를 변경하려면 적절한 DNS 범위로 클러스터를 다시 만듭니다.
문제: Cloud DNS를 사용 설정한 후에도 포드가 계속 kube-dns를 사용함
기존 클러스터에서 Cloud DNS를 사용 설정한 후에도 포드가 kube-dns를 사용하는 경우 클러스터에서 Cloud DNS를 사용 설정한 후 노드 풀을 업그레이드하거나 다시 만들었는지 확인합니다. 이 단계가 완료될 때까지 포드는 kube-dns를 계속 사용합니다.
문제: Cloud DNS가 사용 설정된 기존 클러스터를 업데이트하거나 클러스터를 만들 수 없음
올바른 버전을 사용하고 있는지 확인합니다. GKE용 Cloud DNS에는 VPC 범위를 사용하는 클러스터의 경우 GKE 버전 1.19 이상, 클러스터 범위를 사용하는 클러스터의 경우 GKE 버전 1.24.7-gke.800, 1.25.3-gke.700 이상이 필요합니다.
문제: 클러스터에서 Cloud DNS를 사용 설정한 후 노드에서 DNS 조회 실패
커스텀 스텁 도메인이나 업스트림 네임서버가 있는 GKE 클러스터에서 클러스터 범위 Cloud DNS를 사용 설정하는 경우 Cloud DNS에서 포드 및 노드 DNS 요청을 구분하지 못하므로 클러스터의 노드와 포드 모두에 커스텀 구성이 적용됩니다. 커스텀 업스트림 서버가 쿼리를 변환할 수 없는 경우 노드에서 DNS 조회가 실패할 수 있습니다.
문제: Cloud DNS 추가 VPC 범위가 사용 설정된 클러스터를 업데이트하거나 만들 수 없음
올바른 버전을 사용하고 있는지 확인합니다. Cloud DNS 추가 VPC 범위에는 GKE 버전 1.28 이상이 필요합니다.
오류: Cloud DNS 사용 중지됨
Cloud DNS API가 중지되면 다음과 같은 이벤트가 발생합니다.
Warning FailedPrecondition service/default-http-backend
Failed to send requests to Cloud DNS: Cloud DNS API Disabled. Please enable the Cloud DNS API in your project PROJECT_NAME: Cloud DNS API has not been used in project PROJECT_NUMBER before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/dns.googleapis.com/overview?project=PROJECT_NUMBER then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
이 오류는 Cloud DNS API가 기본적으로 사용 설정되어 있지 않기 때문에 발생합니다. Cloud DNS API를 수동으로 사용 설정해야 합니다.
이 문제를 해결하려면 Cloud DNS API를 사용 설정합니다.
오류: Cloud DNS에 요청을 전송할 수 없음: API 비율 한도 초과
다음 이벤트는 프로젝트가 Cloud DNS 할당량 또는 한도를 초과하면 발생합니다.
kube-system 27s Warning InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.
이 문제를 해결하려면 Cloud DNS 할당량과 Compute Engine 할당량 및 한도를 검토하세요. Google Cloud 콘솔을 사용하여 할당량을 늘릴 수 있습니다.
오류: 이전 오류로 인해 Cloud DNS에 요청을 전송할 수 없음
오류로 인해 연쇄 장애가 발생하면 다음과 같은 이벤트가 발생합니다.
kube-system 27s Warning InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.
kube-system 27s Warning FailedPrecondition service/default-http-backend Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.
이 문제를 해결하려면 클러스터 이벤트를 확인하여 원래 오류의 원인을 찾은 후 안내에 따라 해당 루트 문제를 해결하세요.
앞의 예시에서 관리형 영역에 대한 InsufficientQuota
오류는 연쇄 장애를 트리거했습니다. FailedPrecondition
의 두 번째 오류는 초기 할당량 부족 문제인 이전 오류가 발생했음을 나타냅니다. 이 예시 문제를 해결하려면 Cloud DNS 할당량 오류에 대한 안내를 따르세요.
오류: 응답 정책을 바인딩할 수 없음
응답 정책이 클러스터의 네트워크에 바인딩되고 GKE용 Cloud DNS가 응답 정책을 네트워크에 바인딩하려고 할 때 다음과 같은 이벤트가 발생합니다.
kube-system 9s Warning FailedPrecondition responsepolicy/gke-2949673445-rp
Failed to bind response policy gke-2949673445-rp to test. Please verify that another Response Policy is not already associated with the network: Network 'https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/NETWORK_NAME' cannot be bound to this response policy because it is already bound to another response policy.
kube-system 9s Warning FailedPrecondition service/kube-dns
Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.
문제를 해결하려면 다음 단계를 수행합니다.
네트워크에 바인딩된 응답 정책을 가져옵니다.
gcloud dns response-policies list --filter='networks.networkUrl: NETWORK_URL'
NETWORK_URL
을 오류의 네트워크 URL로 바꿉니다. 예:https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME
출력이 비어 있으면 응답 정책이 동일한 프로젝트에 없을 수 있습니다. 다음 단계를 진행하여 응답 정책을 검색합니다.
출력이 다음과 비슷한 경우 4단계로 건너뛰고 응답 정책을 삭제합니다.
[ { "description": "Response Policy for GKE cluster \"CLUSTER_NAME\" with cluster suffix \"cluster.local.\" in project \"PROJECT_ID\" with scope \"CLUSTER_SCOPE\".", ... "kind": "dns#responsePolicy", "responsePolicyName": "gke-CLUSTER_NAME-POLICY_ID-rp" } ]
IAM 정책 분석 도구를 사용하여
dns.networks.bindDNSResponsePolicy
권한이 있는 프로젝트 목록을 가져옵니다.각 프로젝트에 네트워크에 바인딩된 응답 정책이 있는지 확인합니다.
gcloud dns response-policies list --filter='networks.networkUrl:NETWORK_URL' \ --project=PROJECT_NAME
오류: kube-dns에 잘못된 구성이 지정됨
GKE용 Cloud DNS에 잘못된 커스텀 kube-dns ConfigMap을 적용하면 다음과 같은 이벤트가 발생합니다.
kube-system 49s Warning FailedValidation configmap/kube-dns
Invalid configuration specified in kube-dns: error parsing stubDomains for ConfigMap kube-dns: dnsServer [8.8.8.256] validation: IP address "8.8.8.256" invalid
이 문제를 해결하려면 오류의 세부정보를 검토하여 ConfigMap의 잘못된 부분을 확인합니다. 앞의 예시에서 8.8.8.256
은 유효한 IP 주소가 아닙니다.
다음 단계
Kubernetes DNS 문제 진단에 대한 일반적인 정보는 DNS 변환 디버깅을 참조하세요.
Cloud DNS 문제 해결을 검토합니다.
- 추가 지원이 필요하면 Cloud Customer Care에 연락합니다.