全部产品
Search
文档中心

Container Service for Kubernetes:Praktik terbaik DNS

更新时间:Feb 03, 2026

DNS merupakan layanan kritis dalam kluster Kubernetes. Dalam kondisi tertentu—seperti konfigurasi klien yang tidak tepat atau skala kluster yang besar—DNS dapat mengalami timeout dan kegagalan resolusi. Panduan ini menyediakan praktik terbaik untuk membantu Anda menghindari masalah tersebut.

Penting

Topik ini tidak berlaku untuk kluster Container Service for Kubernetes (ACK) yang menggunakan edisi managed CoreDNS atau telah mengaktifkan Auto Mode. Kluster tersebut secara otomatis melakukan scaling berdasarkan beban tanpa perlu penyesuaian manual.

Daftar Isi

Praktik terbaik DNS mencakup optimasi sisi klien dan sisi server:

Untuk informasi lebih lanjut tentang CoreDNS, lihat dokumentasi resmi CoreDNS.

Optimalkan permintaan resolusi DNS

Resolusi DNS merupakan salah satu operasi jaringan paling sering dilakukan dalam kluster Kubernetes. Banyak permintaan resolusi dapat dioptimalkan atau dihindari untuk mengurangi latensi dan beban pada infrastruktur DNS:

  • (Direkomendasikan) Gunakan kolam koneksi: Ketika aplikasi dalam kontainer sering meminta layanan yang sama, gunakan kolam koneksi untuk menyimpan cache koneksi aktif ke layanan upstream di memori. Hal ini menghilangkan overhead resolusi DNS dan handshake TCP untuk setiap permintaan.

  • Gunakan mode asinkron atau long-polling untuk mengambil IP yang terkait dengan nama domain.

  • Gunakan cache DNS:

    • (Direkomendasikan) Jika aplikasi Anda tidak dapat direfaktor untuk menggunakan kolam koneksi, pertimbangkan untuk menyimpan cache hasil resolusi DNS di sisi aplikasi. Untuk petunjuknya, lihat Tingkatkan stabilitas dengan NodeLocal DNSCache.

    • Jika Anda tidak dapat menggunakan NodeLocal DNSCache, gunakan Name Service Cache Daemon (NSCD) bawaan dalam kontainer Anda.

  • Optimalkan file resolv.conf: Parameter ndots dan search menentukan efisiensi resolusi. Untuk detailnya, lihat Konfigurasikan kebijakan DNS dan resolusi nama domain.

  • Optimalkan konfigurasi domain: Konfigurasikan nama domain mengikuti prinsip-prinsip berikut untuk meminimalkan upaya resolusi dan mengurangi latensi:

    • Ketika sebuah Pod mengakses Layanan dalam namespace yang sama, gunakan <service-name>.

    • Ketika sebuah Pod mengakses Layanan dalam namespace berbeda, gunakan <service-name>.<namespace-name>.

    • Ketika sebuah Pod mengakses domain di luar kluster, gunakan Fully Qualified Domain Name (FQDN) dengan menambahkan titik (.). Hal ini memaksa resolver memperlakukan nama tersebut sebagai absolut, sehingga melewati pencarian yang tidak valid melalui domain internal kluster. Misalnya, gunakan www.aliyun.com. alih-alih www.aliyun.com.

      • Pada kluster yang menjalankan Kubernetes 1.33 atau versi lebih baru, atur domain search menjadi satu titik (.) (lihat Issue 125883). Hal ini secara efektif mengubah semua permintaan DNS menjadi permintaan FQDN, mencegah iterasi domain pencarian yang tidak perlu.

        Cuplikan contoh dnsConfig:

        dnsPolicy: None
        dnsConfig:
          nameservers: ["192.168.0.10"]  ## Ganti dengan ClusterIP aktual layanan CoreDNS Anda.
          searches:
          - .
          - default.svc.cluster.local  ## Ganti 'default' dengan namespace aktual Anda.
          - svc.cluster.local
          - cluster.local

        /etc/resolv.conf yang dihasilkan:

        search . default.svc.cluster.local svc.cluster.local cluster.local
        nameserver 192.168.0.10

        Dengan . sebagai domain pencarian pertama, sistem langsung mengenali permintaan sebagai FQDN, memprioritaskan resolusi mandiri dan menghilangkan pencarian rekursif yang tidak valid.

        Penting

        Anda harus mengatur dnsPolicy ke None agar konfigurasi di atas berlaku.

        Contoh lengkap workload

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          labels:
            app: nginx
          name: nginx
          namespace: default
        spec:
          progressDeadlineSeconds: 600
          replicas: 3
          revisionHistoryLimit: 10
          selector:
            matchLabels:
              app: nginx
          strategy:
            rollingUpdate:
              maxSurge: 25%
              maxUnavailable: 25%
            type: RollingUpdate
          template:
            metadata:
              labels:
                app: nginx
            spec:
              containers:
              - image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
                imagePullPolicy: Always
                name: nginx
                resources: {}
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
              dnsPolicy: None
              dnsConfig:
                nameservers: ["192.168.0.10"]  ## Ganti dengan ClusterIP aktual layanan CoreDNS Anda.
                searches:
                - .
                - default.svc.cluster.local
                - svc.cluster.local
                - cluster.local
              hostname: nginx
              restartPolicy: Always
              schedulerName: default-scheduler
              securityContext: {}
              subdomain: subdomain
              terminationGracePeriodSeconds: 30

Catatan tentang konfigurasi DNS dalam kontainer

  • Resolver DNS yang berbeda dapat menunjukkan variasi perilaku halus karena implementasi dasarnya. Anda mungkin menemukan kasus di mana dig <domain> berhasil sedangkan ping <domain> gagal.

  • Hindari gambar Alpine: Kami sangat menyarankan menggunakan gambar dasar seperti Debian atau CentOS alih-alih Alpine Linux. Pustaka musl libc yang digunakan di Alpine memiliki beberapa perbedaan implementasi dibandingkan glibc standar, yang menyebabkan masalah termasuk namun tidak terbatas pada:

    • Fallback TCP: Alpine v3.18 dan versi sebelumnya tidak mendukung fallback ke TCP berdasarkan bit truncated (TC).

    • Domain pencarian: Alpine v3.3 dan versi sebelumnya tidak mendukung parameter search, yang mengganggu penemuan layanan dalam kluster.

    • Konflik optimasi: Alpine melakukan permintaan secara konkuren ke semua server DNS yang tercantum dalam /etc/resolv.conf, yang dapat melewati dan membatalkan optimasi NodeLocal DNSCache.

    • Kondisi race Conntrack: Permintaan rekaman A dan AAAA secara konkuren menggunakan socket yang sama dapat memicu konflik port sumber pada kernel Linux lawas, mengakibatkan kehilangan paket dan timeout resolusi.

    Untuk masalah lainnya, lihat dokumentasi musl libc.

  • Jika Anda menggunakan aplikasi Go, perhatikan perbedaan antara resolver DNS CGO dan Pure Go.

Mitigasi timeout DNS intermiten dalam mode IPVS

Ketika kluster ACK menggunakan IPVS sebagai mode load-balancing kube-proxy, Anda mungkin mengalami timeout resolusi DNS intermiten selama scaling atau restart Pod CoreDNS. Hal ini disebabkan oleh cacat kernel Linux yang sudah diketahui. Lihat commit IPVS.

Untuk mengurangi dampak kelemahan IPVS ini, gunakan salah satu metode berikut:

Tingkatkan stabilitas dengan NodeLocal DNSCache

CoreDNS kadang-kadang mengalami masalah berikut:

  • Kehilangan paket langka akibat kueri A dan AAAA konkuren, menyebabkan kegagalan DNS.

  • Tabel conntrack node penuh, menyebabkan kehilangan paket dan kegagalan DNS.

Untuk meningkatkan stabilitas dan performa DNS, instal NodeLocal DNSCache. Add-on ini menjalankan cache DNS pada setiap node kluster untuk menangani trafik DNS secara lokal.

Penting

Setelah menginstal NodeLocal DNSCache, Anda harus mengaktifkan injeksi untuk workload Anda. Jalankan perintah berikut untuk memberi label namespace. Semua Pod baru yang dibuat dalam namespace ini akan secara otomatis menggunakan konfigurasi cache DNS.

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

Untuk petunjuk detail dan metode injeksi lainnya, lihat Gunakan NodeLocal DNSCache.

Pertahankan versi CoreDNS

CoreDNS mempertahankan kompatibilitas mundur yang kuat dengan Kubernetes. Namun, penting untuk selalu memperbarui CoreDNS ke versi stabil. Kelola, upgrade, dan konfigurasikan CoreDNS melalui halaman Add-ons.

Jika konsol ACK menampilkan pembaruan CoreDNS yang tersedia, jadwalkan upgrade sesegera mungkin selama jam sepi.

Risiko pada versi CoreDNS di bawah 1.7.0

Versi minimum CoreDNS yang direkomendasikan

Versi kluster

Versi minimum CoreDNS yang direkomendasikan

Di bawah 1.14.8

1.6.2 (End of life)

1.14.8 hingga 1.20.4

1.7.0.0-f59c03d-aliyun

1.20.4 hingga 1.21.0

1.8.4.1-3a376cc-aliyun

1.21.0 dan di atasnya

1.11.3.2-f57ea7ed6-aliyun

Pantau status operasional CoreDNS

Metrik dan dasbor

CoreDNS mengekspos metrik kesehatan dan performa melalui antarmuka Prometheus standar untuk mendeteksi pengecualian pada CoreDNS dan server DNS upstream.

  • Kluster ACK yang dikelola:Managed Service for Prometheus menyediakan dasbor pemantauan metrik bawaan dan aturan peringatan untuk CoreDNS. Anda dapat mengaktifkan fitur Prometheus dan dasbor di Konsol ACK. Lihat Pantau komponen CoreDNS.

  • Prometheus yang dikelola sendiri: Ambil metrik CoreDNS dan konfigurasikan peringatan untuk indikator kritis. Lihat dokumentasi resmi Prometheus CoreDNS.

Analisis log

Jika terjadi pengecualian DNS, log CoreDNS sangat penting untuk diagnosis akar penyebab. Kami merekomendasikan untuk mengaktifkan logging resolusi DNS dan pengumpulan Simple Log Service (SLS). Untuk detailnya, lihat Analisis dan pantau log CoreDNS.

Pengiriman event Kubernetes

Pada CoreDNS v1.9.3.6-32932850-aliyun dan versi selanjutnya, gunakan plugin k8s_event untuk mengirim log kritis ke Event Center sebagai event Kubernetes. Lihat k8s_event.

CoreDNS yang baru diterapkan mengaktifkan fitur ini secara default. Jika melakukan upgrade dari versi sebelumnya ke v1.9.3.6-32932850-aliyun atau versi selanjutnya, ubah file konfigurasi secara manual untuk mengaktifkannya.

  1. Edit ConfigMap CoreDNS.

    kubectl -n kube-system edit configmap/coredns
  2. Tambahkan plugin kubeAPI dan k8s_event ke konfigurasi.

    apiVersion: v1
    data:
      Corefile: |
        .:53 {
            errors
            health {
                lameduck 15s
            }
    
            # --- Penambahan Dimulai (abaikan perbedaan lainnya) ---
            kubeapi
            k8s_event {
              level info error warning // Kirim log kunci dengan status info, error, dan warning.
            }
            # --- Penambahan Berakhir ---
    
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods verified
                fallthrough in-addr.arpa ip6.arpa
            }
            # (Konfigurasi sisanya dihilangkan)
        }
  3. Verifikasi pembaruan dengan memeriksa log Pod CoreDNS. Jika log berisi kata reload, modifikasi berhasil.

Pastikan ketersediaan tinggi CoreDNS

CoreDNS adalah penyedia DNS otoritatif untuk kluster Anda. Stabilitasnya sangat kritis; kegagalan dapat menyebabkan kesalahan resolusi layanan dan gangguan aplikasi secara luas. Bagian ini menjelaskan cara memantau CoreDNS dan menerapkan strategi ketersediaan tinggi (HA).

Evaluasi tekanan CoreDNS

Gunakan alat open-source seperti DNSPerf untuk mengukur performa DNS Anda. Jika Anda tidak dapat melakukan evaluasi khusus, ikuti rekomendasi garis dasar berikut:

  • Replica minimum: Selalu pertahankan minimal 2 Pod untuk redundansi.

  • Batas resource: Tetapkan batas resource minimal 1 Core CPU dan 1 GiB memori per Pod.

  • Scaling performa: Performa CoreDNS meningkat secara linear dengan CPU. Dengan NodeLocal DNSCache diaktifkan, satu core CPU biasanya dapat menangani lebih dari 10.000 QPS.

  • Rasio replica: Jika Anda tidak dapat memantau penggunaan CPU puncak, gunakan rasio konservatif 1:8 (Pod terhadap Node) (tambahkan satu Pod CoreDNS untuk setiap 8 node kluster).

Lakukan scaling Pod CoreDNS

Jumlah Pod CoreDNS menentukan resource komputasi yang tersedia. Sesuaikan jumlah Pod berdasarkan hasil evaluasi.

Penting

Karena UDP tidak memiliki pengiriman ulang, jika bug UDP IPVS menyebabkan risiko kehilangan paket pada node kluster, scaling-in atau restart Pod CoreDNS dapat menyebabkan timeout DNS di seluruh kluster hingga lima menit. Untuk strategi mitigasi, lihat Pemecahan masalah kesalahan resolusi DNS.

  • Scaling otomatis berdasarkan kebijakan yang direkomendasikan

    Terapkan dns-autoscaler untuk menyesuaikan replica CoreDNS secara otomatis berdasarkan kebijakan yang direkomendasikan (satu Pod untuk setiap delapan node kluster).

    Rumus: replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica))

    Hal ini memastikan rasio 1:8 dipertahankan saat kluster berkembang.

    dns-autoscaler

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dns-autoscaler
      namespace: kube-system
      labels:
        k8s-app: dns-autoscaler
    spec:
      selector:
        matchLabels:
          k8s-app: dns-autoscaler
      template:
        metadata:
          labels:
            k8s-app: dns-autoscaler
        spec:
          serviceAccountName: admin
          containers:
          - name: autoscaler
            image: registry.cn-hangzhou.aliyuncs.com/acs/cluster-proportional-autoscaler:1.8.4
            resources:
              requests:
                cpu: "200m"
                memory: "150Mi"
            command:
            - /cluster-proportional-autoscaler
            - --namespace=kube-system
            - --configmap=dns-autoscaler
            - --nodelabels=type!=virtual-kubelet
            - --target=Deployment/coredns
            - --default-params={"linear":{"coresPerReplica":64,"nodesPerReplica":8,"min":2,"max":100,"preventSinglePointFailure":true}}
            - --logtostderr=true
            - --v=9
  • Penyesuaian manual

    Jalankan perintah berikut untuk menyesuaikan jumlah Pod CoreDNS secara manual:

    kubectl scale --replicas={target} deployment/coredns -n kube-system # Ganti {target} dengan jumlah Pod yang diinginkan
  • Jangan gunakan HPA atau CronHPA

    Meskipun mekanisme auto-scaling workload (seperti HPA dan CronHPA) dapat menyesuaikan jumlah Pod secara otomatis, mekanisme ini melakukan operasi scaling yang sering. Karena pengecualian resolusi yang disebabkan oleh scale-in Pod (masalah UDP IPVS yang disebutkan di atas), jangan gunakan auto-scaling workload untuk mengontrol jumlah Pod CoreDNS.

Optimalkan spesifikasi Pod CoreDNS

Cara lain untuk menyesuaikan resource CoreDNS adalah dengan memodifikasi spesifikasi Pod. Pada kluster ACK managed Pro, batas memori default untuk Pod CoreDNS adalah 2 GiB, tanpa batas CPU. Untuk memastikan performa konsisten, tetapkan batas CPU ke 4096m (minimum 1024m). Anda dapat menyesuaikan permintaan dan batas resource ini di konsol.

Modifikasi konfigurasi CoreDNS di konsol

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

  2. Pada halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel navigasi kiri, klik Add-ons.

  3. Klik tab Networking. Pada kartu CoreDNS, klik Configuration.

    image

  4. Modifikasi konfigurasi CoreDNS, lalu klik OK.

    image

Jadwalkan Pod CoreDNS

Penting

Penjadwalan dan konfigurasi yang tepat sangat penting untuk stabilitas CoreDNS. Pengaturan yang tidak tepat dapat menyebabkan kegagalan resolusi DNS, berpotensi menyebabkan gangguan layanan di seluruh kluster. Sebelum melakukan operasi ini, pastikan Anda memahami cara kerja penjadwalan.

Konfigurasi yang direkomendasikan

  • Deployment multi-zona: Selalu sebarkan replica CoreDNS di berbagai zona ketersediaan dan node untuk mencegah single point of failure.

  • Anti-affinity: Versi CoreDNS sebelum 1.8.4.3 menggunakan anti-affinity node "preferred" (soft) secara default. Jika resource node tidak mencukupi, beberapa Pod dapat dijadwalkan pada node yang sama. Jika hal ini terjadi, upgrade add-on atau hapus Pod secara manual untuk memicu penjadwalan ulang.

  • Manajemen siklus hidup: Versi CoreDNS di bawah 1.8 sudah end-of-life (EOL). Segera upgrade ke versi terbaru.

  • Hindari kehabisan resource: Pastikan node yang menjalankan CoreDNS tidak jenuh (penggunaan CPU/memori tinggi), karena kejenuhan tersebut secara langsung memengaruhi latensi kueri DNS dan QPS.

  • Node khusus: Untuk kluster berskala besar, pertimbangkan penggunaan parameter penjadwalan khusus (tolerations/nodeAffinity) untuk menjalankan CoreDNS pada node khusus demi stabilitas maksimal.

Gunakan parameter khusus untuk menerapkan CoreDNS pada node khusus

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

  2. Pada halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel navigasi kiri, pilih Nodes > Nodes.

  3. Pada halaman Nodes, klik Manage Labels and Taints.

  4. Pada halaman Manage Labels and Taints, pilih node target dan klik Add Label.

    Catatan

    Jumlah node harus melebihi jumlah replica CoreDNS untuk menghindari menjalankan beberapa replica CoreDNS pada satu node.

  5. Pada dialog Add, atur parameter berikut dan klik OK.

    • Name: node-role-type

    • Value: coredns

  6. Di panel navigasi kiri, klik Add-ons, lalu cari CoreDNS.

  7. Klik Configuration pada kartu CoreDNS. Pada dialog yang muncul, klik + Add di sebelah kanan NodeSelector. Atur parameter berikut dan klik OK.

    • Key: node-role-type

    • Value: CoreDNS

    CoreDNS akan dijadwalkan ulang ke node dengan label yang ditentukan.

Optimalkan konfigurasi CoreDNS

ACK menyediakan konfigurasi CoreDNS default. Namun, Anda harus menyesuaikan parameter ini berdasarkan kebutuhan bisnis Anda. Konfigurasi CoreDNS sangat fleksibel. Untuk detailnya, lihat Kebijakan DNS dan resolusi nama domain dan dokumentasi resmi CoreDNS.

Sebagai alternatif, periksa file konfigurasi CoreDNS menggunakan fitur inspeksi dan diagnostik dalam Container Intelligence Service. Jika inspeksi menunjukkan ConfigMap CoreDNS abnormal, tinjau item yang tercantum di atas.

Catatan

CoreDNS dapat mengonsumsi memori ekstra saat menyegarkan konfigurasi. Setelah memodifikasi pengaturan CoreDNS, pantau status Pod. Jika Pod mengalami kill OOM setelah perubahan konfigurasi, tingkatkan batas memori dalam deployment CoreDNS (direkomendasikan: 2 GiB).

Nonaktifkan konfigurasi affinity layanan kube-dns

Konfigurasi affinity dapat menyebabkan ketidakseimbangan beban signifikan antara replica CoreDNS. Nonaktifkan dengan mengikuti langkah-langkah berikut:

Konsol

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

  2. Pada halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel navigasi kiri, pilih Network > Services.

  3. Pada namespace kube-system, klik Edit YAML untuk layanan kube-dns.

    • Jika nilai bidang sessionAffinity adalah None, Anda tidak perlu melakukan langkah berikutnya.

    • Jika nilai bidang sessionAffinity adalah ClientIP, lakukan langkah berikut.

  4. Hapus bidang sessionAffinity dan sessionAffinityConfig beserta semua sub-key-nya. Lalu, klik OK.

    # Hapus bagian berikut
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  5. Klik Edit YAML di sebelah kanan Layanan kube-dns lagi dan verifikasi bahwa nilai bidang sessionAffinity adalah None. Jika demikian, Layanan kube-dns telah dimodifikasi.

CLI

  1. Jalankan perintah berikut untuk melihat konfigurasi Layanan kube-dns.

    kubectl -n kube-system get svc kube-dns -o yaml
    • Jika nilai bidang sessionAffinity adalah None, Anda tidak perlu melakukan langkah berikutnya.

    • Jika nilai bidang sessionAffinity adalah ClientIP, lakukan langkah berikut.

  2. Jalankan perintah berikut untuk membuka dan mengedit Layanan kube-dns.

    kubectl -n kube-system edit service kube-dns
  3. Hapus pengaturan terkait sessionAffinity (sessionAffinity, sessionAffinityConfig, dan semua sub-key-nya), lalu simpan dan keluar.

    # Hapus bagian berikut 
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  4. Setelah modifikasi, jalankan perintah berikut lagi untuk memverifikasi bahwa nilai bidang sessionAffinity adalah None. Jika demikian, Layanan kube-dns telah diperbarui.

    kubectl -n kube-system get svc kube-dns -o yaml

Nonaktifkan plugin autopath

Beberapa versi awal CoreDNS mengaktifkan plugin autopath, yang dapat menyebabkan kesalahan resolusi dalam kasus tepi tertentu. Verifikasi apakah plugin tersebut diaktifkan dan edit file konfigurasi untuk menonaktifkannya. Untuk informasi lebih lanjut, lihat Masalah Autopath #3765.

Catatan

Menonaktifkan autopath dapat meningkatkan QPS dan latensi resolusi sisi klien hingga 3 kali lipat. Pantau beban CoreDNS dan dampak terhadap layanan.

  1. Jalankan perintah kubectl -n kube-system edit configmap coredns untuk membuka file konfigurasi CoreDNS.

  2. Hapus baris autopath @kubernetes dan simpan perubahan.

  3. Periksa status berjalan dan log Pod CoreDNS. Jika log berisi kata reload, modifikasi berhasil.

Konfigurasikan graceful shutdown

Mekanisme lameduck memastikan bahwa ketika proses CoreDNS akan dihentikan (selama pembaruan atau restart), proses tersebut menangani permintaan yang ada sebelum keluar.

  • Ketika proses CoreDNS akan dihentikan, proses tersebut memasuki mode lameduck.

  • Dalam mode lameduck, CoreDNS terus memproses permintaan yang telah diterima selama durasi tertentu sambil memberi sinyal kepada sistem untuk berhenti mengirim permintaan baru.

Konsol

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

  2. Pada halaman Clusters, klik nama kluster yang ingin diubah. Di panel navigasi kiri, pilih Configurations > ConfigMaps.

  3. Pada namespace kube-system, klik Edit YAML untuk ConfigMap coredns.

  4. Pada ConfigMap CoreDNS berikut, pastikan plugin health diaktifkan, atur timeout lameduck ke 15s, lalu klik OK.

  5. .:53 {
            errors       
            # Plugin health mungkin memiliki pengaturan berbeda pada versi CoreDNS yang berbeda.
            # Skenario 1: Plugin health tidak diaktifkan secara default.   
            # Skenario 2: Plugin health diaktifkan secara default, tetapi waktu lameduck tidak diatur.
            # health      
            # Skenario 3: Plugin health diaktifkan secara default, dan waktu lameduck diatur ke 5s.   
            # health {
            #     lameduck 5s
            # }      
            # Untuk ketiga skenario di atas, modifikasi konfigurasi sebagai berikut dan atur parameter lameduck ke 15s.
            health {
                lameduck 15s
            }       
            # Plugin lain tidak perlu dimodifikasi dan dihilangkan di sini.
        }

Status Pod CoreDNS yang sehat menunjukkan pembaruan konfigurasi berhasil. Jika terjadi anomali, rujuk ke event dan log Pod untuk mengidentifikasi akar penyebab.

CLI

  1. Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS.

  2. kubectl -n kube-system edit configmap/coredns
  3. Rujuk ke Corefile berikut, pastikan plugin health diaktifkan, dan atur parameter lameduck ke 15s.

  4. .:53 {
            errors     
            # Plugin health mungkin memiliki pengaturan berbeda pada versi CoreDNS yang berbeda.
            # Skenario 1: Plugin health tidak diaktifkan secara default.     
            # Skenario 2: Plugin health diaktifkan secara default, tetapi waktu lameduck tidak diatur.
            # health
            # Skenario 3: Plugin health diaktifkan secara default, dan waktu lameduck diatur ke 5s.   
            # health {
            #     lameduck 5s
            # }
            # Untuk ketiga skenario di atas, modifikasi konfigurasi sebagai berikut dan atur parameter lameduck ke 15s.
            health {
                lameduck 15s
            }
            # Plugin lain tidak perlu dimodifikasi dan dihilangkan di sini.
        }
  5. Setelah memodifikasi file konfigurasi CoreDNS, simpan perubahan.

  6. Jika CoreDNS berjalan normal, konfigurasi graceful shutdown telah berhasil diperbarui. Jika Pod CoreDNS abnormal, diagnosa penyebabnya dengan meninjau event dan log Pod.

Optimalkan protokol upstream (prefer_udp)

Ketika menggunakan NodeLocal DNSCache, rantai komunikasi adalah: Aplikasi -> NodeLocal DNSCache (TCP) -> CoreDNS (TCP). Secara default, CoreDNS kemudian akan mencoba menghubungi DNS VPC upstream (100.100.2.136/138) melalui TCP.

  • Masalah: DNS VPC memiliki dukungan terbatas untuk TCP.

  • Solusi: Modifikasi plugin forward untuk menggunakan prefer_udp. Hal ini memastikan CoreDNS berkomunikasi dengan DNS VPC upstream melalui UDP meskipun permintaan masuk menggunakan TCP. Untuk informasi lebih lanjut, lihat Kelola ConfigMap.

# Sebelum modifikasi
forward . /etc/resolv.conf
# Setelah modifikasi
forward . /etc/resolv.conf {
  prefer_udp
}

Konfigurasikan plugin ready untuk pemeriksaan kesiapan

Untuk CoreDNS v1.5.0 dan versi selanjutnya, plugin ready wajib digunakan agar pemeriksaan kesiapan berfungsi.

  1. Jalankan perintah berikut untuk membuka ConfigMap CoreDNS.

    kubectl -n kube-system edit configmap/coredns
  2. Periksa apakah file berisi direktif ready. Jika tidak, tambahkan, tekan tombol Esc, masukkan :wq!, lalu tekan Enter untuk menyimpan file konfigurasi yang dimodifikasi dan keluar dari mode edit.

    apiVersion: v1
    data:
     Corefile: |
      .:53 {
        errors
        health {
          lameduck 15s
        }
        ready # Jika baris ini tidak ada, tambahkan. Pastikan indentasi konsisten dengan Kubernetes.
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods verified
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . /etc/resolv.conf {
          max_concurrent 1000
                prefer_udp
        }
        cache 30
        loop
        log
        reload
        loadbalance
      }
  3. Periksa status berjalan dan log Pod CoreDNS. Jika log berisi kata reload, modifikasi berhasil.

Tingkatkan performa resolusi dengan plugin multisocket

CoreDNS v1.12.1 memperkenalkan plugin multisocket. Aktifkan plugin ini untuk memungkinkan CoreDNS mendengarkan pada port yang sama menggunakan beberapa socket, meningkatkan performa dalam skenario CPU tinggi. Untuk detailnya, lihat dokumentasi komunitas.

Aktifkan multisocket dalam ConfigMap coredns:

.:53 {
        ...
        prometheus :9153
        multisocket [NUM_SOCKETS]
        forward . /etc/resolv.conf
        ...
}

NUM_SOCKETS menentukan jumlah socket yang mendengarkan pada port yang sama.

Konfigurasi yang direkomendasikan: Sesuaikan NUM_SOCKETS dengan perkiraan penggunaan CPU, batas resource CPU, dan resource kluster yang tersedia. Contoh:

  • Jika konsumsi puncak adalah 4 core dengan 8 core tersedia, atur NUM_SOCKETS ke 2.

  • Jika konsumsi puncak adalah 8 core dengan 64 core tersedia, atur NUM_SOCKETS ke 8.

Untuk menentukan konfigurasi optimal, uji QPS dan beban dengan pengaturan berbeda.

Default: Jika tidak ditentukan, nilai default adalah GOMAXPROCS, yang sama dengan batas CPU Pod CoreDNS. Jika batas CPU Pod tidak diatur, nilainya sama dengan jumlah core CPU pada node tempat Pod berada.