All Products
Search
Document Center

Container Service for Kubernetes:Praktik terbaik DNS

Last Updated:Jun 21, 2026

DNS merupakan salah satu layanan dasar paling kritis dalam kluster Kubernetes. Konfigurasi sisi klien yang tidak tepat atau skala kluster yang besar dapat menyebabkan timeout atau kegagalan resolusi DNS. Topik ini menjelaskan praktik terbaik untuk DNS di kluster Kubernetes guna membantu Anda menghindari masalah tersebut.

Catatan penting

Topik ini tidak berlaku untuk CoreDNS yang dikelola atau kluster ACK dengan mode Auto yang diaktifkan. CoreDNS yang dikelola secara otomatis melakukan penskalaan berdasarkan beban kerja, sehingga penyesuaian manual tidak diperlukan.

Isi

Praktik terbaik DNS mencakup aspek sisi klien dan sisi server:

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

Optimalkan permintaan resolusi nama domain

Resolusi nama domain DNS merupakan salah satu aktivitas jaringan paling sering terjadi di Kubernetes. Banyak dari permintaan ini dapat dioptimalkan atau dihindari. Anda dapat mengoptimalkan permintaan resolusi nama domain dengan cara berikut:

  • (Direkomendasikan) Gunakan kolam koneksi. Jika aplikasi berkontainer sering mengakses layanan lain, gunakan kolam koneksi. Kolam koneksi menyimpan cache koneksi layanan hulu di memori, sehingga menghindari overhead resolusi DNS dan pembentukan koneksi TCP untuk setiap akses.

  • Gunakan mode asinkron atau long polling untuk memperoleh alamat IP yang sesuai dengan nama domain DNS.

  • Gunakan cache DNS:

    • (Direkomendasikan) Jika aplikasi Anda tidak dapat dimodifikasi untuk menggunakan kolam koneksi, pertimbangkan untuk menyimpan cache hasil resolusi DNS di sisi aplikasi. Untuk informasi lebih lanjut, lihat Gunakan NodeLocal DNSCache.

    • Jika NodeLocal DNSCache tidak tersedia, Anda dapat menyimpan cache kueri DNS di dalam kontainer menggunakan Name Service Cache Daemon (NSCD). Untuk informasi lebih lanjut, lihat Gunakan NSCD di kluster Kubernetes.

  • Optimalkan file resolv.conf: Parameter ndots dan search dalam file resolv.conf memengaruhi efisiensi resolusi nama domain berdasarkan cara Anda menulis nama domain dalam konfigurasi kontainer. Untuk informasi lebih lanjut tentang cara kerja parameter ndots dan search, lihat Konfigurasi kebijakan DNS dan resolusi nama domain.

  • Optimalkan konfigurasi nama domain. Saat aplikasi berkontainer mengakses nama domain, konfigurasikan nama domain sebagai berikut untuk meminimalkan upaya resolusi dan mengurangi waktu resolusi:

    • Untuk Pod yang mengakses Service dalam namespace yang sama, gunakan <service-name>, dengan service-name adalah nama Service tersebut.

    • Untuk Pod yang mengakses Service lintas namespace, gunakan <service-name>.<namespace-name>, dengan namespace-name adalah namespace dari Service tersebut.

    • Saat mengakses domain eksternal, gunakan fully qualified domain names (FQDN). Tambahkan titik trailing (.) pada nama domain umum untuk menentukannya sebagai alamat absolut. Praktik ini menghindari beberapa pencarian tidak valid yang disebabkan oleh penggabungan domain search. Misalnya, saat mengakses www.aliyun.com, gunakan FQDN www.aliyun.com..

      • Pada kluster versi 1.33 atau lebih baru, Anda dapat mengonfigurasi domain search sebagai "." tunggal (lihat isu terkait: 125883) untuk mencapai efek serupa:

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

        Setelah menerapkan konfigurasi ini, file /etc/resolv.conf di Pod akan tampak sebagai berikut:

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

        "." sebagai domain search pertama memastikan bahwa semua permintaan domain diperlakukan sebagai FQDN dan langsung di-resolve tanpa upaya pencarian yang tidak perlu.

        Penting

        Perhatikan bahwa konfigurasi ini mengharuskan Anda menyetel dnsPolicy ke None agar berlaku.

        Contoh workload lengkap

        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 192.168.0.10 dengan clusterIP layanan CoreDNS aktual
                searches:
                - .
                - default.svc.cluster.local
                - svc.cluster.local
                - cluster.local
              hostname: nginx
              restartPolicy: Always
              schedulerName: default-scheduler
              securityContext: {}
              subdomain: subdomain
              terminationGracePeriodSeconds: 30

Pahami konfigurasi DNS dalam kontainer

  • Resolver DNS yang berbeda mungkin berperilaku sedikit berbeda karena perbedaan implementasi. Anda mungkin menemukan kasus di mana dig <domain> berhasil di-resolve tetapi ping <domain> gagal.

  • Hindari penggunaan gambar dasar Alpine. Pustaka musl libc dalam gambar kontainer Alpine berbeda dari glibc standar dan dapat menyebabkan masalah seperti berikut:

    • Versi Alpine 3.18 dan sebelumnya tidak mendukung perintah tc yang kembali ke protokol TCP.

    • Versi Alpine 3.3 dan sebelumnya tidak mendukung parameter search atau domain search, yang menghambat penemuan layanan.

    • Kueri konkuren ke beberapa server DNS yang dikonfigurasi dalam /etc/resolv.conf dapat membatalkan optimasi NodeLocal DNSCache.

    • Kueri konkuren rekaman A dan AAAA yang menggunakan soket yang sama dapat memicu konflik port sumber conntrack pada kernel lama, yang menyebabkan kehilangan paket.

    Untuk informasi lebih lanjut, lihat musl libc.

  • Jika Anda menggunakan aplikasi Go, pastikan Anda memahami perbedaan antara implementasi resolver DNS CGO dan Pure Go.

Hindari timeout resolusi DNS probabilistik yang disebabkan oleh cacat IPVS

Jika Anda menggunakan IPVS sebagai mode load balancing kube-proxy, Anda mungkin mengalami timeout resolusi DNS intermiten selama skala-masuk atau restart CoreDNS. Masalah ini disebabkan oleh cacat pada kernel Linux. Untuk informasi lebih lanjut, lihat IPVS.

Anda dapat mengurangi dampak cacat IPVS dengan salah satu metode berikut:

Gunakan NodeLocal DNSCache

Dalam beberapa skenario, CoreDNS mungkin mengalami masalah berikut:

  • Kadang-kadang, kueri A dan AAAA konkuren dapat menyebabkan kehilangan paket, yang mengakibatkan kegagalan resolusi DNS.

  • Tabel conntrack penuh pada node dapat menyebabkan kehilangan paket, yang mengakibatkan kegagalan resolusi DNS.

Untuk meningkatkan stabilitas dan kinerja layanan DNS di kluster Anda, Anda dapat menginstal komponen NodeLocal DNSCache. Komponen ini menjalankan cache DNS pada setiap node di kluster untuk meningkatkan kinerja DNS. Untuk informasi lebih lanjut tentang NodeLocal DNSCache dan cara menerapkannya di kluster ACK, lihat Gunakan komponen NodeLocal DNSCache.

Penting

Setelah menginstal NodeLocal DNSCache, Anda harus menyuntikkan konfigurasi cache DNS ke dalam Pod Anda. Anda dapat menjalankan perintah berikut untuk menambahkan label ke namespace. Pod baru yang dibuat di namespace ini secara otomatis menerima konfigurasi cache DNS. Untuk informasi tentang metode penyuntikan lainnya, lihat dokumen yang ditautkan pada paragraf sebelumnya.

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

Gunakan versi CoreDNS yang sesuai

CoreDNS mempertahankan kompatibilitas mundur yang baik dengan berbagai versi Kubernetes. Kami merekomendasikan agar Anda menjaga CoreDNS pada versi stabil terbaru. Halaman Manajemen Komponen di konsol ACK menyediakan fitur untuk menginstal, meningkatkan, dan mengonfigurasi CoreDNS. Anda dapat memantau status komponen Anda di halaman Manajemen Komponen. Jika tersedia peningkatan untuk CoreDNS, lakukan peningkatan tersebut selama jam sepi.

Versi CoreDNS sebelum v1.7.0 memiliki risiko yang diketahui, termasuk namun tidak terbatas pada hal berikut:

Versi minimum CoreDNS yang direkomendasikan bervariasi berdasarkan versi kluster Kubernetes, seperti ditunjukkan pada tabel berikut:

Versi kluster

Versi CoreDNS minimum yang direkomendasikan

Di bawah 1.14.8

v1.6.2 (tidak lagi dipelihara)

1.14.8 dan seterusnya, di bawah 1.20.4

v1.7.0.0-f59c03d-aliyun

1.20.4 dan seterusnya, di bawah 1.21.0

v1.8.4.1-3a376cc-aliyun

1.21.0 dan seterusnya

v1.11.3.2-f57ea7ed6-aliyun

Pantau status runtime CoreDNS

Metrik pemantauan

CoreDNS mengekspos metrik kesehatan, seperti hasil resolusi, melalui antarmuka Prometheus standar. Hal ini membantu Anda mendeteksi anomali pada CoreDNS atau server DNS hulu.

Prometheus untuk ACK mencakup metrik pemantauan CoreDNS dan aturan peringatan bawaan. Anda dapat mengaktifkan fitur Prometheus dan Dashboard di Konsol Container Service for Kubernetes. Untuk informasi lebih lanjut, lihat Pemantauan komponen CoreDNS.

Jika Anda menjalankan instance Prometheus self-managed untuk kluster Kubernetes Anda, Anda dapat mengamati metrik terkait dan menyetel peringatan untuk metrik kritis. Untuk informasi lebih lanjut, lihat dokumentasi resmi Prometheus CoreDNS.

Log operasional

Saat terjadi anomali DNS, Anda dapat menggunakan log CoreDNS untuk segera mendiagnosis akar penyebabnya. Anda dapat mengaktifkan log resolusi domain CoreDNS dan pengumpulan log SLS. Untuk informasi lebih lanjut, lihat Analisis dan pantau log CoreDNS.

Pengiriman event Kubernetes

Pada CoreDNS v1.9.3.6-32932850-aliyun dan seterusnya, Anda dapat mengaktifkan plugin k8s_event untuk mengirimkan log CoreDNS kritis sebagai event Kubernetes ke Event Hub. Untuk informasi lebih lanjut tentang plugin k8s_event, lihat k8s_event.

Instans CoreDNS yang baru diterapkan memiliki fitur ini diaktifkan secara default. Jika Anda melakukan peningkatan dari versi CoreDNS lama, Anda harus memodifikasi file konfigurasi secara manual untuk mengaktifkan fitur tersebut.

  1. Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS.

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

    apiVersion: v1
    data:
      Corefile: |
        .:53 {
            errors
            health {
                lameduck 15s
            }
            // Mulai penambahan (abaikan perbedaan lainnya).
            kubeapi
            k8s_event {
              level info error warning // Kirim log kritis dengan level info, error, atau warning.
            }
            // Akhir penambahan.
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods verified
                fallthrough in-addr.arpa ip6.arpa
            }
            // Di bawah ini dihilangkan.
        }
  3. Periksa status dan log Pod CoreDNS. Jika log berisi kata reload, modifikasi berhasil.

Pastikan ketersediaan tinggi CoreDNS

CoreDNS berfungsi sebagai otoritas DNS untuk kluster. Kegagalan CoreDNS dapat menyebabkan akses Service internal gagal, yang dapat mengganggu sebagian besar bisnis Anda. Anda dapat memastikan ketersediaan tinggi CoreDNS dengan langkah-langkah berikut:

Evaluasi tekanan komponen CoreDNS

Anda dapat menjalankan uji stres DNS di kluster Anda untuk mengevaluasi tekanan komponen. Banyak alat open-source, seperti DNSPerf, dapat membantu hal ini. Jika Anda tidak dapat mengevaluasi tekanan DNS secara akurat, ikuti rekomendasi berikut:

  • Selalu terapkan minimal dua Pod CoreDNS, dengan setiap Pod memiliki batas resource minimal 1 core CPU dan 1 GB memori.

  • Kapasitas QPS CoreDNS berkorelasi langsung dengan penggunaan CPU. Dengan NodeLocal DNSCache, setiap core CPU dapat mendukung lebih dari 10.000 QPS. Persyaratan QPS DNS untuk workload bisnis sangat bervariasi. Anda harus memantau penggunaan CPU puncak setiap Pod CoreDNS. Jika penggunaan CPU melebihi satu core selama periode puncak bisnis, lakukan penskalaan jumlah replika CoreDNS. Jika penggunaan CPU puncak tidak diketahui, sebagai langkah konservatif, terapkan satu Pod CoreDNS untuk setiap delapan node di kluster.

Sesuaikan jumlah Pod CoreDNS

Jumlah Pod CoreDNS secara langsung menentukan resource komputasi yang tersedia. Anda dapat menyesuaikan jumlah ini berdasarkan evaluasi Anda.

Penting

Karena UDP tidak memiliki mekanisme pengiriman ulang, skala-masuk atau restart Pod CoreDNS dapat menyebabkan timeout atau anomali resolusi DNS di seluruh kluster yang berlangsung hingga lima menit jika terdapat cacat UDP IPVS pada node kluster. Untuk solusi masalah resolusi terkait IPVS, lihat Pemecahan masalah anomali resolusi DNS.

  • Menyesuaikan jumlah Pod secara otomatis berdasarkan kebijakan yang direkomendasikan

    Anda dapat menerapkan dns-autoscaler berikut. Alat ini secara otomatis menyesuaikan jumlah Pod CoreDNS secara real-time berdasarkan rasio yang direkomendasikan yaitu satu Pod untuk setiap delapan node kluster. Rumus jumlah replika adalah `replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica))`, yang dibatasi oleh batas max dan min.

    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

    Anda dapat menyesuaikan jumlah Pod CoreDNS secara manual dengan menjalankan perintah berikut.

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

    Meskipun mekanisme autoscaling workload seperti Penyesuaian Otomatis Pod Horizontal (HPA) atau CronHPA dapat menyesuaikan jumlah Pod secara otomatis, mekanisme ini memicu operasi penskalaan yang sering. Karena anomali resolusi yang dapat terjadi selama skala-masuk Pod seperti yang dijelaskan sebelumnya, jangan gunakan autoscaling workload untuk mengontrol jumlah Pod CoreDNS.

Sesuaikan spesifikasi Pod CoreDNS

Cara lain untuk menyesuaikan resource CoreDNS adalah dengan memodifikasi spesifikasi Pod. Di kluster ACK yang dikelola Pro, Pod CoreDNS memiliki batas memori default 2Gi dan tidak memiliki batas CPU. Kami merekomendasikan agar Anda menyetel batas CPU ke 4096m, dengan minimum 1024m. Anda dapat menyesuaikan konfigurasi Pod CoreDNS di konsol.

Modifikasi konfigurasi CoreDNS di konsol

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

  2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Add-ons.

  3. Klik tab Network, temukan kartu CoreDNS, lalu klik Configuration.

  4. Modifikasi pengaturan CoreDNS dan klik OK.

    Dalam kotak dialog konfigurasi parameter CoreDNS, atur parameter resource seperti MemoryRequest (misalnya, 100Mi), CpuRequest (misalnya, 100m), MemoryLimit (misalnya, 2Gi), dan CpuLimit. Anda juga dapat menyetel label seleksi node NodeSelector (misalnya, Key: kubernetes.io/os, Value: linux). Memodifikasi parameter ini akan membuat ulang templat YAML komponen, yang dapat menimpa perubahan yang dilakukan menggunakan kubectl atau metode lainnya.

Jadwalkan Pod CoreDNS

Penting

Konfigurasi penjadwalan yang salah dapat mencegah Pod CoreDNS diterapkan, yang dapat menyebabkan kegagalan CoreDNS. Sebelum melanjutkan, pastikan Anda sepenuhnya memahami penjadwalan.

Terapkan Pod CoreDNS di berbagai zona dan node kluster untuk menghindari kegagalan node tunggal atau zona tunggal. Versi CoreDNS sebelum v1.8.4.3 menggunakan anti-afinitas node lemah secara default. Hal ini dapat menyebabkan beberapa atau semua Pod diterapkan pada node yang sama karena sumber daya node yang tidak mencukupi. Jika hal ini terjadi, Anda dapat menghapus Pod untuk memicu penjadwalan ulang atau meningkatkan ke versi komponen terbaru. Versi CoreDNS sebelum v1.8 tidak lagi dipelihara. Kami merekomendasikan agar Anda segera meningkatkannya.

Hindari menerapkan CoreDNS pada node kluster yang memiliki pemanfaatan CPU atau memori penuh karena hal ini memengaruhi QPS DNS dan latensi respons. Jika memungkinkan, gunakan parameter kustom untuk menjadwalkan CoreDNS pada node kluster khusus guna memastikan resolusi nama domain yang stabil.

Terapkan CoreDNS pada node khusus menggunakan parameter kustom

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

  2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik 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

    Pilih lebih banyak node daripada jumlah replika CoreDNS untuk menghindari penerapan beberapa replika CoreDNS pada satu node.

  5. Dalam kotak dialog Add, atur parameter berikut dan klik OK.

    • Name: node-role-type

    • Value: coredns

  6. Di panel navigasi kiri halaman manajemen kluster, pilih Operations > Add-ons. Cari CoreDNS.

  7. Pada kartu CoreDNS, klik Configuration. Dalam kotak dialog Configuration, klik + Tambah di sebelah NodeSelector, atur parameter berikut, lalu klik OK.

    • Key: node-role-type

    • Value: coredns

    CoreDNS dijadwalkan ulang ke node yang memiliki label yang ditentukan.

Optimalkan konfigurasi CoreDNS

Container Service for Kubernetes (ACK) hanya menyediakan konfigurasi CoreDNS default. Anda harus meninjau semua parameter dan mengoptimalkannya untuk memastikan CoreDNS melayani kontainer aplikasi Anda dengan baik. Konfigurasi CoreDNS sangat fleksibel. Untuk informasi lebih lanjut, lihat Konfigurasi kebijakan DNS dan resolusi nama domain dan dokumentasi resmi CoreDNS.

Konfigurasi CoreDNS default yang diterapkan dengan versi Kubernetes lama mungkin memiliki risiko. Anda dapat memeriksa dan mengoptimalkan konfigurasi ini dengan cara berikut:

Anda juga dapat menggunakan fitur inspeksi terjadwal dan diagnosis kesalahan di Container Intelligence Operations untuk memeriksa file konfigurasi CoreDNS. Jika Container Intelligence Operations melaporkan anomali konfigurasi ConfigMap CoreDNS, tinjau item yang disebutkan di atas.

Catatan

CoreDNS mungkin mengonsumsi memori tambahan saat memuat ulang konfigurasi. Setelah memodifikasi item konfigurasi CoreDNS, pantau status Pod. Jika Pod mengalami kekurangan memori, segera tingkatkan batas memori di Deployment CoreDNS. Kami merekomendasikan agar Anda menyetel memori ke 2 GB.

Nonaktifkan pengaturan afinitas untuk layanan kube-dns

Pengaturan afinitas dapat menyebabkan ketidakseimbangan beban yang signifikan di antara replika CoreDNS. Anda dapat menonaktifkannya dengan salah satu cara berikut:

Metode konsol

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

  2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Network > Services.

  3. Di namespace kube-system, klik Edit YAML di sebelah kanan layanan kube-dns.

    • Jika nilai bidang sessionAffinity adalah None, Anda dapat melewati langkah-langkah berikut.

    • Jika nilai sessionAffinity adalah ClientIP, lanjutkan dengan langkah-langkah berikut.

  4. Hapus bidang sessionAffinity dan sessionAffinityConfig beserta semua subkey-nya. Lalu, klik Update.

    # Hapus semua konten berikut.
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  5. Klik Edit YAML lagi di sebelah kanan layanan kube-dns dan verifikasi bahwa nilai bidang sessionAffinity adalah None. Jika nilai bidang tersebut adalah None, layanan Kube-DNS telah berhasil diperbarui.

Metode baris perintah

  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 dapat melewati langkah-langkah berikut.

    • Jika nilai sessionAffinity adalah ClientIP, lanjutkan dengan langkah-langkah berikut.

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

    kubectl -n kube-system edit service kube-dns
  3. Hapus semua pengaturan terkait sessionAffinity (sessionAffinity, sessionAffinityConfig, dan semua subkey). Lalu, simpan perubahan dan keluar.

    # Hapus semua konten berikut.
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  4. Setelah modifikasi, jalankan perintah berikut lagi untuk memverifikasi bahwa nilai bidang sessionAffinity adalah None. Jika nilainya None, pembaruan layanan kube-dns berhasil.

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

Nonaktifkan plugin Autopath

Beberapa versi CoreDNS lama memiliki plugin Autopath yang diaktifkan. Plugin ini dapat menghasilkan hasil resolusi yang salah dalam skenario ekstrem. Anda dapat memverifikasi apakah plugin tersebut diaktifkan dan menonaktifkannya dengan mengedit file konfigurasi. Untuk informasi lebih lanjut, lihat Autopath.

Catatan

Setelah menonaktifkan plugin Autopath, QPS kueri DNS sisi klien mungkin meningkat hingga tiga kali lipat, dan waktu resolusi domain tunggal mungkin meningkat hingga tiga kali lipat. Anda harus memantau beban CoreDNS dan dampaknya terhadap bisnis Anda.

  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 dan log Pod CoreDNS. Jika log berisi kata reload, modifikasi berhasil.

Konfigurasikan shutdown yang mulus untuk CoreDNS

Mekanisme lameduck di CoreDNS memungkinkan shutdown yang mulus. Saat CoreDNS berhenti atau restart, mekanisme ini memastikan bahwa permintaan yang sedang berlangsung diselesaikan secara normal tanpa terputus secara tiba-tiba. Mekanisme lameduck bekerja sebagai berikut:

  • Saat CoreDNS dihentikan, ia memasuki mode Lameduck.

  • Dalam mode lameduck, CoreDNS berhenti menerima permintaan baru tetapi terus memproses permintaan yang ada hingga selesai atau hingga periode timeout lameduck berakhir.

Metode konsol

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

  2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Configurations > ConfigMaps.

  3. Di namespace kube-system, klik Edit YAML di sebelah kanan item konfigurasi coredns.

  4. Merujuk pada file konfigurasi CoreDNS berikut. Pastikan plugin health diaktifkan dan atur timeout lameduck ke 15s. Lalu, klik OK.

  5. .:53 {
            errors       
            # Plugin health mungkin memiliki pengaturan default yang berbeda di berbagai versi CoreDNS.
            # Kasus 1: plugin health dinonaktifkan secara default.   
            # Kasus 2: plugin health diaktifkan secara default tetapi waktu lameduck tidak diatur.
            # health      
            # Kasus 3: plugin health diaktifkan secara default dengan waktu lameduck diatur ke 5s.   
            # health {
            #     lameduck 5s
            # }      
            # Untuk ketiga kasus tersebut, modifikasi secara seragam sebagai berikut untuk menyetel lameduck ke 15s.
            health {
                lameduck 15s
            }       
            # Jangan modifikasi plugin lain; dihilangkan di sini.
        }

Jika Pod CoreDNS berjalan normal, konfigurasi shutdown yang mulus berhasil diperbarui. Jika Pod menjadi abnormal, periksa event dan log Pod untuk mengidentifikasi penyebabnya.

Metode baris perintah

  1. Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS.

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

  4. .:53 {
            errors     
            # Plugin health mungkin memiliki pengaturan default yang berbeda di berbagai versi CoreDNS.
            # Kasus 1: plugin health dinonaktifkan secara default.     
            # Kasus 2: plugin health diaktifkan secara default tetapi waktu lameduck tidak diatur.
            # health
            # Kasus 3: plugin health diaktifkan secara default dengan waktu lameduck diatur ke 5s.   
            # health {
            #     lameduck 5s
            # }
            # Untuk ketiga kasus tersebut, modifikasi secara seragam sebagai berikut untuk menyetel lameduck ke 15s.
            health {
                lameduck 15s
            }
            # Jangan modifikasi plugin lain; dihilangkan di sini.
        }
  5. Simpan perubahan dan keluar setelah memodifikasi file konfigurasi CoreDNS.

  6. Jika CoreDNS berjalan normal, konfigurasi shutdown yang mulus berhasil diperbarui. Jika Pod menjadi abnormal, periksa event dan log Pod untuk mengidentifikasi penyebabnya.

Tetapkan protokol default untuk plugin Forward saat berkomunikasi dengan server DNS VPC hulu

NodeLocal DNSCache berkomunikasi dengan CoreDNS menggunakan TCP. CoreDNS menggunakan protokol yang sama dengan permintaan masuk saat berkomunikasi dengan server DNS hulu. Secara default, permintaan resolusi domain eksternal dari kontainer aplikasi melewati NodeLocal DNSCache dan CoreDNS, lalu mencapai server DNS VPC (100.100.2.136 dan 100.100.2.138) menggunakan TCP.

Server DNS VPC memiliki dukungan terbatas untuk TCP. Jika Anda menggunakan NodeLocal DNSCache, Anda harus memodifikasi konfigurasi CoreDNS agar selalu memprioritaskan UDP saat berkomunikasi dengan server DNS hulu untuk menghindari anomali resolusi. Anda dapat memodifikasi ConfigMap bernama coredns di namespace kube-system sebagai berikut. Untuk informasi lebih lanjut, lihat Kelola ConfigMaps. Di plugin forward, tentukan prefer_udp sebagai protokol hulu. Setelah modifikasi ini, CoreDNS memprioritaskan penggunaan UDP untuk komunikasi hulu:

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

Konfigurasikan plugin Pemeriksaan kesiapan Ready

Versi CoreDNS setelah 1.5.0 memerlukan plugin ready untuk mengaktifkan pemeriksaan kesiapan.

  1. Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS.

    kubectl -n kube-system edit configmap/coredns
  2. Periksa baris ready. Jika tidak ada, tambahkan ready. Tekan Esc, ketik :wq!, lalu tekan Enter untuk menyimpan perubahan dan keluar.

    apiVersion: v1
    data:
     Corefile: |
      .:53 {
        errors
        health {
          lameduck 15s
        }
        ready # Tambahkan baris ini jika tidak ada, 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 dan log Pod CoreDNS. Jika log berisi kata reload, modifikasi berhasil.

Konfigurasikan plugin multisocket untuk meningkatkan kinerja resolusi CoreDNS

CoreDNS v1.12.1 memperkenalkan plugin multisocket. Jika Anda mengaktifkan plugin ini, CoreDNS dapat menggunakan beberapa soket untuk mendengarkan pada port yang sama, yang meningkatkan kinerja dalam skenario CPU tinggi. Untuk informasi lebih lanjut tentang plugin ini, lihat dokumentasi komunitas.

Anda dapat mengaktifkan multisocket di ConfigMap coredns:

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

NUM_SOCKETS menentukan jumlah soket yang mendengarkan pada port yang sama.

Rekomendasi konfigurasi: Kami merekomendasikan agar Anda menyelaraskan nilai NUM_SOCKETS dengan perkiraan penggunaan CPU, batas resource CPU, dan resource yang tersedia di kluster. Contohnya:

  • Jika CoreDNS mengonsumsi 4 core pada puncaknya dan 8 core tersedia, atur NUM_SOCKETS ke 2.

  • Jika CoreDNS mengonsumsi 8 core pada puncaknya dan 64 core tersedia, atur NUM_SOCKETS ke 8.

Untuk menentukan konfigurasi optimal, Anda dapat menguji pengaturan berbeda dan mengukur QPS serta beban.

Jika Anda tidak menentukan NUM_SOCKETS, CoreDNS menggunakan GOMAXPROCS secara default. Nilai `GOMAXPROCS` sama dengan batas CPU Pod CoreDNS. Jika tidak ada batas CPU yang ditetapkan, nilainya sama dengan jumlah core CPU pada node.