kube-dns 사용


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

아키텍처

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

kube-dns Pod와 kube-dns 서비스의 관계

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

Pod DNS 구성 방법

각 노드에서 실행되는 kubelet은 kube-dns 서비스의 ClusterIP를 사용하도록 Pod의 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 해상도를 사용하는 워크로드를 사용 설정하는 경우에는 upstreamNameservers를 사용하지 마세요. 대신 stubDomains를 사용하세요.

다음 단계

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