Instal cache DNS per node untuk mengurangi latensi kueri dan meningkatkan keandalan resolusi.
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.
Berdasarkan CoreDNS, agen caching hanya menyediakan proxy dan caching. Jangan aktifkan plugin seperti hosts atau rewrite di atasnya — konfigurasikan plugin tersebut di CoreDNS.
Alur kueri DNS setelah NodeLocal DNSCache diterapkan:
Alur kueri DNS setelah NodeLocal DNSCache diterapkan:
No. | Deskripsi |
① | Secara default, Pod dengan dnsConfig lokal yang disuntikkan menggunakan NodeLocal DNSCache, yang mendengarkan kueri DNS yang dikirim ke 169.254.20.10 pada node tersebut. |
② | Jika NodeLocal DNSCache tidak menemukan cache hit, ia menggunakan layanan kube-dns untuk meneruskan kueri ke CoreDNS. |
③ | CoreDNS menggunakan server DNS yang diterapkan di virtual private cloud (VPC) untuk menyelesaikan nama domain yang bukan lokal kluster. |
④ | Jika Pod dengan dnsConfig lokal yang disuntikkan gagal terhubung ke NodeLocal DNSCache, Pod tersebut menggunakan layanan kube-dns untuk terhubung ke CoreDNS guna resolusi DNS. |
⑤ | Pod tanpa dnsConfig lokal yang disuntikkan menggunakan layanan kube-dns untuk terhubung ke CoreDNS guna resolusi DNS. |
Prasyarat
Sebelum memulai, pastikan Anda telah:
Membuat kluster ACK.
kubectl telah terhubung ke kluster.
Batasan
Node Windows tidak didukung. Untuk Pod pada node virtual (termasuk Pod ECI dan ACS), caching DNS hanya didukung jika NodeLocal DNSCache v1.6.0 atau lebih baru dan ack-virtual-node v2.14.0 atau lebih baru telah diinstal.
Jika kluster menggunakan Terway, diperlukan versi 1.0.10.301 atau lebih baru. Jika Terway berjalan dalam Mode ENI inklusif dengan IPvlan, konfigurasikan Terway untuk mode IPvlan terlebih dahulu.
NodeLocal DNSCache hanya bertindak sebagai proxy caching transparan untuk CoreDNS dan tidak menyediakan ekstensibilitas plugin. Konfigurasikan plugin seperti
hostsataurewritedi CoreDNS saja.Konfigurasikan protokol default plugin forward CoreDNS sebelum menggunakan NodeLocal DNSCache, atau CoreDNS mungkin gagal menyelesaikan domain eksternal. Lihat Praktik terbaik untuk layanan DNS.
Tidak diinstal pada node master secara default. Jika Pod berjalan pada 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 kiri, klik Konsol ACK Clusters.
Temukan kluster Anda dan pilih More > Operations > Manage Components di kolom Actions.
Pada halaman Add-ons, klik tab Networking dan temukan ACK NodeLocal DNSCache.
Klik Install. Di kotak dialog, 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 |
Direkomendasikan | Admission controller menyuntikkan dnsConfig saat pembuatan Pod — tidak perlu mengedit YAML secara manual. | |
Netral | Tentukan dnsConfig langsung dalam YAML Pod. | |
Tidak direkomendasikan | Memodifikasi kubelet dan memerlukan restart, yang dapat mengganggu beban kerja. |
Metode 1: Penyuntikan dnsConfig otomatis
Admission controller menyuntikkan dnsConfig ke dalam Pod di namespace yang diberi label node-local-dns-injection=enabled. Beri label namespace untuk mengaktifkan penyuntikan:
kubectl label namespace default node-local-dns-injection=enabledIni hanya mengaktifkan penyuntikan untuk namespacedefault. Gantidefaultdengan namespace target Anda sesuai kebutuhan.
Saat diaktifkan, dnsConfig berikut ditambahkan ke Pod baru. IP kluster kube-dns disertakan sebagai fallback untuk 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: NoneKondisi 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 penyuntikan gagal, verifikasi semua kondisi di atas.
Hindari penyuntikan untuk Pod tertentu
Untuk mengecualikan Pod tertentu dari penyuntikan, tambahkan node-local-dns-injection=disabled ke label templat Pod:
metadata:
labels:
node-local-dns-injection: "disabled"Pada versi NodeLocal DNSCache sebelum v1.6.0 atau versi ack-virtual-node sebelum v2.14.0, Pod ECI tidak dapat menggunakan NodeLocal DNSCache, yang menyebabkan kegagalan DNS. Dalam kasus tersebut, nonaktifkan penyuntikan untuk Deployment dengan menambahkan node-local-dns-injection=disabled ke label templat Pod.
Metode 2: dnsConfig manual
Tentukan dnsConfig langsung dalam 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 |
|
| Diperlukan saat menentukan dnsConfig kustom. |
|
| Entri pertama mengarahkan ke NodeLocal DNSCache; yang kedua adalah fallback kube-dns. |
| Domain pencarian DNS kluster | Memastikan nama layanan internal terselesaikan dengan benar. |
|
| Nilai yang lebih rendah mengurangi pencarian domain sebelum mencoba nama apa adanya. Nilai default adalah |
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 |
| Server DNS yang ditulis ke dalam dnsConfig Pod. Tentukan |
| Domain pencarian DNS yang ditulis ke dalam dnsConfig Pod. Di sebagian besar kluster, ini adalah |
Setelah mengedit file, terapkan perubahan:
sudo systemctl daemon-reload
sudo systemctl restart kubeletMerestart kubelet dapat mengganggu beban kerja yang sedang berjalan untuk sementara waktu.
Contoh: Konfigurasi NodeLocal DNSCache untuk Deployment
Aktifkan NodeLocal DNSCache untuk Deployment di namespace default dengan Metode 1 (penyuntikan otomatis).
Beri label namespace untuk mengaktifkan penyuntikan dnsConfig otomatis.
PentingAdmission controller melewati Pod di namespace
kube-systemdankube-public. Jangan aktifkan penyuntikan untuk namespace tersebut.kubectl label namespace default node-local-dns-injection=enabledTerapkan aplikasi contoh. Simpan YAML ini 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 createdVerifikasi Deployment sedang berjalan.
kubectl get deployment ubuntuOutput yang diharapkan:
NAME READY UP-TO-DATE AVAILABLE AGE ubuntu 2/2 2 2 7sVerifikasi penyuntikan dnsConfig. 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 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 penyuntikan dnsConfig.
Peningkatan NodeLocal DNSCache
Masuk ke Konsol ACK. Di panel navigasi sebelah kiri, klik Clusters.
Klik nama kluster Anda. Di panel navigasi kiri, pilih Operations > Add-ons.
Pada halaman Add-ons, temukan NodeLocal DNSCache dan klik Upgrade. Di kotak dialog, klik OK.
Toleransi kustom pada DaemonSet node-local-dns akan ditimpa selama peningkatan. Konfigurasikan ulang setelahnya. Jika peningkatan gagal, lihat Troubleshooting komponen.Uninstal NodeLocal DNSCache
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Klik nama kluster Anda. Di panel navigasi kiri, pilih Operations > Add-ons.
Pada halaman Add-ons, temukan NodeLocal DNSCache dan klik Uninstall. Di kotak dialog, 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 dengan versi Terway lama, konfigurasi default mungkin tidak mengarahkan traffic DNS ke 169.254.20.10 dengan benar. Perbarui konfigurasi sebelum menginstal NodeLocal DNSCache.
Buka ConfigMap Terway untuk diedit:
kubectl -n kube-system edit cm eni-config -o yamlPeriksa ConfigMap:
Jika
eniip_virtual_typebukanIPVlan, tidak perlu perubahan. Lanjutkan ke Instal NodeLocal DNSCache.Jika
host_stack_cidrssudah ada, tidak perlu perubahan. Lanjutkan ke Instal NodeLocal DNSCache.
Jika
eniip_virtual_typeadalahIPVlandanhost_stack_cidrstidak ada, tambahkanhost_stack_cidrsdan atur nilainya menjadi169.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 30mHapus Pod untuk menerapkan konfigurasi yang diperbarui:
kubectl -n kube-system delete pod terway-eniip-7**** terway-eniip-s****Masuk ke node kluster dan verifikasi pembaruan:
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 berjalan, lanjutkan ke Instal NodeLocal DNSCache.