Dokumen ini menjelaskan cara menggunakan NodeLocal DNSCache untuk mengurangi latensi pencarian DNS dan meningkatkan performa aplikasi di cluster Google Kubernetes Engine (GKE).
NodeLocal DNSCache adalah add-on GKE yang meningkatkan performa DNS dengan menjalankan cache DNS langsung di setiap node cluster sebagai DaemonSet. Saat Pod Anda membuat permintaan DNS, permintaan tersebut akan ditujukan ke cache lokal di node yang sama. Penanganan permintaan secara lokal akan mengurangi waktu pencarian DNS rata-rata secara signifikan dan mengurangi beban pada penyedia DNS pusat cluster Anda, seperti kube-dns atau Cloud DNS untuk GKE. Untuk mengetahui penjelasan mendetail tentang arsitektur DNS dan manfaat NodeLocal DNSCache, lihat Tentang penemuan layanan.
Di cluster GKE Autopilot, NodeLocal DNSCache diaktifkan secara default, dan Anda tidak dapat menonaktifkannya. Di cluster GKE Standard yang menjalankan versi 1.34.1-gke.3720000 dan yang lebih baru, NodeLocal DNSCache diaktifkan secara default, tetapi Anda dapat menonaktifkannya.
Dokumen ini ditujukan untuk pengguna GKE, termasuk Developer dan Admin serta arsitek. Untuk mempelajari lebih lanjut peran umum dan contoh tugas di Google Cloud, lihat Peran dan tugas pengguna GKE umum.
Dokumen ini mengasumsikan bahwa Anda sudah memahami hal berikut:
Arsitektur
NodeLocal DNSCache adalah add-on GKE yang dapat Anda jalankan selain
kube-dns.
GKE mengimplementasikan NodeLocal DNSCache sebagai DaemonSet yang menjalankan cache DNS pada setiap node di cluster Anda.
Saat Pod membuat permintaan DNS, permintaan tersebut akan ditujukan ke cache DNS yang berjalan di node yang sama dengan Pod. Jika cache tidak dapat menyelesaikan permintaan DNS, cache akan meneruskan permintaan ke salah satu tempat berikut, berdasarkan tujuan kueri dan penyedia DNS yang dikonfigurasi:
- kube-dns: semua kueri untuk domain DNS cluster (
cluster.local) akan diteruskan kekube-dns. Pod node-local-dns menggunakankube-dns-upstreamLayanan untuk mengakseskube-dnsPod. - Domain stub kustom atau server nama upstream: kueri diteruskan langsung dari Pod NodeLocal DNSCache.
- Cloud DNS: semua kueri lainnya diteruskan ke server metadata lokal yang berjalan di node yang sama dengan tempat kueri berasal. Server metadata lokal mengakses Cloud DNS.
Jika Anda mengaktifkan NodeLocal DNSCache di cluster yang ada, GKE akan membuat ulang semua node cluster yang menjalankan GKE versi 1.15 dan yang lebih baru sesuai dengan proses upgrade node.
Setelah GKE membuat ulang node, GKE otomatis menambahkan label addon.gke.io/node-local-dns-ds-ready=true ke node tersebut. Anda tidak boleh menambahkan label ini ke node cluster secara manual.
Manfaat NodeLocal DNSCache
NodeLocal DNSCache memberikan manfaat berikut:
- Mengurangi waktu pencarian DNS rata-rata
- Koneksi dari Pod ke cache lokal tidak membuat conntrack entri tabel. Perilaku ini mencegah koneksi terputus dan ditolak yang disebabkan oleh kehabisan tabel conntrack dan kondisi race.
- Anda dapat menggunakan NodeLocal DNSCache dengan Cloud DNS untuk GKE.
- Kueri DNS untuk URL eksternal (URL yang tidak merujuk ke resource cluster)
akan diteruskan langsung ke server metadata lokal dan mengabaikan
kube-dns. - Cache DNS lokal akan otomatis mengambil domain stub dan server nama upstream yang ditentukan di bagian Menambahkan resolver kustom untuk domain stub
Persyaratan dan batasan
- NodeLocal DNSCache menggunakan resource komputasi di setiap node cluster Anda.
- NodeLocal DNSCache tidak didukung dengan node pool Windows Server.
- NodeLocal DNSCache memerlukan GKE versi 1.15 atau yang lebih baru.
- NodeLocal DNSCache mengakses Pod
kube-dnsmenggunakan TCP. - NodeLocal DNSCache mengakses
upstreamServersdanstubDomainsmenggunakan TCP dan UDP di GKE versi 1.18 atau yang lebih baru. Server DNS harus dapat dijangkau menggunakan TCP dan UDP. - Data DNS di-cache selama periode berikut:
- Time to live (TTL) kumpulan data, atau 30 detik jika TTL lebih dari 30 detik.
- 5 detik jika respons DNS adalah
NXDOMAIN.
- Pod NodeLocal DNSCache memproses port 53, 9253, 9353, dan 8080 pada node.
Jika Anda menjalankan Pod
hostNetworklainnya atau mengonfigurasihostPortsdengan port tersebut, NodeLocal DNSCache akan gagal dan error DNS akan terjadi. Pod NodeLocal DNSCache tidak menggunakan modehostNetworksaat menggunakan GKE Dataplane V2 dan tidak menggunakan Cloud DNS untuk GKE. - Cache DNS lokal hanya berjalan di node pool yang menjalankan GKE versi 1.15 dan yang lebih baru. Jika Anda mengaktifkan NodeLocal DNSCache di cluster dengan node yang menjalankan versi sebelumnya, Pod pada node tersebut akan menggunakan
kube-dns.
Sebelum memulai
Sebelum memulai, pastikan Anda telah melakukan tugas berikut:
- Aktifkan Google Kubernetes Engine API. Mengaktifkan Google Kubernetes Engine API
- Untuk menggunakan Google Cloud CLI untuk tugas ini,
instal lalu
lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan perintah
gcloud components update. Versi gcloud CLI yang lebih lama mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
- Pastikan Anda memiliki cluster Autopilot atau Standard yang ada. Jika Anda memerlukannya, buat cluster Autopilot. Untuk cluster Autopilot, NodeLocal DNSCache diaktifkan secara default dan tidak dapat diganti.
Mengaktifkan NodeLocal DNSCache
Untuk cluster Standard, NodeLocal DNSCache diaktifkan secara default dari versi 1.34.1-gke.3720000 dan yang lebih baru. Jika cluster Anda menggunakan versi yang lebih lama dari 1.34.1-gke.3720000, Anda dapat menggunakan Google Cloud CLI untuk mengaktifkan NodeLocal DNSCache di cluster baru atau yang sudah ada. Anda juga dapat menggunakan Google Cloud konsol untuk mengaktifkan NodeLocal DNSCache hanya di cluster baru.
gcloud
Untuk mengaktifkan NodeLocal DNSCache di cluster yang ada, gunakan flag --update-addons dengan argumen NodeLocalDNS=ENABLED:
gcloud container clusters update CLUSTER_NAME \
--location=COMPUTE_LOCATION \
--update-addons=NodeLocalDNS=ENABLED
Ganti kode berikut:
CLUSTER_NAME: nama cluster Anda.COMPUTE_LOCATION: lokasi Compute Engine untuk cluster.
Konsol
Untuk mengaktifkan NodeLocal DNSCache di cluster baru, gunakan langkah-langkah berikut:
Buka halaman Google Kubernetes Engine di Google Cloud konsol.
Klik nama cluster yang ingin diubah.
Di bagian Networking, pada kolom DNS provider, klik edit Edit DNS provider.
Centang kotak Enable NodeLocal DNSCache.
Klik Save changes.
Perubahan ini mengharuskan pembuatan ulang node, yang dapat menyebabkan gangguan pada workload yang sedang berjalan. Untuk mengetahui detail tentang perubahan khusus ini, temukan baris yang sesuai dalam perubahan manual yang membuat ulang node menggunakan strategi upgrade node dan kebijakan pemeliharaan tabel. Untuk mempelajari lebih lanjut update node, lihat Merencanakan gangguan update node.
Memastikan NodeLocal DNSCache telah diaktifkan
Anda dapat memverifikasi bahwa NodeLocal DNSCache sudah berjalan dengan mencantumkan Pod node-local-dns:
kubectl get pods -n kube-system -o wide | grep node-local-dns
Outputnya mirip dengan hal berikut ini:
node-local-dns-869mt 1/1 Running 0 6m24s 10.128.0.35 gke-test-pool-69efb6b8-5d7m <none> <none>
node-local-dns-htx4w 1/1 Running 0 6m24s 10.128.0.36 gke-test-pool-69efb6b8-wssk <none> <none>
node-local-dns-v5njk 1/1 Running 0 6m24s 10.128.0.33 gke-test-pool-69efb6b8-bhz3 <none> <none>
Output menampilkan Pod node-local-dns untuk setiap node yang menjalankan GKE versi 1.15 atau yang lebih baru.
Menonaktifkan NodeLocal DNSCache
Untuk cluster GKE Autopilot, NodeLocal DNSCache diaktifkan secara default dan tidak dapat dinonaktifkan.
Menonaktifkan NodeLocal DNSCache di cluster baru
Anda dapat menonaktifkan NodeLocal DNSCache saat membuat cluster GKE Standard baru di versi 1.34.1-gke.3720000 atau yang lebih baru dengan menjalankan perintah berikut:
gcloud container clusters create CLUSTER_NAME \
--location=COMPUTE_LOCATION \
--addons=NodeLocalDNS=DISABLED
Ganti kode berikut:
CLUSTER_NAME: nama cluster baru.COMPUTE_LOCATION: lokasi Compute Engine untuk cluster.
Menonaktifkan NodeLocal DNSCache di cluster yang ada
Anda dapat menonaktifkan NodeLocal DNSCache di cluster GKE yang ada dengan menjalankan perintah berikut:
gcloud container clusters update CLUSTER_NAME \
--location=COMPUTE_LOCATION \
--update-addons=NodeLocalDNS=DISABLED
Ganti kode berikut:
CLUSTER_NAME: nama cluster yang akan dinonaktifkan.COMPUTE_LOCATION: lokasi Compute Engine untuk cluster.
Perubahan ini mengharuskan pembuatan ulang node, yang dapat menyebabkan gangguan pada workload yang sedang berjalan. Untuk mengetahui detail tentang perubahan khusus ini, temukan baris yang sesuai dalam perubahan manual yang membuat ulang node menggunakan strategi upgrade node dan kebijakan pemeliharaan tabel. Untuk mempelajari lebih lanjut update node, lihat Merencanakan gangguan update node.
Memecahkan masalah NodeLocal DNSCache
Untuk mengetahui informasi umum tentang mendiagnosis masalah DNS Kubernetes, lihat Men-debug Resolusi DNS.
NodeLocal DNSCache tidak langsung diaktifkan
Saat Anda mengaktifkan NodeLocal DNSCache di cluster yang ada, GKE mungkin tidak langsung mengupdate node jika cluster tersebut memiliki jendela pemeliharaan atau pengecualian yang dikonfigurasi. Untuk informasi selengkapnya, lihat catatan untuk masa pemeliharaan dan pembuatan ulang node.
Jika tidak ingin menunggu, Anda dapat menerapkan perubahan pada node secara manual dengan memanggil perintah gcloud container clusters upgrade dan meneruskan flag --cluster-version dengan versi GKE yang sama dengan yang sudah dijalankan node pool. Anda harus menggunakan Google Cloud CLI untuk solusi ini.
NodeLocal DNSCache dengan Cloud DNS
Jika Anda menggunakan NodeLocal DNSCache dengan
Cloud DNS, cluster
akan menggunakan alamat IP server nama 169.254.20.10, seperti yang ditunjukkan dalam
diagram berikut:
Akibatnya, alamat IP Layanan kube-dns mungkin berbeda dengan alamat IP server nama yang digunakan Pod Anda. Perbedaan alamat IP ini diharapkan, karena alamat IP server nama 169.254.20.10 diperlukan agar Cloud DNS berfungsi dengan benar.
Untuk memeriksa alamat IP, jalankan perintah berikut:
Lihat alamat IP Layanan
kube-dns:kubectl get svc -n kube-system kube-dns -o jsonpath="{.spec.clusterIP}"Output-nya adalah alamat IP
kube-dns, seperti10.0.0.10Buka sesi shell di Pod Anda:
kubectl exec -it POD_NAME -- /bin/bashDi sesi shell Pod, baca konten file
/etc/resolv.conf:cat /etc/resolv.confOutput-nya adalah
169.254.20.10
Kebijakan jaringan dengan NodeLocal DNSCache
Jika Anda menggunakan kebijakan jaringan
dengan NodeLocal DNSCache dan tidak menggunakan
Cloud DNS atau
GKE Dataplane V2,
Anda harus mengonfigurasi aturan untuk mengizinkan workload dan node-local-dns
Pod untuk mengirim kueri DNS.
Gunakan aturan ipBlock dalam manifes untuk mengizinkan komunikasi antara Pod dan kube-dns.
Manifes berikut menjelaskan kebijakan jaringan yang menggunakan aturan ipBlock:
spec:
egress:
- ports:
- port: 53
protocol: TCP
- port: 53
protocol: UDP
to:
- ipBlock:
cidr: KUBE_DNS_SVC_CLUSTER_IP/32
podSelector: {}
policyTypes:
- Egress
Ganti KUBE_DNS_SVC_CLUSTER_IP dengan alamat IP layanan kube-dns. Anda dapat memperoleh alamat IP layanan kube-dns menggunakan perintah berikut:
kubectl get svc -n kube-system kube-dns -o jsonpath="{.spec.clusterIP}"
Masalah umum
Bagian ini mencantumkan masalah umum terkait NodeLocal DNSCache.
Waktu tunggu DNS di dnsPolicy ClusterFirstWithHostNet saat menggunakan NodeLocal DNSCache dan GKE Dataplane V2
Pada cluster yang menggunakan GKE Dataplane V2 dan NodeLocal DNSCache, Pod dengan kolom hostNetwork yang ditetapkan ke true dan kolom dnsPolicy yang ditetapkan ke ClusterFirstWithHostNet tidak dapat menjangkau backend DNS cluster. Log DNS mungkin berisi entri yang mirip dengan yang berikut ini:
dnslookup: write to 'a.b.c.d': Operation not permitted
;; connection timed out; no servers could be reached
Output menunjukkan bahwa permintaan DNS tidak dapat menjangkau server backend.
Solusinya adalah menetapkan kolom dnsPolicy dan dnsConfig untuk Pod hostNetwork:
spec:
dnsPolicy: "None"
dnsConfig:
nameservers:
- KUBE_DNS_UPSTREAM
searches:
- NAMESPACE.svc.cluster.local
- svc.cluster.local
- cluster.local
- c.PROJECT_ID.internal
- google.internal
options:
- name: ndots
value: "5"
Ganti kode berikut:
NAMESPACE: namespace podhostNetwork.PROJECT_ID: ID project Anda. Google CloudKUBE_DNS_UPSTREAM:ClusterIPlayanankube-dnsupstream. Anda dapat memperoleh nilai ini menggunakan perintah berikut:kubectl get svc -n kube-system kube-dns-upstream -o jsonpath="{.spec.clusterIP}"
Permintaan DNS dari Pod kini dapat menjangkau kube-dns dan mengabaikan NodeLocal DNSCache.
Error waktu tunggu NodeLocal DNSCache
Pada cluster yang mengaktifkan NodeLocal DNSCache, log mungkin berisi entri yang serupa dengan yang berikut ini:
[ERROR] plugin/errors: 2 <hostname> A: read tcp <node IP: port>-><kubedns IP>:53: i/o timeout
Output-nya mencakup alamat IP Layanan IP Cluster kube-dns-upstream. Dalam contoh ini, respons terhadap permintaan DNS tidak diterima dari kube-dns dalam dua detik. Masalah ini dapat disebabkan oleh salah satu alasan berikut:
- Masalah konektivitas jaringan yang mendasarinya.
- Secara signifikan meningkatkan kueri DNS dari workload atau dari peningkatan jumlah node.
Akibatnya, Pod kube-dns yang ada tidak dapat menangani semua permintaan secara tepat waktu. Solusinya adalah meningkatkan jumlah replika kube-dns dengan meningkatkan skala
kube-dns.
Meningkatkan skala kube-dns
Anda dapat menggunakan nilai yang lebih rendah untuk kolom nodesPerReplica guna membantu memastikan bahwa lebih banyak Pod kube-dns yang dibuat saat node cluster ditingkatkan skalanya. Sebaiknya tetapkan nilai max eksplisit untuk membantu memastikan bahwa mesin virtual (VM) bidang kontrol GKE tidak kewalahan karena banyaknya Pod kube-dns yang menonton API Kubernetes.
Anda dapat menetapkan kolom max ke jumlah node dalam cluster. Jika cluster memiliki lebih dari 500 node, tetapkan kolom max ke 500.
Untuk cluster Standard, Anda dapat mengubah jumlah kube-dns replika
dengan mengedit ConfigMap kube-dns-autoscaler. Konfigurasi ini tidak didukung di cluster Autopilot.
kubectl edit configmap kube-dns-autoscaler --namespace=kube-system
Outputnya mirip dengan hal berikut ini:
linear: '{"coresPerReplica":256, "nodesPerReplica":16,"preventSinglePointFailure":true}'
Jumlah replika kube-dns dihitung menggunakan rumus berikut:
replicas = max(ceil(cores * 1/coresPerReplica), ceil(nodes *
1/nodesPerReplica))
Jika Anda menentukan kolom min dan max di ConfigMap, replika akan dibatasi oleh nilai ini. Untuk meningkatkan skala, ubah nilai kolom nodesPerReplica ke nilai yang lebih kecil dan sertakan nilai untuk kolom max:
linear: '{"coresPerReplica":256, "nodesPerReplica":8,"max": 15,"preventSinglePointFailure":true}'
Konfigurasi ini akan membuat satu Pod kube-dns untuk setiap delapan node dalam cluster. Cluster 24 node memiliki tiga replika, dan cluster 40 node memiliki lima replika. Jika cluster berkembang melebihi 120 node, jumlah replika kube-dns tidak bertambah melebihi 15, yaitu nilai max.
Untuk membantu memastikan tingkat ketersediaan DNS dasar di cluster Anda, tetapkan jumlah replika minimum untuk kube-dns.
Output untuk ConfigMap kube-dns-autoscaler yang memiliki kolom min yang ditentukan akan mirip dengan yang berikut ini:
linear: '{"coresPerReplica":256, "nodesPerReplica":8,"max": 15,"min": 5,"preventSinglePointFailure":true}'
Langkah berikutnya
- Baca ringkasan tentang cara GKE menyediakan DNS terkelola.
- Baca DNS untuk Service dan Pod untuk mengetahui ringkasan umum tentang cara penggunaan DNS di cluster Kubernetes.
- Pelajari cara menggunakan Cloud DNS untuk GKE.