GKE NodeLocal DNSCache 살펴보기

1. 개요

DNS 캐시는 먼저 동일한 노드의 로컬 캐시에 포드 DNS 요청을 전송하여 DNS 조회 지연 시간을 개선합니다. 이렇게 하면 DNS 조회 시간이 더 일관성 있게 되고 kube-dns 또는 Cloud DNS에 대한 DNS 쿼리 수를 줄일 수 있습니다.

이 실습에서는 NodeLocal DNSCache가 GKE 클러스터에서 DNS 트래픽을 처리하는 방법을 테스트합니다. 버전 1.34.1-gke.3720000 이상을 실행하는 GKE Standard 클러스터를 검증하여 기본적으로 사용 설정되어 있는지 확인합니다. 그런 다음 사용 중지하여 기능을 사용 중지할 때 구성이 어떻게 변경되는지 확인합니다.

목표

이 실습에서는 다음 작업을 수행하는 방법을 알아봅니다.

  • 커스텀 VPC, 서브넷, 방화벽 규칙 만들기
  • 빠른 출시 채널을 사용하여 표준 GKE Standard 클러스터 배포
  • 테스트를 실행하여 LocalNode DNS 캐시가 사용 설정되어 있는지 확인
  • 캐시를 사용 중지하고 캐시가 없는 상태를 확인합니다.

2. 실습 설정

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로 PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.

Cloud Shell 활성화

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

환경이 연결되었음을 보여주는 Google Cloud Shell 터미널 스크린샷

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.

3. 환경 설정

방화벽 규칙이 있는 커스텀 VPC를 만듭니다. VPC와 프로젝트가 이미 있는 경우 이 부분을 건너뛰어도 됩니다.

콘솔 상단 오른쪽에 있는 Cloud Shell을 엽니다. 다음과 같이 구성합니다. b51b80043d3bac90.png

  1. 이 실습에서 사용할 API 일부를 사용 설정합니다.
gcloud services enable dns.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable container.googleapis.com
  1. 몇 가지 변수를 설정합니다. 이러한 변수는 프로젝트 ID와 VPC 이름입니다 (3단계에서 VPC를 만듭니다).
export projectid=$(gcloud config get-value project)
export vpc_name=gke-cache-vpc
export subnet_name=mainsubnet
export region=us-east1
export zone=us-east1-b
export cluster_name=cache-gke-cluster
export channel=rapid

export machine_type=e2-standard-4
echo $projectid
echo $vpc_name
  1. 이제 gke-cache-vpc라는 커스텀 VPC를 만듭니다.
gcloud compute networks create $vpc_name --subnet-mode=custom --project=$projectid \
--subnet-mode=custom \
--mtu=1460 \
--bgp-routing-mode=global
  1. 새 VPC에서 서브넷 만들기
gcloud compute networks subnets create $subnet_name \
    --network=$vpc_name \
    --range=10.0.88.0/24 \
    --region=$region \
    --enable-private-ip-google-access \
    --project=$projectid
  1. VPC에 방화벽 규칙 추가
gcloud compute firewall-rules create $vpc_name-allow-internal \
    --network=$vpc_name --allow=tcp,udp,icmp --source-ranges=10.0.88.0/24

gcloud compute firewall-rules create $vpc_name-allow-ssh \
    --network=$vpc_name --allow=tcp:22 --source-ranges=35.235.240.0/20

4. 인터넷 통신을 위한 NAT 게이트웨이 만들기

인터넷에 대한 아웃바운드 외부 액세스를 부여해야 하므로 Cloud NAT 게이트웨이를 만들어 연결하겠습니다.

Cloud Shell에서 다음 명령어를 사용합니다.

  1. Cloud NAT 및 NAT 게이트웨이 만들기
gcloud compute routers create gke-nat-router --network=$vpc_name --region=$region

gcloud compute routers nats create gke-nat-gw \
    --router=gke-nat-router --region=$region \
    --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges

5. GKE 클러스터 배포 및 확인

  1. Google Cloud Shell에서 cache-gke-cluster이라는 클러스터를 만듭니다. 버전 1.34.1-gke.3720000 이상을 실행하는 GKE Standard 클러스터에서는 NodeLocal DNSCache가 기본적으로 사용 설정됩니다. (클러스터를 프로비저닝하는 데 4~10분 정도 소요됩니다)
gcloud container clusters create $cluster_name \
--zone=$zone --network=$vpc_name --subnetwork=$subnet_name \
--release-channel=$channel --machine-type=$machine_type \
--enable-ip-alias
  1. 클러스터가 생성되면 연결합니다.
gcloud container clusters get-credentials $cluster_name --zone $zone
  1. 이제 NodeLocal DNSCache가 사용 설정되어 있는지 확인해 보겠습니다.

이러한 명령어는 버전이 1.34.1-gke.3720000 이상인지 확인하고 로컬 에이전트가 실행 중이며 서비스가

kubectl version | grep "Server Version"

kubectl get pods -n kube-system -o wide | grep node-local-dns -w

kubectl get svc,endpoints -n kube-system -l k8s-app=kube-dns
  1. 다음 명령어를 실행합니다 (노드의 iptables 규칙이 DNS 트래픽을 적극적으로 가로채고 로컬 캐시로 라우팅하는지 확인하기 위해 호스트 네트워크에 권한이 있는 포드를 생성합니다).
export KUBEDNS_IP=$(kubectl get svc kube-dns -n kube-system -o jsonpath='{.spec.clusterIP}')

kubectl run node-inspector --quiet --rm -it --image=alpine --privileged --restart=Never \
  --overrides='{"spec": {"hostNetwork": true}}' -- \
  sh -c "apk add --no-cache iptables && iptables-save | grep -E '169.254.20.10|$KUBEDNS_IP'"

확인할 사항: -j NOTRACK.를 확인합니다. 이렇게 하면 DNS 트래픽이 연결 추적 테이블을 우회하는지 확인할 수 있습니다.

7135447929b7c48f.png

6. NodeLocal DNSCache 사용 중지 및 확인

이제 최적화를 삭제하여 최적화 없이 어떻게 작동하는지 확인합니다.

  1. Cloud Shell로 이동하여 다음을 실행합니다. 참고: 이렇게 하면 노드가 다시 생성됩니다. GKE가 인스턴스를 순환하므로 노드 풀당 일반적으로 3~5분이 걸립니다.
gcloud container clusters update $cluster_name --zone=$zone --update-addons=NodeLocalDNS=DISABLED --quiet

kubectl get pods -n kube-system -o wide | grep node-local-dns -w

이러한 포드는 삭제되었으므로 데몬 세트에 표시되지 않습니다.

  1. 테스트 재실행
kubectl run node-inspector --quiet --rm -it --image=alpine --privileged --restart=Never \
  --overrides='{"spec": {"hostNetwork": true}}' -- \
  sh -c "apk add --no-cache iptables && iptables-save | grep -E '169.254.20.10|$KUBEDNS_IP'"

부가기능을 사용 중지하면 출력에 더 이상 -j NOTRACK 규칙이나 169.254.20.10 IP 주소에 대한 언급이 포함되지 않습니다. 즉, 더 이상 로컬 캐시의 이점을 누릴 수 없습니다.

4693ee556701e145.png

7. 삭제

# 1. Delete the GKE Cluster
# This will remove the node and all system pods (including kube-dns)
gcloud container clusters delete $cluster_name --zone=$zone --quiet

# 2. Delete the Cloud NAT and Router
# It is best practice to remove these before the VPC
gcloud compute routers nats delete gke-nat-gw --router=gke-nat-router --region=$region --quiet
gcloud compute routers delete gke-nat-router --region=$region --quiet

# 3. Delete the Firewall Rules
gcloud compute firewall-rules delete $vpc_name-allow-internal $vpc_name-allow-ssh --quiet

# 4. Delete the Subnet and VPC
gcloud compute networks subnets delete $subnet_name --region=$region --quiet
gcloud compute networks delete $vpc_name --quiet

8. 다음 단계/더 학습하기

GKE 네트워킹 문서 및 사용 사례에 대해 자세히 알아보세요.

Codelab: Private Service Connect 엔드포인트를 통해 Python SDK를 사용하여 Gemini 3 Pro 채팅에 액세스하기

Codelab: ADK를 이용한 AI 에이전트 빌드:기초

다음 실습 참여하기

Google Cloud로 퀘스트를 계속 진행하고 다른 Google Cloud Skills Boost 실습을 확인하세요.