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.png37d264871000675d.png96d86d3d5655cdbe.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 실습을 확인하세요.