Cloud DNS cho GKE — Private Zones, VPC Scope, và Split-Horizon
Tại Sao GKE Cần Cloud DNS
kube-dns và CoreDNS giải quyết tốt DNS trong phạm vi cluster. Nhưng enterprise production systems có nhu cầu phức tạp hơn:
- Non-GKE clients trong VPC (GCE VMs, Cloud Run, on-premises via VPN) cần resolve cluster Service names
- Multi-cluster environments cần DNS nhất quán giữa các clusters
- Hybrid cloud với on-premises DNS servers cần peering với cluster DNS
- Split-horizon DNS — same domain, different answers cho internal vs external clients
CoreDNS giải quyết những bài toán này không tốt vì nó chỉ lắng nghe trong cluster network. Cloud DNS for GKE đưa cluster DNS lên managed DNS infrastructure của Google, cho phép resolve từ bất kỳ đâu trong VPC.
Internal Model — Cloud DNS for GKE
Kiến Trúc Tổng Thể
Khi cluster được tạo với Cloud DNS for GKE (thay vì kube-dns default):
- GKE control plane tạo một Cloud DNS private zone được quản lý tự động cho cluster
- Zone này chứa DNS records cho tất cả Services và Pods trong cluster
- GKE controller liên tục sync Kubernetes Service/Endpoint state sang Cloud DNS zone
- Metadata server (
169.254.169.254) trên mỗi node được cấu hình để serve DNS từ Cloud DNS - Pod DNS queries đến
169.254.169.254:53(hoặc169.254.20.10:53nếu NodeLocal DNSCache enabled) được routed đến Cloud DNS infrastructure
Điểm khác biệt căn bản: DNS records không sống trong cluster (như CoreDNS in-memory cache) mà sống trong Cloud DNS infrastructure của Google — globally distributed, SLA-backed, và reachable từ toàn VPC.
Automatic Zone Management
GKE controller tự động manage Cloud DNS zone:
- Service được tạo → A record được thêm vào private zone
- Service bị xóa → A record bị xóa
- Pod IP thay đổi (với headless Services) → A records được update
- Cluster bị xóa → Zone bị xóa
Không nên manual edit zone records — GKE controller sẽ overwrite. Đây là managed zone trong đúng nghĩa.
Cấu Trúc Zone Name
Zone tự động tạo cho cluster có naming convention:
gke-<cluster-name>-<hash>-dnsZone này private — chỉ visible trong VPC (hoặc VPCs nếu cấu hình). Zone scope và visibility phụ thuộc vào DNS scope được chọn khi tạo cluster.
DNS Scope — Ba Chế Độ Hoạt Động
Đây là quyết định quan trọng nhất khi deploy Cloud DNS for GKE và không thể thay đổi sau khi cluster được tạo. Phải chọn đúng từ đầu.
Cluster Scope (mặc định)
DNS records chỉ resolvable từ nodes trong clusterBehavior giống kube-dns: payment-service.backend.svc.cluster.local chỉ resolve được từ Pods trong cluster. External clients (GCE VMs, on-prem) không thể resolve tên này.
Dùng khi: Cluster là isolated unit, không cần external clients resolve cluster Services.
VPC Scope
DNS records resolvable từ toàn bộ VPC (và on-premises nếu có VPN/Interconnect)VPC scope là thay đổi lớn: Cloud DNS private zone được gắn với toàn bộ VPC network, không chỉ với nodes của cluster. Bất kỳ client nào trong VPC — GCE VM, Cloud Run, on-premises server qua Cloud Interconnect — có thể resolve payment-service.backend.svc.cluster.local và nhận ClusterIP.
Theo tài liệu GCP: "With VPC scope, a cluster's DNS names are resolvable within the entire VPC. Any client in the VPC can resolve cluster DNS records."
Tại sao cần VPC scope:
- Service Mesh patterns: data plane (Envoy) trên VMs cần discover in-cluster endpoints
- Migration scenarios: applications trên GCE VMs cần reach Kubernetes services trước khi migration hoàn tất
- Monitoring/management tools trên non-GKE nodes cần discover cluster services
Giới hạn VPC scope: Headless Service chỉ trả về Pod IPs (không phải ClusterIP) khi query từ VPC. External clients nhận Pod IPs nhưng traffic đến Pod IPs chỉ work nếu network routing được configure đúng (VPC-native clusters, Pod CIDR routable từ caller's subnet).
Additive VPC Scope
Kết hợp cluster scope + VPC scope: cluster DNS resolvable từ VPC,
đồng thời cluster vẫn có isolated cluster.local namespaceAdditive VPC scope là phiên bản linh hoạt hơn: cluster DNS có thể resolve từ VPC nhưng cluster-local queries ưu tiên cluster zone (không bị conflate với các clusters khác trong VPC).
Dùng khi: Multiple clusters trong cùng VPC, muốn cross-cluster resolution nhưng tránh namespace conflicts.
Split-Horizon DNS
Cơ Chế
Split-horizon DNS cho phép cùng một domain name trả về khác nhau cho internal vs external clients:
example.com (từ internet) → 203.0.113.100 (Public IP / Load Balancer)
example.com (từ trong VPC) → 10.0.1.50 (Internal IP / Private endpoint)Với Cloud DNS, split-horizon được implement bằng:
- Public zone
example.com: trả về public IP cho external queries - Private zone
example.com: override public zone cho queries từ trong VPC
Private zone được bind với VPC network. Khi GCP DNS resolver nhận query từ trong VPC, nó ưu tiên private zone over public zone.
Use Cases Trong GKE Context
Scenario 1: Internal API không expose ra internet
api.company.com:
- Public zone: không có record (domain không resolvable externally)
- Private zone: 10.0.2.100 (ILB cho GKE Service)Clients từ internet không resolve được api.company.com. Clients trong VPC resolve được và kết nối qua Internal Load Balancer.
Scenario 2: Dual endpoint cho internal efficiency
storage.company.com:
- Public zone: 203.0.113.200 (Cloud Storage public endpoint)
- Private zone: 199.36.153.4 (Private Google Access endpoint)Applications trong VPC tự động kết nối qua Private Google Access (không ra internet), trong khi external clients dùng public endpoint. Zero code change cần thiết.
Private Zone Binding
Để private zone có hiệu lực cho queries trong VPC, zone phải được bind với VPC network:
gcloud dns managed-zones create internal-zone \
--dns-name="example.com" \
--visibility="private" \
--networks="projects/MY_PROJECT/global/networks/my-vpc"Cloud DNS private zone chỉ responds với queries đến từ resources trong VPC network được chỉ định.
Peering Zones — Hybrid DNS Integration
Vấn Đề Hybrid DNS
Trong enterprise, on-premises DNS servers quản lý internal domains (corp.internal, prod.corp). GKE cluster cần resolve các tên này. Đồng thời, on-premises clients cần resolve tên trong cluster DNS scope.
Cấu hình forwarding đơn giản từ CoreDNS đến on-premises DNS server không bidirectional — on-premises clients vẫn không biết cluster DNS zone.
DNS Peering Zones
Cloud DNS peering cho phép một zone forward queries đến zone khác:
Project A (GKE cluster): private zone gke-cluster-a.cluster.local
Project B (Shared DNS): authoritative zone cho corp.internal
Peering: Project A → cho phép resolve corp.internal từ Project B's zone# Tạo peering zone trong project GKE
gcloud dns managed-zones create peering-to-shared-dns \
--dns-name="corp.internal" \
--visibility="private" \
--networks="projects/gke-project/global/networks/gke-vpc" \
--target-network="projects/shared-dns-project/global/networks/dns-hub-vpc" \
--target-project="shared-dns-project"Query cho server.corp.internal từ GKE Pod → Cloud DNS peering zone → forward đến shared DNS project → resolve từ authoritative zone.
Hub-Spoke DNS Architecture
Pattern phổ biến trong enterprise với nhiều VPCs:
DNS Hub VPC (Project: dns-hub):
├── Authoritative zones cho corp.internal, prod.corp, etc.
├── Forwarding zones đến on-premises DNS servers
└── Peering connections từ spoke VPCs
Spoke VPCs (Projects: gke-prod, gke-staging, gke-dev):
└── Peering zones trỏ về DNS Hub VPCMọi DNS resolution đi qua Hub. Cluster DNS zones (scope VPC) được visible trong spoke VPC và có thể peered về Hub nếu cần on-premises clients access.
Constraints Và Giới Hạn Quan Trọng
Không Thể Thay Đổi DNS Scope Sau Khi Tạo Cluster
Đây là giới hạn quan trọng nhất. DNS scope (cluster/VPC/additive-VPC) được set khi gcloud container clusters create và không thể modify sau đó. Nếu cần thay đổi scope, phải tạo cluster mới và migrate workloads.
Implication: Cần quyết định DNS scope ngay từ đầu dựa trên expected use cases. Với production clusters, VPC scope hoặc additive VPC scope thường được ưu tiên vì flexibility.
Manual Zone Modifications Bị Overwrite
Mọi record được thêm thủ công vào Cloud DNS zone của GKE sẽ bị overwrite hoặc xóa bởi GKE controller khi nó reconcile state. Không nên dùng GKE-managed zone cho custom records.
Giải pháp: Tạo zone riêng cho custom records, đặt cùng VPC binding. Cloud DNS sẽ resolve từ cả hai zones (GKE-managed và custom).
Headless Services Và VPC Scope Limitation
Với VPC scope, headless Service A records trong Cloud DNS chỉ chứa Pod IPs (không phải danh sách IPs khi query từ cluster). External clients nhận Pod IPs nhưng để kết nối được, Pod CIDR phải routable từ caller.
Trên GKE VPC-native clusters, Pod CIDR là VPC IP range — routable trong VPC. Nhưng với non-VPC-native hoặc external clients qua VPN, cần verify routing.
Service Và Port Name Length Limit
Cloud DNS for GKE giới hạn Service name và port name tối đa 62 ký tự. Services với tên dài hơn có thể không có SRV records được tạo đúng.
DNS Latency So Với kube-dns
Cloud DNS infrastructure adds overhead so với in-cluster CoreDNS:
- kube-dns: Sub-millisecond resolution (in-memory lookup)
- Cloud DNS: 1-5ms thêm cho metadata server round-trip
Với NodeLocal DNSCache, cache hits vẫn sub-millisecond. Cache misses chịu thêm latency từ Cloud DNS. Đối với applications sensitive về DNS latency, NodeLocal DNSCache là prerequisite.
Khi Nào Dùng Cloud DNS for GKE vs kube-dns
| Tiêu chí | kube-dns/CoreDNS | Cloud DNS for GKE |
|---|---|---|
| Multi-cluster DNS | Khó implement | Native với VPC scope |
| Hybrid DNS integration | Manual forwarding config | Peering zones |
| Non-GKE client access | Không hỗ trợ | VPC scope |
| Split-horizon DNS | Custom CoreDNS config | Native Cloud DNS |
| DNS query latency | Tốt hơn (in-memory) | Acceptable với NodeLocal Cache |
| Operational overhead | Quản lý CoreDNS config | Fully managed |
| Cost | Included | Cloud DNS pricing per zone/query |
Với production GKE clusters trong enterprise environment, Cloud DNS for GKE thường là lựa chọn đúng vì operational benefits vượt trội over marginal latency difference (khi có NodeLocal DNSCache).
GKE-Specific Configuration
# Tạo cluster với Cloud DNS
gcloud container clusters create my-cluster \
--location=us-central1 \
--cluster-dns=clouddns \
--cluster-dns-scope=vpc \
--cluster-dns-domain=cluster.local
# Verify Cloud DNS zone được tạo
gcloud dns managed-zones list --filter="name:gke-*"
# Inspect zone records
gcloud dns record-sets list \
--zone=gke-my-cluster-hash-dns \
--filter="name:*.svc.cluster.local"
# Test resolution từ VM trong cùng VPC
gcloud compute ssh vm-in-vpc -- \
"nslookup payment-service.backend.svc.cluster.local"
# Thêm custom peering zone
gcloud dns managed-zones create on-prem-peering \
--dns-name="corp.internal." \
--visibility=private \
--networks=projects/PROJECT/global/networks/VPC_NAME \
--forwarding-targets=10.0.0.2 # On-prem DNS server IP