Menggunakan kube-dns


Halaman ini menjelaskan cara Google Kubernetes Engine (GKE) mengimplementasikan penemuan layanan menggunakan kube-dns, penyedia DNS default untuk cluster GKE.

Untuk cluster Autopilot, Anda tidak dapat mengubah konfigurasi kube-dns default.

Arsitektur

Saat Anda membuat cluster, GKE akan otomatis men-deploy Pod kube-dns dalam namespace kube-system. Pod mengakses deployment kube-dns melalui Service terkait, yang mengelompokkan Pod kube-dns dan memberinya satu alamat IP (ClusterIP). Secara default, semua Pod dalam cluster menggunakan Service ini untuk me-resolve kueri DNS. Diagram berikut menunjukkan hubungan antara Pod dan Service kube-dns.

Hubungan Pod kube-dns dengan layanan kube-dns.

kube-dns melakukan penskalaan untuk memenuhi permintaan DNS cluster. Penskalaan ini dikontrol oleh kube-dns-autoscaler, Pod yang di-deploy secara default di semua cluster GKE. kube-dns-autoscaler menyesuaikan jumlah replika dalam Deployment kube-dns berdasarkan jumlah node dan core dalam cluster.

kube-dns mendukung hingga 1.000 endpoint per layanan headless.

Cara DNS Pod dikonfigurasi

Kubelet yang berjalan pada setiap Node mengonfigurasi etc/resolv.conf Pod untuk menggunakan ClusterIP layanan kube-dns. Contoh konfigurasi berikut menunjukkan bahwa alamat IP layanan kube-dns adalah 10.0.0.10. Alamat IP ini berbeda di cluster lain.

nameserver 10.0.0.10
search default.svc.cluster.local svc.cluster.local cluster.local c.my-project-id.internal google.internal
options ndots:5

kube-dns adalah server nama otoritatif untuk domain cluster (cluster.local) dan me-resolve nama eksternal secara rekursif. Nama pendek yang tidak sepenuhnya memenuhi syarat, seperti myservice, akan dilengkapi terlebih dahulu dengan jalur penelusuran lokal.

Menambahkan resolver kustom untuk domain stub

Anda dapat mengubah ConfigMap untuk kube-dns guna menetapkan domain stub sebagai bagian dari infrastruktur DNS dalam cluster Anda.

Domain stub memungkinkan Anda mengonfigurasi resolver per domain kustom, sehingga kube-dns meneruskan permintaan DNS ke server DNS upstream tertentu saat me-resolve domain ini.

Contoh manifes ConfigMap untuk kube-dns berikut mencakup konfigurasi stubDomains yang menetapkan resolver kustom untuk domain example.com.

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    addonmanager.kubernetes.io/mode: EnsureExists
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {
      "example.com": [
        "8.8.8.8",
        "8.8.4.4",
        "1.1.1.1",
        "1.0.0.1"
      ]
    }

Jalankan perintah berikut untuk membuka editor teks:

kubectl edit configmap kube-dns -n kube-system

Ganti konten file dengan manifes, lalu keluar dari editor teks untuk menerapkan manifes ke cluster.

Server nama upstream

Jika Anda mengubah ConfigMap untuk kube-dns agar menyertakan upstreamNameservers, kube-dns akan meneruskan semua permintaan DNS kecuali *.cluster.local ke server tersebut. Ini mencakup metadata.internal dan *.google.internal, yang tidak dapat di-resolve oleh server upstream.

Jika Anda mengaktifkan Workload Identity Federation untuk GKE atau workload apa pun yang bergantung pada resolusi metadata.internal, untuk mempertahankan resolusi nama *.internal, tambahkan stubDomain ke ConfigMap.

data:
  stubDomains: |
    {
      "internal": [
        "169.254.169.254"
      ]
    }
  upstreamNameservers: |
    ["8.8.8.8"]

Pemecahan masalah

Untuk mengetahui informasi tentang pemecahan masalah kube-dns, lihat halaman berikut:

Batasan

Baca bagian berikut untuk mengetahui informasi tentang batasan kube-dns.

Batas domain penelusuran

Ada batas enam domain penelusuran DNS untuk /etc/resolv.conf. Jika Anda menentukan lebih dari enam domain penelusuran, peringatan berikut akan muncul saat Anda menjalankan perintah kubectl describe pod:

Search Line limits were exceeded, some search paths have been omitted, the applied search line is: default.svc.cluster.local svc.cluster.local cluster.local c.<project ID>.internal google.internal

Peringatan ini dicatat dalam Cloud Logging di bagian log container.

Untuk me-resolve masalah ini, hapus jalur penelusuran tambahan dari konfigurasi.

Pertimbangkan batas upstreamNameservers

Kubernetes memberlakukan batas hingga tiga nilai upstreamNameservers. Jika menentukan lebih dari tiga upstreamNameservers, Anda akan melihat error berikut pada Cloud Logging di log deployment kube-dns:

Invalid configuration: upstreamNameserver cannot have more than three entries (value was &TypeMeta{Kind:,APIVersion:,}), ignoring update

Jika hal ini terjadi, kube-dns akan berperilaku seolah-olah tidak ada upstreamNameservers yang dikonfigurasi. Untuk me-resolve masalah ini, hapus upstreamNameservers tambahan dari konfigurasi.

Batasan performa dengan kube-dns

Jika Anda mengalami latensi tinggi dengan pencarian DNS atau kegagalan resolusi DNS dengan penyedia kube-dns default, hal ini mungkin disebabkan oleh:

  • Melakukan pencarian DNS yang sering dalam workload Anda
  • Men-deploy kepadatan Pod per node yang lebih tinggi.
  • Melebihi batas kueri per detik (QPS) sebesar 20 untuk setiap Pod kube-dns.
  • Menjalankan kube-dns di Spot atau preemptible VM, yang dapat menyebabkan penghapusan node yang tidak terduga dan masalah resolusi DNS berikutnya.

Untuk mempercepat waktu pencarian DNS, Anda dapat memilih salah satu opsi berikut:

  • Hindari menjalankan komponen sistem penting seperti kube-dns di VM Spot atau preemptible. Menggunakan Spot VM atau preemptible VM untuk DNS dapat menyebabkan kegagalan dan mengganggu cluster Anda.
  • Sebagai praktik terbaik, buat setidaknya satu node pool yang terdiri dari VM standar (non-Spot atau preemptible) untuk menghosting komponen sistem penting seperti kube-dns. Untuk memastikan bahwa workload penting hanya dijadwalkan di node pool yang andal sehingga mencegahnya berjalan di Spot atau preemptible VM, Anda dapat menggunakan taint dan toleransi untuk Spot VM.
  • Aktifkan NodeLocal DNSCache.
  • Tingkatkan skala kube-dns.
  • Pastikan aplikasi Anda menggunakan fungsi berbasis dns.resolve*, bukan fungsi berbasis dns.lookup karena dns.lookup bersifat sinkron. Fungsi dns.resolve* selalu melakukan kueri DNS asinkron di jaringan.

Data DNS layanan

kube-dns hanya membuat data DNS untuk Layanan yang memiliki Endpoint{track-name="k8sLink" track-type="concept"}.

TTL besar dari server upstream DNS

Jika kube-dns menerima respons DNS dari DNS resolver upstream dengan TTL yang besar atau "tak terbatas", kube-dns akan menyimpan nilai TTL ini untuk entri DNS di dalam cache. Entri tidak akan pernah berakhir masa berlakunya dan dapat menimbulkan perbedaan antara entri dan alamat IP sebenarnya yang di-resolve untuk nama TTL.

GKE mengatasi masalah ini pada versi bidang kontrol berikut dengan menetapkan nilai TTL maksimum ke 30 detik untuk setiap respons DNS yang memiliki TTL lebih tinggi dari 30 detik:

  • 1.21.14-gke.9100
  • 1.22.15-gke.2100
  • 1.23.13-gke.500
  • 1.24.7-gke.500
  • 1.25.2-gke.500 atau yang lebih baru

Perilaku ini mirip dengan NodeLocal DNSCache.

Langkah selanjutnya