All Products
Search
Document Center

Container Service for Kubernetes:Gunakan add-on NodeLocal DNSCache

Last Updated:Jun 16, 2026

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.10 secara 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:

image

Alur kueri DNS setelah NodeLocal DNSCache diterapkan:

image

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.

Lihat Kebijakan resolusi DNS dan kebijakan caching.

Prasyarat

Sebelum memulai, pastikan Anda telah:

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 hosts atau rewrite di 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-dns di namespace kube-system.

Instal NodeLocal DNSCache

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Konsol ACK Clusters.

  2. Temukan kluster Anda dan pilih More > Operations > Manage Components di kolom Actions.

  3. Pada halaman Add-ons, klik tab Networking dan temukan ACK NodeLocal DNSCache.

  4. 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

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 dalam 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 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=enabled
Ini hanya mengaktifkan penyuntikan untuk namespace default. Ganti default dengan 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: None

Kondisi penyuntikan

Penyuntikan hanya berlaku jika semua kondisi berikut terpenuhi:

  • Pod tidak berada di namespace kube-system atau kube-public.

  • Namespace Pod memiliki label node-local-dns-injection=enabled.

  • Namespace Pod tidak memiliki label terkait ECI (virtual-node-affinity-injection, eci, atau alibabacloud.com/eci).

  • Pod tidak memiliki label eci, alibabacloud.com/eci, atau node-local-dns-injection=disabled.

  • Pod menggunakan hostNetwork dengan kebijakan DNS ClusterFirstWithHostNet, atau tidak menggunakan hostNetwork dan menggunakan kebijakan DNS ClusterFirst.

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"
Penting

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

dnsPolicy

None

Diperlukan saat menentukan dnsConfig kustom.

nameservers

169.254.20.10, IP kluster kube-dns

Entri pertama mengarahkan ke NodeLocal DNSCache; yang kedua adalah fallback kube-dns.

searches

Domain pencarian DNS kluster

Memastikan nama layanan internal terselesaikan dengan benar.

ndots

3

Nilai yang lebih rendah mengurangi pencarian domain sebelum mencoba nama 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 dalam dnsConfig Pod. Tentukan 169.254.20.10 terlebih dahulu, lalu IP kube-dns.

--cluster-domain

Domain pencarian DNS yang ditulis ke dalam dnsConfig Pod. Di sebagian besar kluster, ini adalah cluster.local.

Setelah mengedit file, terapkan perubahan:

sudo systemctl daemon-reload
sudo systemctl restart kubelet
Penting

Merestart 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).

  1. Beri label namespace untuk mengaktifkan penyuntikan dnsConfig otomatis.

    Penting

    Admission controller melewati Pod di namespace kube-system dan kube-public. Jangan aktifkan penyuntikan untuk namespace tersebut.

    kubectl label namespace default node-local-dns-injection=enabled
  2. Terapkan 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.yaml

    Output yang diharapkan:

    deployment.apps/ubuntu created
  3. Verifikasi Deployment sedang berjalan.

    kubectl get deployment ubuntu

    Output yang diharapkan:

    NAME     READY   UP-TO-DATE   AVAILABLE   AGE
    ubuntu   2/2     2            2           7s
  4. Verifikasi penyuntikan dnsConfig. Dapatkan nama Pod:

    kubectl get pods

    Output yang diharapkan:

    NAME                      READY   STATUS    RESTARTS   AGE
    ubuntu-766448f68c-m****   1/1     Running   0          4m39s
    ubuntu-766448f68c-w****   1/1     Running   0          4m39s

    Periksa 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.10 dalam nameservers mengonfirmasi penyuntikan dnsConfig.

Peningkatan NodeLocal DNSCache

  1. Masuk ke Konsol ACK. Di panel navigasi sebelah kiri, klik Clusters.

  2. Klik nama kluster Anda. Di panel navigasi kiri, pilih Operations > Add-ons.

  3. 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

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Klik nama kluster Anda. Di panel navigasi kiri, pilih Operations > Add-ons.

  3. Pada halaman Add-ons, temukan NodeLocal DNSCache dan klik Uninstall. Di kotak dialog, klik OK.

Penting

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.

  1. Buka ConfigMap Terway untuk diedit:

    kubectl -n kube-system edit cm eni-config -o yaml
  2. Periksa ConfigMap:

  3. Jika eniip_virtual_type adalah IPVlan dan host_stack_cidrs tidak ada, tambahkan host_stack_cidrs dan atur nilainya menjadi 169.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"
     }
  4. Daftar Pod DaemonSet Terway:

    kubectl -n kube-system get pod | grep terway-eniip

    Output yang diharapkan:

    terway-eniip-7****         2/2     Running   0          30m
    terway-eniip-s****         2/2     Running   0          30m
  5. Hapus Pod untuk menerapkan konfigurasi yang diperbarui:

    kubectl -n kube-system delete pod terway-eniip-7**** terway-eniip-s****
  6. 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.

Langkah selanjutnya