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. Menangani 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.33.1 dan yang lebih baru, NodeLocal DNSCache diaktifkan secara default, tetapi Anda dapat menonaktifkannya.
Dokumen ini ditujukan untuk pengguna GKE, termasuk Developer, Admin, dan arsitek. Untuk mempelajari lebih lanjut peran umum dan contoh tugas di Google Cloud, lihat Peran dan tugas pengguna GKE Enterprise umum.
Dokumen ini mengasumsikan bahwa Anda sudah memahami hal-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:
- kube-dns: semua kueri untuk domain DNS cluster (
cluster.local) akan diteruskan kekube-dns. Pod node-local-dns menggunakan Layanankube-dns-upstreamuntuk mengakses Podkube-dns. - 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 entri tabel conntrack. 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. Aktifkan Google Kubernetes Engine API
- Jika ingin 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. gcloud CLI versi sebelumnya mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
- Pastikan Anda sudah memiliki cluster Autopilot atau Standard. Jika Anda memerlukannya, buat cluster Autopilot. Untuk cluster Autopilot, NodeLocal DNSCache diaktifkan secara default dan tidak dapat diganti.
Mengaktifkan NodeLocal DNSCache
Untuk cluster Standard, Anda dapat mengaktifkan NodeLocal DNSCache menggunakan Google Cloud CLI atau konsol Google Cloud .
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 konsol Google Cloud .
Click the name of the cluster you want to modify.
Di bagian Networking, pada kolom DNS provider, klik edit Edit DNS provider.
Centang kotak Enable NodeLocal DNSCache.
Klik Simpan perubahan.
Perubahan ini memerlukan pembuatan ulang node, yang dapat menyebabkan gangguan pada workload yang sedang berjalan. Untuk mengetahui detail tentang perubahan khusus ini, temukan baris yang sesuai dalam tabel perubahan manual yang membuat ulang node menggunakan strategi upgrade node dan mematuhi kebijakan pemeliharaan. 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 menunjukkan Pod node-local-dns untuk setiap node yang menjalankan GKE versi 1.15 atau yang lebih baru.
Menonaktifkan NodeLocal DNSCache
Anda dapat menonaktifkan NodeLocal DNSCache menggunakan 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 memerlukan pembuatan ulang node, yang dapat menyebabkan gangguan pada workload yang sedang berjalan. Untuk mengetahui detail tentang perubahan khusus ini, temukan baris yang sesuai dalam tabel perubahan manual yang membuat ulang node menggunakan strategi upgrade node dan mematuhi kebijakan pemeliharaan. 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 sudah diperkirakan, karena alamat IP server nama 169.254.20.10 diperlukan agar Cloud DNS berfungsi dengan benar.
Untuk memeriksa alamat IP, jalankan perintah berikut:
Melihat alamat IP Layanan
kube-dns:kubectl get svc -n kube-system kube-dns -o jsonpath="{.spec.clusterIP}"Outputnya 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 isi file
/etc/resolv.conf:cat /etc/resolv.confOutputnya 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 Pod node-local-dns 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 bisa mendapatkan 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 pada 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 Google Cloud project Anda.KUBE_DNS_UPSTREAM:ClusterIPlayanankube-dnsupstream. Anda bisa mendapatkan 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 telah 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 mungkin disebabkan oleh salah satu alasan berikut:
- Masalah konektivitas jaringan yang mendasarinya.
- Secara signifikan meningkatkan kueri DNS dari workload atau dari peningkatan jumlah kumpulan node.
Akibatnya, Pod kube-dns yang ada tidak dapat menangani semua permintaan secara tepat waktu. Solusinya adalah meningkatkan jumlah replika kube-dns dengan menskalakan 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 dibuat saat node cluster ditingkatkan skalanya. Sebaiknya tetapkan nilai max eksplisit untuk membantu memastikan bahwa mesin virtual (VM) bidang kontrol GKE tidak kewalahan oleh banyaknya Pod kube-dns yang memantau Kubernetes API.
Anda dapat menetapkan kolom max ke jumlah node dalam cluster. Jika cluster memiliki lebih dari 500 node, tetapkan kolom max ke 500.
Untuk cluster Standar, Anda dapat mengubah jumlah replika kube-dns 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 formula 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 menjadi 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 dengan 24 node memiliki tiga replika, dan cluster dengan 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 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 Layanan dan Pod untuk mengetahui ringkasan umum tentang cara penggunaan DNS di cluster Kubernetes.
- Pelajari cara menggunakan Cloud DNS untuk GKE.