kube-dns 사용

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

이 페이지에서는 Google Kubernetes Engine(GKE)이 GKE 클러스터용 기본 DNS 프로바이더인 kube-dns를 사용하여 서비스 검색을 구현하는 방법을 설명합니다.

Autopilot 클러스터의 경우 기본 kube-dns 구성을 수정할 수 없습니다.

아키텍처

클러스터를 만들 때 GKE는 kube-system 네임스페이스에 kube-dns 포드를 자동으로 배포합니다. 포드는 kube-dns 포드를 그룹화하고 단일 IP 주소(ClusterIP)를 제공하는 해당 서비스를 통해 kube-dns 배포에 액세스합니다. 기본적으로 클러스터의 모든 포드는 이 서비스를 사용하여 DNS 쿼리를 확인합니다. 다음 다이어그램은 포드와 kube-dns 서비스 간의 관계를 보여줍니다.

kube-dns 포드와 kube-dns 서비스의 관계

kube-dns는 클러스터의 DNS 요구에 맞게 확장됩니다. 이 확장은 모든 GKE 클러스터에 기본적으로 배포되는 포드인 kube-dns-autoscaler에 의해 제어됩니다. kube-dns-autoscaler는 클러스터의 노드 및 코어 수를 기반으로 kube-dns 배포의 복제본 수를 조정합니다.

포드 DNS 구성 방법

각 노드에서 실행되는 kubelet은 kube-dns 서비스의 ClusterIP를 사용하도록 포드의 etc/resolv.conf를 구성합니다. 다음 구성 예시에서는 kube-dns 서비스의 IP 주소가 10.0.0.10임을 보여줍니다. 이 IP 주소는 다른 클러스터와 다릅니다.

nameserver 10.0.0.10
search default.svc.cluster.local svc.cluster.local cluster.local c.my-project-id.internal google.internal
options ndots:5

kube-dns는 클러스터 도메인(cluster.local)의 권한 있는 네임서버이며 외부 이름을 재귀적으로 확인합니다. 닉네임은 myservice와 같이 정규화되지 않은 이름이며 지역 검색 경로로 먼저 채워집니다.

스터브 도메인에 커스텀 리졸버 추가

kube-dns의 ConfigMap을 수정하여 클러스터 내에서 DNS 인프라에 속한 스터브 도메인을 설정할 수 있습니다.

스터브 도메인을 사용하면 이러한 도메인을 확인할 때 kube-dns가 DNS 요청을 특정 업스트림 DNS 서버로 전달하도록 도메인별 커스텀 리졸버를 구성할 수 있습니다.

kube-dns의 다음 ConfigMap 매니페스트에는 example.com 도메인의 커스텀 리졸버를 설정하는 stubDomains 구성이 포함되어 있습니다.

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    addonmanager.kubernetes.io/mode: EnsureExists
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {
      "example.com": [
        "8.8.8.8",
        "8.8.4.4",
        "1.1.1.1",
        "1.0.0.1"
      ]
    }

다음 명령어를 실행하여 텍스트 편집기를 엽니다.

kubectl edit configmap kube-dns -n kube-system

파일의 콘텐츠를 매니페스트로 바꾼 다음 텍스트 편집기를 종료하여 매니페스트를 클러스터에 적용합니다.

업스트림 네임서버

upstreamNameservers를 포함하도록 kube-dns에 대한 ConfigMap을 수정하면 kube-dns에서 *.cluster.local을 제외한 모든 DNS 요청을 해당 서버로 전달합니다. 여기에는 업스트림 서버에서 확인할 수 없는 metadata.internal*.google.internal이 포함됩니다.

워크로드 아이덴티티 또는 metadata.internal 변환을 사용하는 워크로드를 사용 설정하는 경우에는 *.internal 이름 변환을 보존하기 위해 stubDomain을 ConfigMap에 추가합니다.

data:
  stubDomains: |
    {
      "internal": [
        "169.254.169.254"
      ]
    }
  upstreamNameservers: |
    ["8.8.8.8"]

알려진 문제

검색 도메인 한도

/etc/resolv.conf의 DNS 검색 도메인은 6개로 제한됩니다. 6개를 초과하는 검색 도메인을 정의하는 경우 kubectl describe pod 명령어를 실행할 때 다음 경고가 표시됩니다.

Search Line limits were exceeded, some search paths have been omitted, the applied search line is: default.svc.cluster.local svc.cluster.local cluster.local c.<project ID>.internal google.internal

이 경고는 Cloud Logging의 컨테이너 로그 섹션에 로깅됩니다.

이 문제를 해결하려면 구성에서 추가 검색 경로를 삭제하세요.

kube-dns의 성능 제한사항

기본 kube-dns 프로바이더의 DNS 조회 지연 또는 DNS 변환 실패가 발생하는 경우 잦은 DNS 조회 수행이나 노드당 높은 포드 밀도를 사용하는 워크로드 때문일 가능성이 있습니다.

DNS 조회 시간을 향상시키기 위해서는 다음 옵션 중 하나를 선택할 수 있습니다.

다음 단계

  • GKE의 클러스터 DNS 개요 읽어보기
  • 서비스 및 포드의 DNS를 참조하여 Kubernetes 클러스터에서 DNS가 사용되는 방식에 대한 일반적인 개요 알아보기