全部产品
Search
文档中心

Container Service for Kubernetes:Konfigurasi NodeLocal DNSCache

更新时间:Jul 02, 2025

Container Service for Kubernetes (ACK) memungkinkan Anda untuk menerapkan NodeLocal DNSCache guna meningkatkan stabilitas dan performa penemuan layanan. NodeLocal DNSCache diimplementasikan sebagai DaemonSet dan menjalankan agen caching DNS pada setiap node klaster untuk meningkatkan efisiensi resolusi DNS dalam klaster ACK. Topik ini menjelaskan cara menerapkan dan mengonfigurasi NodeLocal DNSCache untuk aplikasi dalam klaster ACK.

Prasyarat

Batasan

  • NodeLocal DNSCache tidak mendukung pod yang berjalan di ACK Serverless cluster atau pada instance kontainer elastis dalam klaster ACK yang dikelola atau klaster ACK khusus.

  • Jika klaster Anda menggunakan plug-in jaringan Terway, versi Terway harus 1.0.10.301 atau lebih baru. Jika klaster Anda menjalankan Terway dalam mode ENI inklusif berbasis IPvlan, Anda harus memodifikasi konfigurasi Terway. Untuk informasi lebih lanjut, lihat Modifikasi konfigurasi Terway (Klaster yang dibuat menggunakan versi awal Terway).

  • NodeLocal DNSCache berfungsi sebagai proxy caching transparan untuk CoreDNS dan tidak menyediakan plug-in seperti hosts atau rewrite. Jika Anda ingin mengaktifkan plug-in ini, modifikasi konfigurasi CoreDNS.

  • Jika Anda tidak memodifikasi konfigurasi CoreDNS sebelum menggunakan NodeLocal DNSCache, CoreDNS mungkin gagal menyelesaikan nama domain eksternal. Untuk informasi lebih lanjut, lihat Konfigurasikan protokol default untuk Forward plug-in dan server DNS upstream dari VPC.

Pengenalan

ACK NodeLocal DNSCache adalah solusi caching DNS lokal yang dikembangkan berdasarkan proyek NodeLocal DNSCache open source. Solusi ini terdiri dari agen caching DNS yang berjalan sebagai DaemonSet dan pengontrol admission yang berjalan sebagai Deployment untuk menyuntikkan DNSConfig secara dinamis.

  • Pengontrol admission mencegat permintaan pembuatan pod berdasarkan admission webhook dan menyuntikkan DNSConfig secara dinamis ke dalam konfigurasi pod.

    Catatan

    Jika Anda tidak mengaktifkan pengontrol admission untuk menyuntikkan DNSConfig secara otomatis, Anda harus menambahkan pengaturan DNS secara manual ke konfigurasi pod. Untuk informasi lebih lanjut, lihat Metode 2: Tentukan DNSConfig secara manual.

  • DaemonSet yang menjalankan agen caching DNS pada setiap node dapat membuat antarmuka jaringan virtual. Secara default, antarmuka jaringan virtual mendengarkan kueri DNS yang dikirim ke alamat IP 169.254.20.10. Untuk mengubah alamat IP, submit a ticket. Kueri DNS yang dihasilkan dalam pod diproksi oleh DaemonSet berdasarkan DNSConfig pod dan pengaturan jaringan node.

    Penting

    DaemonSet yang menjalankan agen caching DNS dibangun berdasarkan CoreDNS dan hanya menyediakan layanan proxy dan caching. Jangan aktifkan plug-in lain seperti hosts atau rewrite.

Untuk informasi lebih lanjut tentang kebijakan caching yang didukung oleh NodeLocal DNSCache, lihat Kebijakan resolusi DNS dan kebijakan caching.

Gambar 1. Cara kerja NodeLocal DNSCache

No.

Deskripsi

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.

Jika NodeLocal DNSCache tidak menemukan cache hit untuk kueri DNS, layanan kube-dns digunakan untuk meminta CoreDNS menangani kueri tersebut.

CoreDNS menggunakan server DNS yang diterapkan di virtual private cloud (VPC) untuk menyelesaikan nama domain yang bukan milik klaster.

Jika pod dengan DNSConfig lokal yang disuntikkan gagal terhubung ke NodeLocal DNSCache, pod menggunakan layanan kube-dns untuk terhubung ke CoreDNS untuk resolusi DNS.

Pod tanpa DNSConfig lokal yang disuntikkan menggunakan layanan kube-dns untuk terhubung ke CoreDNS untuk resolusi DNS.

Instal NodeLocal DNSCache

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

  2. Di halaman Clusters, temukan klaster yang ingin Anda kelola dan pilih More > Operations > Manage Components di kolom Actions.

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

  4. Klik Install. Dalam pesan yang muncul, klik OK.

Konfigurasi NodeLocal DNSCache

Catatan

Secara default, NodeLocal DNSCache tidak diinstal pada node master. Jika Anda ingin menerapkan pod bisnis pada node master dan node master ditambahkan dengan taint, Anda harus menambahkan toleransi yang sesuai ke konfigurasi node-local-dns di namespace kube-system.

Untuk mengarahkan ulang permintaan DNS yang ditujukan untuk CoreDNS ke DaemonSet yang menjalankan agen caching DNS, Anda harus mengatur parameter nameservers dalam konfigurasi pod ke 169.254.20.10 dan alamat IP kube-dns. Untuk melakukannya, gunakan salah satu metode berikut:

Metode 1: Suntikkan DNSConfig secara otomatis

Anda dapat menggunakan pengontrol admission untuk menyuntikkan DNSConfig secara otomatis ke pod baru yang dibuat. Dengan cara ini, Anda tidak perlu mengonfigurasi file YAML pod secara manual. Secara default, aplikasi mendengarkan permintaan pembuatan pod dari namespace yang memiliki label node-local-dns-injection=enabled. Anda dapat menggunakan perintah berikut untuk menambahkan label ini ke namespace.

kubectl label namespace default node-local-dns-injection=enabled
Catatan
  • Perintah di atas hanya mengaktifkan penyuntikan DNSConfig otomatis untuk namespace default. Untuk mengaktifkan penyuntikan DNSConfig otomatis untuk namespace lainnya, ganti default sesuai kebutuhan Anda.

  • Jika penyuntikan DNSConfig otomatis diaktifkan untuk namespace tetapi Anda tidak ingin menyuntikkan DNSConfig secara otomatis ke beberapa pod, Anda dapat menambahkan label node-local-dns-injection=disabled ke template pod tersebut.

  • Instance kontainer elastis tidak mendukung NodeLocal DNSCache. Saat Deployment diskalakan secara dinamis, pod baru mungkin dibuat pada instance kontainer elastis. Dalam kasus ini, pod baru yang berjalan pada instance kontainer elastis tidak dapat terhubung ke NodeLocal DNSCache, yang dapat menyebabkan kegagalan resolusi DNS. Untuk menyelesaikan masalah ini, Anda harus menonaktifkan penyuntikan DNSConfig otomatis untuk semua pod yang disediakan untuk Deployment dengan menambahkan node-local-dns-injection=disabled ke parameter label template pod.

Setelah penyuntikan DNSConfig otomatis diaktifkan, parameter berikut ditambahkan ke pod baru yang dibuat. Untuk memastikan ketersediaan tinggi layanan DNS, alamat IP klaster kube-dns ditambahkan ke parameter nameservers sebagai server DNS cadangan.

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

Penyuntikan DNSConfig otomatis hanya berlaku jika pod memenuhi semua persyaratan berikut. Jika tidak ada alamat IP server DNS yang disuntikkan ke kontainer dalam pod, Anda perlu memeriksa apakah pod memenuhi persyaratan ini.

  • Pod baru yang dibuat tidak termasuk dalam namespace kube-system atau kube-public.

  • Namespace tempat pod baru dibuat memiliki label node-local-dns-injection=enabled.

  • Namespace tempat pod baru dibuat tidak memiliki label terkait Elastic Container Instance, seperti virtual-node-affinity-injection, eci, dan alibabacloud.com/eci.

  • Pod baru yang dibuat tidak memiliki label terkait Elastic Container Instance, seperti eci dan alibabacloud.com/eci, atau label node-local-dns-injection=disabled label.

  • Pod baru yang dibuat menggunakan jaringan hostNetwork dan kebijakan DNS ClusterFirstWithHostNet, atau pod tidak menggunakan jaringan hostNetwork tetapi menggunakan kebijakan DNS ClusterFirst.

Metode 2: Tentukan DNSConfig secara manual

Jika Anda tidak ingin menggunakan admission webhook untuk menyuntikkan DNSConfig secara otomatis, Anda dapat memodifikasi konfigurasi pod untuk menentukan DNSConfig secara manual.

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"
  • dnsPolicy: Atur nilainya menjadi None.

  • nameservers: Atur nilainya menjadi 169.254.20.10 dan alamat IP klaster kube-dns.

  • searches: Atur domain pencarian DNS. Pastikan bahwa nama domain internal dapat diselesaikan.

  • ndots: Anda dapat meningkatkan efisiensi resolusi dengan mengatur parameter ini ke nilai yang lebih kecil. Nilai default: 5. Untuk informasi lebih lanjut, lihat resolv.conf.

Metode 3: Konfigurasikan parameter startup kubelet

Kubelet menggunakan parameter --cluster-dns dan --cluster-domain untuk mengontrol DNSConfig pod. Dalam file /etc/systemd/system/kubelet.service.d/10-kubeadm.conf, tambahkan parameter --cluster-dns dan atur nilainya ke alamat IP lokal 169.254.20.10. Kemudian, jalankan perintah sudo systemctl daemon-reload dan sudo systemctl restart kubelet agar perubahan diterapkan.

--cluster-dns=169.254.20.10 --cluster-dns=<kube-dns ip> --cluster-domain=<search domain>
  • cluster-dns: menentukan server DNS yang digunakan dalam konfigurasi pod. Secara default, hanya alamat IP `kube-dns` yang ditentukan. Anda harus menambahkan alamat IP lokal 169.254.20.10.

  • cluster-domain: menentukan domain pencarian DNS yang digunakan dalam konfigurasi pod. Anda dapat menggunakan domain pencarian yang ada. Dalam banyak kasus, domain pencarian yang ada adalah `cluster.local`.

Contoh cara mengonfigurasi NodeLocal DNSCache

Contoh berikut menunjukkan cara mengonfigurasi NodeLocal DNSCache untuk Deployment yang dibuat di namespace default.

  1. Jalankan perintah berikut untuk menambahkan label ke namespace tempat Deployment berada. Dalam contoh ini, Deployment dibuat di namespace default.

    kubectl label namespace default node-local-dns-injection=enabled
    Penting

    Pengontrol admission mengabaikan aplikasi di namespace kube-system dan kube-public. Jangan konfigurasikan untuk menyuntikkan dnsConfig secara otomatis ke aplikasi di kedua namespace tersebut.

  2. Terapkan aplikasi sampel di namespace default.

    1. Gunakan template YAML berikut untuk membuat aplikasi sampel bernama ubuntu-deployment:

      apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
      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"]
    2. Jalankan perintah berikut untuk menerapkan aplikasi di klaster:

      kubectl apply -f ubuntu-deployment.yaml

      Output yang diharapkan:

      deployment.apps/ubuntu created
    3. Jalankan perintah berikut untuk melihat informasi tentang aplikasi:

      kubectl get deployment ubuntu

      Output yang diharapkan:

      NAME     READY   UP-TO-DATE   AVAILABLE   AGE
      ubuntu   2/2     2            2           7s
  3. Periksa apakah dnsConfig disuntikkan.

    1. Jalankan perintah berikut untuk menanyakan pod yang menjalankan aplikasi:

      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
    2. Jalankan perintah berikut untuk memeriksa apakah NodeLocal DNSCache diaktifkan dalam 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]]

      Output di atas menunjukkan bahwa NodeLocal DNSCache diaktifkan untuk aplikasi.

      Setelah NodeLocal DNSCache diaktifkan untuk aplikasi, parameter berikut ditambahkan ke pod yang disediakan untuk aplikasi. Untuk memastikan ketersediaan tinggi layanan DNS, alamat IP klaster 172.21.0.10 dari layanan kube-dns ditentukan sebagai alamat IP server DNS cadangan dalam parameter nameservers.

        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

Memperbarui NodeLocal DNSCache

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

  2. Di halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di panel navigasi di sebelah kiri, klik Add-ons.

  3. Di halaman Add-ons, temukan NodeLocal DNSCache dan klik Upgrade. Di pesan yang muncul, klik OK.

    Catatan
    • Jika Anda memodifikasi tolerations untuk DaemonSet node-local-dns, modifikasi tersebut akan ditimpa selama proses pembaruan. Anda harus mengonfigurasi ulang tolerations setelah pembaruan selesai.

    • Jika sistem gagal memperbarui NodeLocal DNSCache, lakukan pemecahan masalah berdasarkan kode kesalahan yang diberikan. Untuk informasi lebih lanjut, lihat Pemecahan Masalah Komponen.

Hapus Instalasi NodeLocal DNSCache

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

  2. Di halaman Clusters, temukan yang ingin Anda kelola dan klik namanya. Di panel navigasi di sebelah kiri, klik Add-ons.

  3. Di halaman Add-ons, temukan NodeLocal DNSCache dan klik Uninstall. Di pesan yang muncul, klik OK.

    Catatan

    Setelah NodeLocal DNSCache dihapus instalasinya, semua permintaan DNS dikirim ke CoreDNS. Kami menyarankan Anda untuk memperluas CoreDNS sebelum menghapus instalasi NodeLocal DNSCache.

Modifikasi konfigurasi Terway (Kluster yang dibuat menggunakan versi awal Terway)

Pada kluster yang dibuat dengan versi awal Terway, konfigurasi default Terway mungkin tidak mendukung NodeLocal DNSCache. Anda dapat merujuk pada langkah-langkah berikut untuk memeriksa dan memodifikasi konfigurasi Terway.

  1. Jalankan perintah berikut untuk melihat ConfigMap dari Terway:

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

    • Periksa apakah IPvlan diaktifkan di dalam bidang eniip_virtual_type. Jika bidang ini tidak ada di dalam ConfigMap atau nilainya tidak diatur ke IPvlan, Anda tidak perlu melakukan langkah-langkah berikut sebelum menginstal NodeLocal DNSCache. Untuk informasi lebih lanjut, lihat Instal NodeLocal DNSCache.

    • Periksa apakah bidang host_stack_cidrs ditentukan di dalam ConfigMap. Jika bidang host_stack_cidrs ditentukan, Anda tidak perlu melakukan langkah-langkah berikut sebelum menginstal NodeLocal DNSCache. Untuk informasi lebih lanjut, lihat Instal NodeLocal DNSCache.

  3. Tambahkan bidang host_stack_cidrs ke dalam ConfigMap Terway dan atur nilainya menjadi 169.254.20.10/32. Lalu, simpan ConfigMap 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. Jalankan perintah berikut untuk menanyakan semua DaemonSet pod yang disediakan untuk 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. Jalankan perintah berikut untuk membuat ulang pod Terway:

     kubectl -n kube-system delete pod terway-eniip-7**** terway-eniip-s****
  6. Masuk ke salah satu node kluster dan jalankan perintah berikut untuk menanyakan ConfigMap dari Terway.

    Jika ConfigMap berisi blok CIDR yang Anda tambahkan, maka ConfigMap dari Terway telah dimodifikasi.

    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 normal, Anda dapat menginstal NodeLocal DNSCache.