Siapkan NodeLocal DNSCache

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 ke kube-dns. Pod node-local-dns menggunakan Layanan kube-dns-upstream untuk mengakses Pod kube-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.

Jalur permintaan DNS, seperti yang dijelaskan di paragraf sebelumnya.

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-dns menggunakan TCP.
  • NodeLocal DNSCache mengakses upstreamServers dan stubDomains menggunakan 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 hostNetwork lainnya atau mengonfigurasi hostPorts dengan port tersebut, NodeLocal DNSCache akan gagal dan error DNS akan terjadi. Pod NodeLocal DNSCache tidak menggunakan mode hostNetwork saat 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:

Konsol

Untuk mengaktifkan NodeLocal DNSCache di cluster baru, gunakan langkah-langkah berikut:

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud .

    Buka cluster Kubernetes

  2. Click the name of the cluster you want to modify.

  3. Di bagian Networking, pada kolom DNS provider, klik Edit DNS provider.

  4. Centang kotak Enable NodeLocal DNSCache.

  5. 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:

Arsitektur NodeLocal DNSCache dengan Cloud DNS.

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:

  1. Melihat alamat IP Layanan kube-dns:

    kubectl get svc -n kube-system kube-dns -o jsonpath="{.spec.clusterIP}"
    

    Outputnya adalah alamat IP kube-dns, seperti 10.0.0.10

  2. Buka sesi shell di Pod Anda:

    kubectl exec -it POD_NAME -- /bin/bash
    
  3. Di sesi shell Pod, baca isi file /etc/resolv.conf:

    cat /etc/resolv.conf
    

    Outputnya 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 pod hostNetwork.
  • PROJECT_ID: ID Google Cloud project Anda.
  • KUBE_DNS_UPSTREAM: ClusterIP layanan kube-dns upstream. 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