All Products
Search
Document Center

Container Service for Kubernetes:Praktik terbaik DNS

Last Updated:Apr 04, 2026

DNS merupakan layanan kritis dalam kluster Kubernetes. Dalam kondisi tertentu, seperti konfigurasi klien yang tidak tepat atau skala kluster yang besar, resolusi DNS dapat mengalami timeout atau gagal. Panduan ini menyediakan praktik terbaik untuk mencegah masalah tersebut.

Catatan penggunaan

Topik ini tidak berlaku untuk kluster Container Service for Kubernetes (ACK) yang menggunakan edisi managed CoreDNS atau memiliki Auto Mode diaktifkan. Kluster tersebut melakukan penskalaan secara otomatis berdasarkan beban dan tidak memerlukan 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 operasi jaringan yang sering terjadi dalam kluster Kubernetes. Anda dapat mengoptimalkan atau menghindari banyak permintaan ini untuk mengurangi latensi dan beban pada infrastruktur DNS:

  • (Direkomendasikan) Gunakan kolam koneksi. Jika aplikasi Anda sering meminta layanan lain, kami merekomendasikan penggunaan kolam koneksi. Kolam koneksi menyimpan koneksi aktif ke layanan upstream dalam memori. Praktik ini menghilangkan overhead resolusi DNS dan handshake TCP untuk setiap permintaan.

  • Gunakan permintaan asinkron atau long polling untuk mendapatkan alamat IP yang dipetakan ke nama domain.

  • Gunakan cache DNS:

    • (Direkomendasikan) Jika Anda tidak dapat merefaktor aplikasi untuk menggunakan kolam koneksi guna terhubung ke layanan lain, pertimbangkan untuk menyimpan hasil resolusi DNS di sisi klien. Untuk informasi lebih lanjut, lihat Gunakan NodeLocal DNSCache.

    • Jika Anda tidak dapat menggunakan NodeLocal DNSCache, Anda dapat menggunakan Name Service Cache Daemon (NSCD) bawaan dalam kontainer Anda. Untuk informasi lebih lanjut tentang cara menggunakan cache NSCD, lihat Gunakan NSCD dalam kluster Kubernetes.

  • Optimalkan file resolv.conf: Cara Anda menulis nama domain dalam kontainer menentukan efisiensi resolusi nama domain karena cara kerja parameter ndots dan search dalam file resolv.conf. Untuk informasi lebih lanjut tentang mekanisme parameter ndots dan search, lihat Konfigurasi kebijakan DNS dan resolusi nama domain.

  • Optimalkan konfigurasi nama domain. Saat aplikasi mengakses nama domain, tentukan sesuai prinsip berikut. Hal ini meminimalkan upaya resolusi DNS dan mengurangi latensi.

    • Saat sebuah Pod mengakses Service dalam namespace yang sama, gunakan <service-name> untuk mengakses Service tersebut. service-name menunjukkan nama Service tersebut.

    • Saat sebuah Pod mengakses Service dalam namespace berbeda, gunakan <service-name>.<namespace-name> untuk mengakses Service tersebut. namespace-name menunjukkan namespace tempat Service tersebut berada.

    • Saat sebuah Pod mengakses domain eksternal, prioritaskan penggunaan FQDN, yaitu nama domain yang diakhiri titik (.), untuk menghindari beberapa pencarian tidak perlu akibat penambahan domain search. Misalnya, saat Anda mengakses www.aliyun.com, gunakan FQDN www.aliyun.com..

      • Dalam kluster yang menjalankan Kubernetes 1.33 atau lebih baru, Anda dapat mengonfigurasi domain pencarian sebagai satu titik (.) (lihat Issue 125883). Hal ini secara efektif mengubah semua permintaan DNS menjadi permintaan FQDN, sehingga mencegah iterasi domain pencarian yang tidak perlu:

        dnsPolicy: None
        dnsConfig:
          nameservers: ["192.168.0.10"]  ## Ganti 192.168.0.10 dengan clusterIP layanan kube-dns.
          searches:
          - .
          - default.svc.cluster.local  ## Catatan: Ganti default dengan namespace aktual.
          - svc.cluster.local
          - cluster.local

        Dengan konfigurasi di atas, file /etc/resolv.conf dalam Pod adalah sebagai berikut:

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

        Dengan . sebagai domain pencarian pertama, sistem langsung memperlakukan nama domain target permintaan resolusi sebagai FQDN, mencoba menyelesaikannya secara langsung, dan menghindari pencarian yang tidak perlu.

        Penting

        Anda harus mengatur dnsPolicy ke None agar konfigurasi ini berlaku.

        Contoh beban kerja 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 kube-dns.
                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 memiliki perbedaan implementasi halus, yang dapat menyebabkan dig <domain> berhasil sementara ping <domain> gagal.

  • Kami sangat merekomendasikan penggunaan gambar dasar seperti Debian atau CentOS daripada Alpine Linux. Pustaka musl libc yang digunakan di Alpine memiliki beberapa perbedaan implementasi dibandingkan dengan glibc standar, yang menyebabkan masalah termasuk namun tidak terbatas pada:

    • Versi Alpine 3.18 dan sebelumnya tidak mendukung fallback ke TCP untuk respons terpotong (TC).

    • Versi Alpine 3.3 dan sebelumnya tidak mendukung parameter search atau domain pencarian. Hal ini mengganggu penemuan layanan.

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

    • Menggunakan soket yang sama untuk permintaan rekaman A dan AAAA secara konkuren dapat memicu konflik port sumber conntrack pada versi kernel lama, yang menyebabkan kehilangan paket.

    Untuk informasi lebih lanjut tentang masalah ini, lihat dokumentasi musl libc.

  • Jika Anda menggunakan aplikasi Go, pahami perbedaan antara resolver DNS dalam implementasi cgo dan pure Go.

Atasi timeout DNS intermiten dalam mode IPVS

Saat kluster menggunakan IPVS sebagai mode load balancing kube-proxy, Anda mungkin mengalami timeout resolusi DNS intermiten saat CoreDNS di-scale down atau direstart. Masalah ini disebabkan oleh bug dalam kernel Linux. Untuk informasi lebih lanjut, lihat IPVS.

Anda dapat menggunakan salah satu metode berikut untuk mengurangi dampak cacat IPVS ini:

Gunakan NodeLocal DNSCache

CoreDNS kadang-kadang mengalami masalah berikut:

  • Dalam kasus langka, kehilangan paket dapat terjadi karena kueri A dan AAAA konkuren, yang menyebabkan kegagalan resolusi DNS.

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

Untuk meningkatkan stabilitas dan kinerja layanan DNS dalam kluster Anda, kami merekomendasikan Anda menginstal add-on NodeLocal DNSCache. Add-on ini meningkatkan kinerja DNS kluster dengan menjalankan cache DNS lokal pada setiap node. Untuk informasi detail tentang NodeLocal DNSCache dan cara menerapkannya dalam kluster ACK, lihat Gunakan add-on NodeLocal DNSCache.

Penting

Setelah Anda menginstal NodeLocal DNSCache, Anda harus menyuntikkan konfigurasi cache DNS ke dalam Pod Anda. Jalankan perintah berikut untuk menambahkan label ke namespace yang ditentukan. Pod baru yang dibuat dalam namespace ini akan secara otomatis memiliki konfigurasi cache DNS yang disuntikkan. Untuk informasi lebih lanjut tentang metode penyuntikan lainnya, lihat dokumentasi di atas.

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

Gunakan versi CoreDNS yang sesuai

CoreDNS menawarkan kompatibilitas mundur yang baik dengan Kubernetes. Namun, sangat penting untuk selalu memperbarui CoreDNS ke versi stabil terbaru. Halaman Add-ons di konsol ACK memungkinkan Anda menginstal, meningkatkan, dan mengonfigurasi CoreDNS. Periksa status add-on CoreDNS di halaman Add-ons. Jika tersedia pembaruan, jadwalkan selama jam sepi.

Versi CoreDNS sebelum v1.7.0 memiliki risiko potensial, termasuk namun tidak terbatas pada:

Versi minimum CoreDNS yang direkomendasikan bervariasi berdasarkan versi Kubernetes kluster Anda. Tabel berikut menjelaskan detailnya.

Versi kluster

Versi minimum yang direkomendasikan

Sebelum 1.14.8

v1.6.2 (End-of-life)

1.14.8 atau lebih baru, tetapi sebelum 1.20.4

v1.7.0.0-f59c03d-aliyun

1.20.4 atau lebih baru, tetapi sebelum 1.21.0

v1.8.4.1-3a376cc-aliyun

1.21.0 atau lebih baru

v1.11.3.2-f57ea7ed6-aliyun

Pantau status operasional CoreDNS

Pantau metrik

CoreDNS mengekspos metrik kesehatan, seperti hasil resolusi DNS, melalui antarmuka Prometheus standar untuk membantu mendeteksi error pada server CoreDNS bahkan pada server DNS upstream.

Managed Service for Prometheus menyediakan aturan pemantauan dan peringatan metrik bawaan untuk CoreDNS. Anda dapat mengaktifkan Prometheus dan fitur dasbornya di Konsol ACK. Untuk informasi lebih lanjut, lihat Pantau komponen CoreDNS.

Jika Anda menggunakan instance Prometheus yang dikelola sendiri untuk memantau kluster Kubernetes Anda, Anda dapat mengamati metrik terkait di Prometheus dan mengatur peringatan untuk metrik utama. Untuk informasi lebih lanjut, lihat dokumentasi resmi Prometheus CoreDNS.

Log

Jika terjadi error DNS, log CoreDNS membantu Anda mendiagnosis akar penyebabnya dengan cepat. Kami merekomendasikan Anda mengaktifkan pencatatan resolusi nama domain CoreDNS dan pengumpulan Log Service. Untuk informasi lebih lanjut, lihat Analisis dan pantau log CoreDNS.

Pengiriman event Kubernetes

Dalam CoreDNS v1.9.3.6-32932850-aliyun dan versi lebih baru, Anda dapat mengaktifkan plugin k8s_event untuk mengirimkan log kritis CoreDNS ke pusat event sebagai event Kubernetes. Untuk informasi lebih lanjut tentang plugin k8s_event, lihat k8s_event.

Fitur ini diaktifkan secara default dalam penerapan CoreDNS baru. Jika Anda meningkatkan CoreDNS dari versi sebelumnya ke v1.9.3.6-32932850-aliyun atau lebih baru, Anda perlu memodifikasi file konfigurasi secara manual untuk mengaktifkan fitur ini.

  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
            }
    
            // Awal penambahan (abaikan perbedaan lainnya)
            kubeapi
            k8s_event {
              level info error warning // Mengirimkan log kritis tingkat info, error, dan warning.
            }
            // Akhir penambahan
    
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods verified
                fallthrough in-addr.arpa ip6.arpa
            }
            // ... (konfigurasi sisanya dihilangkan)
        }
  3. Periksa status dan log Pod CoreDNS. Jika log berisi kata reload, modifikasi berhasil.

Ketersediaan tinggi CoreDNS

CoreDNS adalah otoritas DNS untuk kluster Anda. Kegagalan CoreDNS dapat mencegah akses ke Service dalam kluster dan dapat menyebabkan gangguan aplikasi secara luas. Anda dapat mengambil langkah-langkah berikut untuk memastikan ketersediaan tinggi CoreDNS:

Evaluasi beban pada CoreDNS

Anda dapat menjalankan uji stres DNS dalam kluster Anda untuk mengevaluasi beban. Banyak alat open source, seperti DNSPerf, dapat membantu Anda mencapai hal ini. Jika Anda tidak dapat mengevaluasi beban DNS dalam kluster Anda secara akurat, rujuk rekomendasi berikut.

  • Kami merekomendasikan Anda mengatur jumlah Pod CoreDNS minimal 2 dalam semua skenario. Batas resource untuk satu Pod harus minimal 1 core dan 1 GiB memori.

  • QPS resolusi DNS yang dapat disediakan CoreDNS berkorelasi positif dengan konsumsi CPU. Dengan NodeLocal DNSCache, setiap core CPU biasanya dapat mendukung lebih dari 10.000 QPS. Persyaratan QPS untuk permintaan DNS sangat bervariasi antar jenis layanan. Anda dapat mengamati penggunaan CPU puncak setiap Pod CoreDNS. Jika konsumsi CPU melebihi satu core selama jam sibuk, lakukan scale-out replika CoreDNS. Jika Anda tidak dapat menentukan penggunaan CPU puncak, gunakan rasio replika-ke-node konservatif 1:8.

Sesuaikan replika CoreDNS

Jumlah replika CoreDNS secara langsung menentukan resource komputasi yang dapat digunakan CoreDNS. Anda dapat menyesuaikan jumlah replika CoreDNS berdasarkan evaluasi Anda.

Penting

Karena kurangnya mekanisme pengiriman ulang dalam UDP, jika ada risiko kehilangan paket pada node kluster akibat cacat UDP IPVS, melakukan scale-in atau restart Pod CoreDNS dapat menyebabkan timeout atau error resolusi DNS di seluruh kluster hingga lima menit. Untuk informasi lebih lanjut tentang cara menyelesaikan error resolusi yang disebabkan oleh cacat IPVS, lihat Pemecahan masalah error resolusi DNS.

  • Menyesuaikan secara otomatis berdasarkan kebijakan yang direkomendasikan

    Anda dapat menerapkan dns-autoscaler berikut. Alat ini secara otomatis menyesuaikan jumlah replika CoreDNS secara real-time berdasarkan rasio replika-ke-node 1:8 yang direkomendasikan. Jumlah replika dihitung menggunakan rumus berikut: replika = max(ceil(core × 1/corePerReplika), ceil(node × 1/nodePerReplika)). Hasilnya juga dibatasi oleh nilai 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
  • Menyesuaikan secara manual

    Anda dapat menjalankan perintah berikut untuk menyesuaikan jumlah replika CoreDNS secara manual:

    kubectl scale --replicas={target} deployment/coredns -n kube-system # Ganti {target} dengan jumlah replika yang diinginkan.
  • Jangan gunakan auto-scaling beban kerja

    Meskipun mekanisme auto-scaling beban kerja, seperti Horizontal Pod Autoscaler (HPA) dan CronHPA, juga dapat menyesuaikan jumlah replika, mekanisme ini melakukan penskalaan yang sering. Karena scale-in dapat menyebabkan error resolusi, jangan gunakan auto-scaling beban kerja untuk CoreDNS.

Sesuaikan spesifikasi Pod CoreDNS

Anda juga dapat menyesuaikan resource CoreDNS dengan memodifikasi spesifikasi Pod. Dalam kluster ACK managed Pro, batas memori default untuk Pod CoreDNS adalah 2 GiB, tanpa batas CPU. Untuk kinerja yang konsisten, kami merekomendasikan batas CPU minimal 1024m. Anda dapat menyesuaikan permintaan dan batas resource ini di konsol.

Modifikasi konfigurasi CoreDNS di konsol

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

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

  3. Klik tab Network dan temukan kartu CoreDNS. Klik Configuration pada kartu tersebut.

    image

  4. Modifikasi konfigurasi CoreDNS dan klik OK.

    image

Jadwalkan Pod CoreDNS

Penting

Konfigurasi penjadwalan yang salah dapat mencegah Pod CoreDNS diterapkan, yang menyebabkan kegagalan CoreDNS. Sebelum melakukan operasi ini, pastikan Anda memahami penjadwalan.

Kami merekomendasikan Anda menerapkan Pod CoreDNS di zona ketersediaan berbeda dan pada node kluster berbeda untuk mencegah single point of failure. Versi add-on CoreDNS sebelum v1.8.4.3 memiliki anti-afinitas node yang disukai secara default, yang dapat menyebabkan Pod diterapkan pada node yang sama jika resource tidak mencukupi. Jika hal ini terjadi, hapus Pod untuk memicu penjadwalan ulang atau tingkatkan add-on ke versi terbaru. Versi add-on CoreDNS sebelum v1.8 tidak lagi dipelihara. Segera tingkatkan ke versi terbaru.

Pastikan node yang menjalankan CoreDNS tidak jenuh dengan penggunaan CPU atau memori tinggi, karena hal ini memengaruhi QPS dan latensi respons resolusi DNS. Jika resource node kluster memungkinkan, pertimbangkan untuk menggunakan parameter khusus untuk menjadwalkan CoreDNS ke node kluster independen guna menyediakan layanan resolusi DNS yang stabil.

Gunakan parameter khusus untuk menerapkan CoreDNS pada node khusus

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

  2. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Nodes > Nodes.

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

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

    Catatan

    Jumlah node harus lebih besar dari jumlah replika CoreDNS untuk menghindari menjalankan beberapa replika CoreDNS pada satu node.

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

    • Name: node-role-type

    • Value: coredns

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

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

    • Key: node-role-type

    • Value: coredns

    CoreDNS dijadwalkan ulang ke node dengan label yang ditentukan.

Optimalkan konfigurasi CoreDNS

ACK menyediakan konfigurasi default untuk CoreDNS. Anda harus meninjau parameter dalam konfigurasi dan mengoptimalkannya untuk memastikan CoreDNS dapat menyediakan layanan DNS yang tepat untuk kontainer bisnis Anda. CoreDNS sangat dapat dikonfigurasi. Untuk informasi lebih lanjut, lihat Konfigurasikan kebijakan DNS dan resolusi nama domain dan dokumentasi resmi CoreDNS.

Konfigurasi CoreDNS default dalam kluster Kubernetes lama mungkin memiliki beberapa risiko. Kami merekomendasikan Anda memeriksa dan mengoptimalkan item berikut:

Anda juga dapat menggunakan fitur inspeksi terjadwal dan diagnosis kesalahan dari Container Intelligence Service untuk memeriksa file konfigurasi CoreDNS. Jika layanan melaporkan konfigurasi ConfigMap CoreDNS yang tidak normal, tinjau item yang tercantum di atas.

Catatan

CoreDNS dapat mengonsumsi memori ekstra saat menyegarkan konfigurasinya. Setelah Anda memodifikasi ConfigMap CoreDNS, pantau status Pod. Jika Pod memiliki memori tidak mencukupi, segera modifikasi batas memori kontainer dalam Deployment CoreDNS. Kami merekomendasikan Anda menyesuaikan memori menjadi 2 GiB.

Nonaktifkan afinitas untuk layanan kube-dns

Konfigurasi afinitas dapat menyebabkan ketidakseimbangan beban signifikan antara replika CoreDNS yang berbeda. Kami merekomendasikan Anda mengikuti langkah-langkah berikut untuk menonaktifkannya:

Konsol

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

  2. Di 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 bidang sessionAffinity diatur ke None, Anda dapat melewati langkah-langkah berikut.

    • Jika bidang sessionAffinity diatur ke ClientIP, lakukan langkah-langkah berikut.

  4. Hapus bidang sessionAffinity dan sessionAffinityConfig serta semua sub-kuncinya. Lalu, klik Update.

    # Hapus semua konten berikut.
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  5. Klik Edit YAML di sebelah kanan layanan kube-dns lagi. Verifikasi bahwa bidang sessionAffinity diatur ke None. Nilai None menunjukkan bahwa layanan Kube-DNS berhasil diperbarui.

CLI

  1. Jalankan perintah berikut untuk melihat detail konfigurasi layanan kube-dns:

    kubectl -n kube-system get svc kube-dns -o yaml
    • Jika bidang sessionAffinity diatur ke None, Anda dapat melewati langkah-langkah berikut.

    • Jika bidang sessionAffinity diatur ke ClientIP, lakukan langkah-langkah berikut.

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

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

    # Hapus semua konten berikut.
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800
  4. Setelah modifikasi selesai, jalankan perintah berikut lagi untuk memeriksa apakah bidang sessionAffinity adalah None. Jika nilainya None, layanan Kube-DNS berhasil diubah.

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

Nonaktifkan plugin autopath

Plugin autopath, yang diaktifkan dalam beberapa versi CoreDNS awal, dapat menyebabkan error resolusi dalam kasus tertentu. Periksa apakah plugin diaktifkan dan nonaktifkan dengan mengedit file konfigurasi. Untuk informasi lebih lanjut, lihat Autopath.

Catatan

Setelah Anda menonaktifkan plugin autopath, QPS untuk permintaan resolusi DNS sisi klien dapat meningkat hingga tiga kali lipat, dan waktu yang dibutuhkan untuk menyelesaikan satu nama domain juga dapat meningkat hingga tiga kali lipat. Pantau beban CoreDNS dan dampaknya terhadap layanan Anda.

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

  2. Hapus baris autopath @kubernetes, lalu simpan dan keluar.

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

Konfigurasikan shutdown yang mulus untuk CoreDNS

lameduck adalah mekanisme shutdown yang mulus dalam CoreDNS. Mekanisme ini memastikan bahwa saat CoreDNS dihentikan atau direstart, permintaan yang sedang berlangsung diselesaikan dengan benar dan tidak terputus secara tiba-tiba. Mekanisme lameduck bekerja sebagai berikut:

  • Saat proses CoreDNS akan dihentikan, ia memasuki mode lameduck.

  • Dalam mode lameduck, CoreDNS berhenti menerima permintaan baru tetapi terus memproses permintaan yang telah diterima hingga semua permintaan selesai atau periode timeout lameduck terlampaui.

Konsol

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

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

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

  4. Rujuk file konfigurasi CoreDNS berikut. Pastikan plugin health diaktifkan dan sesuaikan timeout lameduck menjadi 15s. Lalu, klik OK.

  5. .:53 {
            errors       
            # Plugin health mungkin memiliki pengaturan berbeda di 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, modifikasi konfigurasi sebagai berikut untuk mengatur parameter lameduck ke 15s.
            health {
                lameduck 15s
            }       
            # Plugin lain tidak perlu dimodifikasi dan dihilangkan di sini.
        }

Jika Pod CoreDNS berjalan sebagaimana mestinya, konfigurasi shutdown yang mulus berhasil diperbarui. Jika Pod CoreDNS tidak normal, Anda dapat melihat event dan log Pod untuk mengidentifikasi penyebabnya.

CLI

  1. Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS:

  2. kubectl -n kube-system edit configmap/coredns
  3. Rujuk Corefile berikut. Pastikan plugin health diaktifkan dan sesuaikan parameter lameduck menjadi 15s.

  4. .:53 {
            errors     
            # Plugin health mungkin memiliki pengaturan berbeda di 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, modifikasi konfigurasi sebagai berikut untuk mengatur parameter lameduck ke 15s.
            health {
                lameduck 15s
            }
            # Plugin lain tidak perlu dimodifikasi dan dihilangkan di sini.
        }
  5. Setelah Anda memodifikasi file konfigurasi CoreDNS, simpan dan keluar.

  6. Jika CoreDNS berjalan sebagaimana mestinya, konfigurasi shutdown yang mulus berhasil diperbarui. Jika Pod CoreDNS tidak normal, Anda dapat melihat event dan log Pod untuk mengidentifikasi penyebabnya.

Konfigurasikan protokol plugin forward

Saat menggunakan NodeLocal DNSCache, rantai komunikasi adalah: Aplikasi → NodeLocal DNSCache (TCP) → CoreDNS (TCP). Secara default, CoreDNS kemudian berkomunikasi dengan server DNS upstream menggunakan protokol yang sama dengan permintaan sumber. Artinya, permintaan resolusi nama domain eksternal dari workload Anda melewati NodeLocal DNSCache dan CoreDNS, lalu dikirim ke server DNS VPC (dua alamat IP 100.100.2.136 dan 100.100.2.138 yang dikonfigurasi secara default pada Instance ECS) melalui TCP.

Server DNS VPC memiliki dukungan terbatas untuk TCP. Jika Anda menggunakan NodeLocal DNSCache, Anda perlu memodifikasi konfigurasi CoreDNS agar selalu memprioritaskan UDP untuk komunikasi dengan server DNS upstream guna menghindari error resolusi. Modifikasi file konfigurasi CoreDNS, yaitu ConfigMap bernama coredns di namespace kube-system. Untuk informasi lebih lanjut, lihat Kelola ConfigMaps. Di plugin forward, tentukan protokol untuk permintaan upstream sebagai prefer_udp. Setelah modifikasi, CoreDNS akan memprioritaskan UDP untuk komunikasi upstream. Modifikasinya sebagai berikut:

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

Konfigurasikan plugin ready

Versi CoreDNS 1.5.0 dan lebih baru memerlukan plugin ready untuk diaktifkan guna mengaktifkan pemeriksaan kesiapan.

  1. Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS:

    kubectl -n kube-system edit configmap/coredns
  2. Periksa apakah file berisi baris dengan ready. Jika tidak, tambahkan baris ready, 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 dan log Pod CoreDNS. Jika log berisi kata reload, modifikasi berhasil.

Konfigurasikan plugin multisocket

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

Anda perlu mengaktifkan multisocket dalam 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: Sesuaikan NUM_SOCKETS dengan perkiraan utilisasi CPU, batas resource CPU, dan resource kluster yang tersedia, misalnya:

  • Jika CoreDNS mengonsumsi 4 core selama jam sibuk dan resource yang tersedia adalah 8 core, atur NUM_SOCKETS ke 2.

  • Jika CoreDNS mengonsumsi 8 core selama jam sibuk dan 64 core tersedia, atur NUM_SOCKETS ke 8.

Untuk menentukan konfigurasi optimal, kami merekomendasikan Anda menguji QPS dan beban dengan konfigurasi berbeda.

Jika Anda tidak menentukan NUM_SOCKETS, nilai defaultnya 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 tersebut berjalan.