NodeLocal DNSCache menjalankan agen cache DNS sebagai DaemonSet di setiap node kluster untuk mengurangi latensi DNS dan meningkatkan keandalan kluster ACK. Topik ini menjelaskan cara menginstal, mengonfigurasi, dan mengelola NodeLocal DNSCache.
Cara kerja
NodeLocal DNSCache terdiri dari dua komponen:
-
DaemonSet (agen caching DNS): Berjalan di setiap node, membuat antarmuka jaringan virtual, dan mendengarkan kueri DNS pada
169.254.20.10secara default. Untuk mengubah alamat IP pendengar, ajukan tiket. -
Deployment (admission controller): Menangkap permintaan pembuatan Pod melalui admission webhook dan secara otomatis menyuntikkan dnsConfig ke dalam spesifikasi Pod.
Agen caching dibangun di atas CoreDNS dan hanya menyediakan layanan proxy dan caching. Jangan aktifkan plugin lain seperti hosts atau rewrite — konfigurasikan plugin tersebut di CoreDNS saja.
Diagram berikut menunjukkan alur kueri DNS setelah NodeLocal DNSCache diterapkan.
<table> <thead> <tr> <td><p><b>No.</b></p></td> <td><p><b>Deskripsi</b></p></td> </tr> </thead> <colgroup></colgroup> <colgroup></colgroup> <tbody> <tr> <td><p>①</p></td> <td><p>Secara default, Pod dengan dnsConfig lokal yang disuntikkan menggunakan NodeLocal DNSCache untuk mendengarkan kueri DNS yang dikirim ke alamat IP 169.254.20.10 pada node tersebut.</p></td> </tr> <tr> <td><p>②</p></td> <td><p>Jika NodeLocal DNSCache tidak menemukan hasil cache untuk kueri DNS tersebut, layanan kube-dns digunakan untuk meminta CoreDNS menangani kueri tersebut.</p></td> </tr> <tr> <td><p>③</p></td> <td><p>CoreDNS menggunakan server DNS yang diterapkan di virtual private cloud (VPC) untuk melakukan resolusi nama domain yang bukan lokal kluster.</p></td> </tr> <tr> <td><p>④</p></td> <td><p>Jika Pod dengan dnsConfig lokal yang disuntikkan gagal terhubung ke NodeLocal DNSCache, Pod tersebut menggunakan layanan kube-dns untuk terhubung ke CoreDNS guna melakukan resolusi DNS.</p></td> </tr> <tr> <td><p>⑤</p></td> <td><p>Pod tanpa dnsConfig lokal yang disuntikkan menggunakan layanan kube-dns untuk terhubung ke CoreDNS guna melakukan resolusi DNS.</p></td> </tr> </tbody> </table>
Untuk detail kebijakan caching, lihat Kebijakan resolusi DNS dan kebijakan caching.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Kluster ACK. Lihat Buat kluster ACK yang dikelola.
-
kubectl yang terhubung ke kluster. Lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
Batasan
-
NodeLocal DNSCache tidak mendukung Pod yang berjalan di kluster ACK Serverless atau di Elastic Container Instance (ECI) dalam kluster ACK yang dikelola maupun khusus.
-
Jika kluster menggunakan plugin jaringan Terway, diperlukan Terway versi 1.0.10.301 atau lebih baru. Jika Terway berjalan dalam mode ENI inklusif berbasis IPvlan, diperlukan konfigurasi tambahan. Lihat Konfigurasi Terway untuk mode IPvlan.
-
NodeLocal DNSCache adalah proxy caching transparan untuk CoreDNS dan tidak menyediakan plugin seperti
hostsataurewrite. Untuk menggunakan plugin tersebut, konfigurasikan di CoreDNS. -
Konfigurasikan protokol default untuk plugin forward CoreDNS sebelum menggunakan NodeLocal DNSCache, atau CoreDNS mungkin gagal melakukan resolusi nama domain eksternal. Lihat Praktik terbaik untuk layanan DNS.
-
NodeLocal DNSCache tidak diinstal pada node master secara default. Jika Pod bisnis berjalan di node master yang memiliki taint, tambahkan toleransi yang sesuai ke DaemonSet
node-local-dnsdi namespacekube-system.
Instal NodeLocal DNSCache
-
Masuk ke Konsol ACK. Di panel navigasi sebelah kiri, klik Konsol ACKClusters.
-
Temukan kluster yang ingin Anda kelola dan pilih More > Operations > Manage Components di kolom Actions.
-
Pada halaman Add-ons, klik tab Networking dan temukan ACK NodeLocal DNSCache.
-
Klik Install. Pada kotak dialog yang muncul, klik OK.
Konfigurasi NodeLocal DNSCache
Untuk mengarahkan kueri DNS dari Pod melalui NodeLocal DNSCache, atur nameservers dalam dnsConfig Pod ke 169.254.20.10 dan alamat IP kluster kube-dns. Gunakan salah satu metode berikut:
| Metode | Rekomendasi | Deskripsi |
|---|---|---|
| Metode 1: Penyuntikan dnsConfig otomatis | Direkomendasikan | Admission controller menyuntikkan dnsConfig saat pembuatan Pod — tidak perlu mengedit YAML secara manual. |
| Metode 2: dnsConfig manual | Netral | Tentukan dnsConfig langsung di YAML Pod. |
| Metode 3: Parameter startup kubelet | Tidak direkomendasikan | Memodifikasi kubelet dan memerlukan restart, yang dapat mengganggu beban kerja. |
Metode 1: Penyuntikan dnsConfig otomatis
Admission controller memantau permintaan pembuatan Pod di namespace yang memiliki label node-local-dns-injection=enabled dan secara otomatis menyuntikkan dnsConfig. Tambahkan label ke namespace untuk mengaktifkan penyuntikan:
kubectl label namespace default node-local-dns-injection=enabled
Perintah di atas hanya mengaktifkan penyuntikan untuk namespacedefault. Gantidefaultdengan namespace lain sesuai kebutuhan.
Saat penyuntikan otomatis diaktifkan, dnsConfig berikut ditambahkan ke Pod yang baru dibuat. Alamat IP kluster kube-dns disertakan sebagai server DNS cadangan untuk menjaga ketersediaan tinggi.
dnsConfig:
nameservers:
- 169.254.20.10
- 172.21.0.10
options:
- name: ndots
value: "3"
- name: attempts
value: "2"
- name: timeout
value: "1"
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
dnsPolicy: None
Kondisi penyuntikan
Penyuntikan hanya berlaku jika semua kondisi berikut terpenuhi:
-
Pod tidak berada di namespace
kube-systemataukube-public. -
Namespace Pod memiliki label
node-local-dns-injection=enabled. -
Namespace Pod tidak memiliki label terkait ECI (
virtual-node-affinity-injection,eci, ataualibabacloud.com/eci). -
Pod tidak memiliki label
eci,alibabacloud.com/eci, ataunode-local-dns-injection=disabled. -
Pod menggunakan
hostNetworkdengan kebijakan DNSClusterFirstWithHostNet, atau tidak menggunakanhostNetworkdan menggunakan kebijakan DNSClusterFirst.
Jika tidak ada alamat IP server DNS yang disuntikkan ke kontainer Pod, pastikan semua kondisi di atas terpenuhi.
Hindari penyuntikan untuk Pod tertentu
Untuk mengecualikan Pod tertentu dari penyuntikan meskipun penyuntikan diaktifkan untuk namespace-nya, tambahkan node-local-dns-injection=disabled ke label templat Pod:
metadata:
labels:
node-local-dns-injection: "disabled"
ECI tidak mendukung NodeLocal DNSCache. Saat Deployment melakukan scale out dan Pod baru ditempatkan di ECI, Pod tersebut tidak dapat terhubung ke NodeLocal DNSCache, sehingga menyebabkan kegagalan resolusi DNS. Nonaktifkan penyuntikan untuk seluruh Deployment dengan menambahkan node-local-dns-injection=disabled ke label templat Pod.
Metode 2: dnsConfig manual
Tentukan dnsConfig langsung di spesifikasi Pod:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: None
dnsConfig:
nameservers: ["169.254.20.10","172.21.0.10"]
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "3"
- name: attempts
value: "2"
- name: timeout
value: "1"
Bidang utama:
| Bidang | Nilai | Catatan |
|---|---|---|
dnsPolicy |
None |
Wajib ditentukan saat menetapkan dnsConfig kustom. |
nameservers |
169.254.20.10, IP kluster kube-dns |
Entri pertama mengarah ke NodeLocal DNSCache; entri kedua adalah fallback ke kube-dns. |
searches |
Domain pencarian DNS kluster | Memastikan nama layanan internal terselesaikan dengan benar. |
ndots |
3 |
Nilai yang lebih rendah mengurangi jumlah pencarian domain sebelum mencoba nama tersebut apa adanya. Nilai default adalah 5. Lihat resolv.conf. |
Metode 3: Parameter startup kubelet
Dalam /etc/systemd/system/kubelet.service.d/10-kubeadm.conf, tambahkan --cluster-dns dengan IP NodeLocal DNSCache dan IP kube-dns:
--cluster-dns=169.254.20.10 --cluster-dns=<kube-dns-ip> --cluster-domain=<search-domain>
| Parameter | Deskripsi |
|---|---|
--cluster-dns |
Server DNS yang ditulis ke dnsConfig Pod. Tentukan 169.254.20.10 terlebih dahulu, lalu IP kube-dns. |
--cluster-domain |
Domain pencarian DNS yang ditulis ke dnsConfig Pod. Di sebagian besar kluster, nilainya adalah cluster.local. |
Setelah mengedit file, terapkan perubahan:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
Restart kubelet dapat mengganggu beban kerja yang sedang berjalan untuk waktu singkat.
Contoh: konfigurasi NodeLocal DNSCache untuk Deployment
Contoh ini menggunakan Metode 1 (penyuntikan otomatis) untuk mengaktifkan NodeLocal DNSCache pada Deployment di namespace default.
-
Tambahkan label ke namespace untuk mengaktifkan penyuntikan dnsConfig otomatis.
PentingAdmission controller melewatkan Pod di namespace
kube-systemdankube-public. Jangan aktifkan penyuntikan untuk namespace tersebut.kubectl label namespace default node-local-dns-injection=enabled -
Terapkan aplikasi contoh. Simpan YAML berikut sebagai
ubuntu-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: ubuntu labels: app: ubuntu spec: replicas: 2 selector: matchLabels: app: ubuntu template: metadata: labels: app: ubuntu spec: containers: - name: ubuntu image: ubuntu command: ["sh", "-c"] args: ["sleep 100000"]Terapkan manifes:
kubectl apply -f ubuntu-deployment.yamlOutput yang diharapkan:
deployment.apps/ubuntu created -
Verifikasi Deployment sedang berjalan.
kubectl get deployment ubuntuOutput yang diharapkan:
NAME READY UP-TO-DATE AVAILABLE AGE ubuntu 2/2 2 2 7s -
Verifikasi bahwa dnsConfig telah disuntikkan. Dapatkan nama Pod:
kubectl get podsOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE ubuntu-766448f68c-m**** 1/1 Running 0 4m39s ubuntu-766448f68c-w**** 1/1 Running 0 4m39sPeriksa dnsConfig pada Pod:
kubectl get pod ubuntu-766448f68c-m**** -o=jsonpath='{.spec.dnsConfig}'Output yang diharapkan:
map[nameservers:[169.254.20.10 172.21.0.10] options:[map[name:ndots value:5]] searches:[default.svc.cluster.local svc.cluster.local cluster.local]]Kehadiran
169.254.20.10dalamnameserversmengonfirmasi bahwa dnsConfig telah disuntikkan.
Perbarui NodeLocal DNSCache
-
Masuk ke Konsol ACK. Di panel navigasi sebelah kiri, klik Clusters.
-
Temukan kluster yang ingin Anda kelola dan klik namanya. Di panel navigasi sebelah kiri, pilih Operations > Add-ons.
-
Pada halaman Add-ons, temukan NodeLocal DNSCache dan klik Upgrade. Pada kotak dialog yang muncul, klik OK.
Jika Anda memodifikasi toleransi pada DaemonSet node-local-dns, perubahan tersebut akan ditimpa selama upgrade. Konfigurasikan ulang toleransi setelah upgrade selesai. Jika upgrade gagal, lihat Troubleshooting komponen.
Uninstal NodeLocal DNSCache
-
Masuk ke Konsol ACK. Di panel navigasi sebelah kiri, klik Clusters.
-
Temukan kluster yang ingin Anda kelola dan klik namanya. Di panel navigasi sebelah kiri, pilih Operations > Add-ons.
-
Pada halaman Add-ons, temukan NodeLocal DNSCache dan klik Uninstall. Pada kotak dialog yang muncul, klik OK.
Setelah uninstal, semua kueri DNS langsung menuju CoreDNS. Lakukan scale out CoreDNS sebelum uninstal untuk menangani peningkatan beban.
Konfigurasi Terway untuk mode IPvlan
Pada kluster yang dibuat dengan versi awal Terway, konfigurasi default Terway mungkin tidak mengarahkan traffic DNS ke 169.254.20.10 dengan benar. Periksa dan perbarui konfigurasi sebelum menginstal NodeLocal DNSCache.
-
Buka ConfigMap Terway untuk diedit:
kubectl -n kube-system edit cm eni-config -o yaml -
Periksa ConfigMap:
-
Jika
eniip_virtual_typetidak diatur keIPVlan, tidak diperlukan perubahan. Lanjutkan ke Instal NodeLocal DNSCache. -
Jika
host_stack_cidrssudah ada, tidak diperlukan perubahan. Lanjutkan ke Instal NodeLocal DNSCache.
-
-
Jika
eniip_virtual_typeadalahIPVlandanhost_stack_cidrstidak ada, tambahkanhost_stack_cidrsdan atur nilainya ke169.254.20.10/32. Simpan dan keluar.10-terway.conf: | { "cniVersion": "0.3.0", "name": "terway", "eniip_virtual_type": "IPVlan", "host_stack_cidrs": ["169.254.20.10/32"], "type": "terway" } -
Daftar Pod DaemonSet Terway:
kubectl -n kube-system get pod | grep terway-eniipOutput yang diharapkan:
terway-eniip-7**** 2/2 Running 0 30m terway-eniip-s**** 2/2 Running 0 30m -
Hapus Pod untuk memicu pembuatan ulang dengan konfigurasi yang diperbarui:
kubectl -n kube-system delete pod terway-eniip-7**** terway-eniip-s**** -
Masuk ke node kluster dan verifikasi konfigurasi telah diterapkan:
cat /etc/cni/net.d/*Output yang diharapkan:
{ "cniVersion": "0.3.0", "name": "terway-chainer", "plugins": [ { "eniip_virtual_type": "IPVlan", "host_stack_cidrs": [ "169.254.20.10/32" ], "type": "terway" }, { "type": "cilium-cni" } ] }Setelah semua Pod Terway dibuat ulang dan berjalan, lanjutkan ke Instal NodeLocal DNSCache.