全部产品
Search
文档中心

Container Service for Kubernetes:Praktik terbaik DNS

更新时间:Nov 11, 2025

DNS merupakan salah satu layanan dasar paling penting dalam kluster Kubernetes. Waktu habis (timeout) dan kegagalan resolusi DNS dapat terjadi akibat pengaturan klien yang tidak tepat atau pada kluster berskala besar. Topik ini menjelaskan praktik terbaik untuk DNS di kluster Kubernetes guna membantu Anda mencegah masalah tersebut.

Catatan

Topik ini tidak berlaku untuk kluster ACK yang menggunakan edisi terkelola CoreDNS atau telah mengaktifkan mode hosting cerdas. Edisi terkelola CoreDNS secara otomatis melakukan skalabilitas elastis berdasarkan beban dan tidak memerlukan penyesuaian manual.

Isi

Praktik terbaik DNS mencakup sisi klien dan server:

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

Optimalkan permintaan resolusi nama domain

Permintaan resolusi nama domain merupakan salah satu perilaku 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 kontainer perlu sering meminta layanan lain, kami merekomendasikan Anda menggunakan kolam koneksi. Kolam koneksi menyimpan cache tautan ke layanan hulu di memori, sehingga menghindari overhead resolusi nama domain dan koneksi TCP untuk setiap akses.

  • Gunakan pola asinkron atau long polling untuk mendapatkan alamat IP yang sesuai dengan nama domain.

  • Gunakan cache DNS:

    • (Direkomendasikan) Jika aplikasi Anda tidak dapat dimodifikasi untuk terhubung ke layanan lain menggunakan kolam koneksi, Anda dapat menyimpan cache hasil resolusi DNS di sisi aplikasi. Untuk informasi selengkapnya, lihat Gunakan NodeLocal DNSCache.

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

  • Optimalkan file resolv.conf: Mekanisme parameter ndots dan search dalam file resolv.conf berarti bahwa cara berbeda dalam mengonfigurasi nama domain di dalam kontainer akan menentukan efisiensi resolusi nama domain. Untuk informasi selengkapnya tentang mekanisme parameter ndots dan search, lihat Konfigurasikan kebijakan DNS dan resolusi nama domain.

  • Optimalkan konfigurasi nama domain: Jika sebuah aplikasi dalam kontainer perlu mengakses nama domain, konfigurasikan nama domain sesuai prinsip berikut untuk meminimalkan jumlah upaya resolusi dan mengurangi waktu yang dibutuhkan.

    • Jika sebuah Pod mengakses layanan dalam namespace yang sama, kami merekomendasikan Anda menggunakan format <service-name>, di mana service-name adalah nama layanan tersebut.

    • Jika sebuah Pod mengakses layanan di namespace berbeda, kami merekomendasikan Anda menggunakan format <service-name>.<namespace-name>, di mana namespace-name adalah namespace tempat layanan tersebut berada.

    • Jika sebuah Pod mengakses nama domain di luar kluster, gunakan nama domain berkualifikasi lengkap (FQDN) untuk mencegah beberapa pencarian tidak perlu yang disebabkan oleh penambahan domain search. FQDN ditentukan dengan menambahkan titik (.) di akhir nama domain. Misalnya, untuk mengakses www.aliyun.com, gunakan FQDN www.aliyun.com..

      • Pada kluster versi 1.33 atau lebih baru, Anda dapat mengonfigurasi domain pencarian sebagai "." tunggal untuk mencapai efek serupa. Untuk informasi selengkapnya, lihat isu 125883 di GitHub:

              dnsPolicy: None
              dnsConfig:
                nameservers: ["192.168.0.10"]  ## Alamat IP 192.168.0.10 adalah clusterIP layanan coredns. Anda perlu mengubahnya sesuai lingkungan aktual Anda.
                searches:
                - .
                - default.svc.cluster.local  ## Catatan: Anda perlu mengganti default dengan nama namespace aktual.
                - svc.cluster.local
                - cluster.local

        Setelah menerapkan konfigurasi di atas, file /etc/resolv.conf di dalam Pod menjadi sebagai berikut:

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

        Seperti yang terlihat, "." adalah domain pencarian pertama. Dengan demikian, permintaan nama domain selalu menganggap nama domain tujuan sebagai FQDN dan pertama kali mencoba menyelesaikan nama domain itu sendiri, sehingga menghindari pencarian yang tidak valid.

        Penting

        Perhatikan bahwa Anda harus mengatur dnsPolicy ke None agar konfigurasi di atas 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"]  ## Alamat IP 192.168.0.10 adalah clusterIP layanan coredns. Anda perlu mengubahnya sesuai lingkungan aktual Anda.
                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 memiliki perbedaan kecil dalam implementasinya. Anda mungkin mengalami kasus di mana `dig <nama domain>` berhasil tetapi `ping <nama domain>` gagal.

  • Kami merekomendasikan agar Anda tidak menggunakan Alpine sebagai citra dasar. Pustaka musl libc yang tertanam dalam citra kontainer Alpine memiliki beberapa perbedaan dibandingkan implementasi glibc standar, yang dapat menyebabkan masalah seperti berikut. Anda dapat menggunakan citra dasar lain, seperti Debian atau CentOS.

    • Alpine 3.18 dan versi sebelumnya tidak mendukung fallback ke protokol TCP untuk respons yang terpotong.

    • Pada Alpine 3.3 dan versi sebelumnya, parameter search tidak didukung. Artinya, domain pencarian tidak didukung dan penemuan layanan tidak dapat diselesaikan.

    • Permintaan konkuren ke beberapa server DNS yang dikonfigurasi di /etc/resolv.conf menyebabkan optimasi NodeLocal DNSCache gagal.

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

    Untuk informasi selengkapnya tentang masalah ini, lihat dokumentasi musl libc.

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

Hindari waktu habis resolusi DNS intermiten yang disebabkan oleh bug IPVS

Jika Anda menggunakan IPVS sebagai mode load balancing kube-proxy, Anda mungkin mengalami waktu habis resolusi DNS intermiten saat CoreDNS diskala-masuk atau dimulai ulang. Masalah ini disebabkan oleh bug kernel Linux. Untuk informasi selengkapnya, lihat dokumentasi IPVS.

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

Gunakan NodeLocal DNSCache

Dalam beberapa kasus, CoreDNS mungkin mengalami masalah berikut:

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

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

Untuk meningkatkan stabilitas dan kinerja layanan DNS di kluster, kami merekomendasikan Anda menginstal komponen NodeLocal DNSCache. Komponen ini meningkatkan kinerja DNS kluster dengan menjalankan cache DNS pada node kluster. Untuk informasi selengkapnya tentang NodeLocal DNSCache dan cara menerapkannya di kluster ACK, lihat Gunakan komponen NodeLocal DNSCache.

Penting

Setelah Anda menginstal NodeLocal DNSCache, Anda harus menyuntikkan konfigurasi cache DNS ke dalam Pod. Anda dapat menjalankan perintah berikut untuk menambahkan label ke namespace tertentu. Konfigurasi cache DNS kemudian akan secara otomatis disuntikkan ke Pod baru yang dibuat di namespace tersebut. Untuk informasi selengkapnya tentang metode penyuntikan lainnya, lihat dokumen referensi.

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

Gunakan versi CoreDNS yang tepat

CoreDNS menyediakan kompatibilitas mundur yang baik dengan versi Kubernetes. Kami merekomendasikan Anda selalu memperbarui CoreDNS ke versi stabil terbaru. Halaman Manajemen Komponen di konsol ACK memungkinkan Anda menginstal, memutakhirkan, dan mengonfigurasi CoreDNS. Anda dapat memeriksa status komponen CoreDNS di halaman Manajemen Komponen. Jika tersedia pemutakhiran untuk komponen CoreDNS, lakukan pemutakhiran tersebut di luar jam sibuk.

Versi CoreDNS sebelum v1.7.0 memiliki risiko potensial, seperti berikut:

Versi minimum CoreDNS yang direkomendasikan bervariasi berdasarkan versi kluster Kubernetes, seperti yang ditunjukkan dalam tabel berikut.

Versi kluster

Versi minimum CoreDNS yang direkomendasikan

Sebelum 1.14.8

v1.6.2 (Tidak lagi dipelihara)

1.14.8 atau lebih baru, sebelum 1.20.4

v1.7.0.0-f59c03d-aliyun

1.20.4 atau lebih baru, sebelum 1.21.0

v1.8.4.1-3a376cc-aliyun

1.21.0 atau lebih baru

v1.11.3.2-f57ea7ed6-aliyun

Pantau status berjalan CoreDNS

Metrik

CoreDNS mengekspos metrik kesehatan, seperti hasil resolusi, melalui antarmuka Prometheus standar untuk mendeteksi pengecualian pada server CoreDNS bahkan server DNS hulu.

Prometheus untuk Alibaba Cloud menyediakan pemantauan metrik bawaan dan aturan peringatan untuk CoreDNS. Anda dapat mengaktifkan fitur Prometheus dan dasbor di Konsol Container Service for Kubernetes (ACK). Untuk informasi selengkapnya, 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 menetapkan peringatan untuk metrik utama. Untuk informasi selengkapnya, lihat dokumentasi resmi Prometheus CoreDNS.

Log berjalan

Jika terjadi pengecualian DNS, log CoreDNS dapat membantu Anda mendiagnosis akar penyebabnya dengan cepat. Kami merekomendasikan Anda mengaktifkan log resolusi nama domain CoreDNS dan koleksi log SLS-nya. Untuk informasi selengkapnya, lihat Analisis dan pantau log CoreDNS.

Pengiriman event Kubernetes

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

Fitur ini diaktifkan secara default untuk CoreDNS yang baru diterapkan. Jika Anda memutakhirkan dari versi CoreDNS sebelumnya ke v1.9.3.6-32932850-aliyun atau lebih baru, Anda harus 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
            }
    
            // Tambahkan konten berikut (abaikan perbedaan lainnya).
            kubeapi
            k8s_event {
              level info error warning // Kirim log utama dengan status info, error, dan warning.
            }
            // Akhir konten yang ditambahkan.
    
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods verified
                fallthrough in-addr.arpa ip6.arpa
            }
            // Konten berikutnya dihilangkan.
        }
  3. Periksa status berjalan dan log Pod CoreDNS. Jika log berisi kata reload, modifikasi berhasil.

Pastikan ketersediaan tinggi CoreDNS

CoreDNS adalah otoritas DNS di dalam kluster. Kegagalan CoreDNS akan menyebabkan akses ke layanan dalam kluster gagal, yang dapat mengakibatkan ketidaktersediaan layanan secara luas. Anda dapat mengambil langkah-langkah berikut untuk memastikan ketersediaan tinggi CoreDNS:

Evaluasi tekanan pada komponen CoreDNS

Anda dapat melakukan uji stres DNS di kluster untuk mengevaluasi beban pada komponen tersebut. Banyak alat sumber terbuka, seperti DNSPerf, dapat membantu Anda mencapai hal ini. Jika Anda tidak dapat mengevaluasi beban DNS di kluster secara akurat, Anda dapat merujuk pada standar rekomendasi berikut.

  • Kami merekomendasikan Anda mengatur jumlah Pod CoreDNS minimal 2. Batas sumber daya Pod tunggal sebaiknya tidak kurang dari 1 core dan 1 GB.

  • Permintaan resolusi nama domain per detik (QPS) yang dapat disediakan CoreDNS berkorelasi positif dengan konsumsi CPU. Jika NodeLocal DNSCache digunakan, setiap core CPU dapat mendukung lebih dari 10.000 QPS untuk permintaan resolusi nama domain. Persyaratan QPS untuk permintaan nama domain sangat bervariasi antar jenis layanan. Anda dapat mengamati penggunaan CPU puncak setiap Pod CoreDNS. Jika penggunaan CPU melebihi satu core selama jam sibuk, kami merekomendasikan Anda melakukan skala-keluar replika CoreDNS. Jika Anda tidak dapat menentukan penggunaan CPU puncak, Anda dapat menerapkan Pod secara konservatif dengan rasio 1 Pod untuk setiap 8 node kluster. Artinya, untuk setiap penambahan 8 node kluster, tambahkan satu Pod CoreDNS.

Sesuaikan jumlah Pod CoreDNS

Jumlah Pod CoreDNS secara langsung menentukan sumber daya komputasi yang dapat digunakan CoreDNS. Anda dapat menyesuaikan jumlah Pod CoreDNS berdasarkan hasil evaluasi.

Penting

Karena protokol UDP tidak memiliki mekanisme pengiriman ulang, jika terdapat risiko kehilangan paket pada node kluster akibat bug UDP IPVS, skala-masuk atau memulai ulang Pod CoreDNS dapat menyebabkan waktu habis atau pengecualian resolusi nama domain untuk seluruh kluster hingga lima menit. Untuk informasi selengkapnya tentang solusi pengecualian resolusi yang disebabkan oleh bug IPVS, lihat Pemecahan masalah kegagalan resolusi DNS.

  • Menyesuaikan secara otomatis berdasarkan kebijakan yang direkomendasikan

    Anda dapat men-deploy dns-autoscaler. Alat ini secara otomatis menyesuaikan jumlah Pod CoreDNS berdasarkan kebijakan yang direkomendasikan, seperti satu Pod untuk setiap delapan node kluster. Jumlah replika dihitung menggunakan rumus: replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica)), dan 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 Pod CoreDNS secara manual.

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

    Meskipun penskalaan beban kerja otomatis, seperti Penyesuaian Otomatis Pod Horizontal (HPA) dan CronHPA, juga dapat menyesuaikan jumlah Pod secara otomatis, alat ini melakukan operasi penskalaan yang sering. Karena pengecualian resolusi yang disebabkan oleh skala-masuk Pod yang disebutkan sebelumnya, jangan gunakan penskalaan beban kerja otomatis untuk mengontrol jumlah Pod CoreDNS.

Sesuaikan spesifikasi Pod CoreDNS

Cara lain untuk menyesuaikan sumber daya CoreDNS adalah dengan menyesuaikan spesifikasi Pod. Di kluster ACK Pro, batas memori default untuk Pod CoreDNS adalah 2 GiB, dan tidak ada batas CPU. Kami merekomendasikan Anda mengatur batas CPU menjadi 4096m, dan nilai minimum sebaiknya tidak kurang dari 1024m. Anda dapat menyesuaikan konfigurasi Pod CoreDNS di konsol.

Ubah konfigurasi CoreDNS di konsol

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

  2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel kiri, pilih Operations > Add-ons.

  3. Klik tab Network. Di kartu CoreDNS, klik Configure.

    image

  4. Ubah konfigurasi CoreDNS, lalu klik OK.

    image

Jadwalkan Pod CoreDNS

Penting

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

Kami merekomendasikan Anda menerapkan Pod CoreDNS di node kluster yang berbeda di zona berbeda untuk menghindari kegagalan node tunggal dan zona tunggal. Komponen CoreDNS sebelum v1.8.4.3 dikonfigurasi dengan anti-afinitas lemah berdasarkan node secara default. Hal ini dapat menyebabkan beberapa atau semua Pod diterapkan di node yang sama karena sumber daya node yang tidak mencukupi. Jika hal ini terjadi, Anda dapat menghapus Pod untuk memicu penyesuaian penjadwalan, atau memutakhirkan komponen ke versi terbaru. Versi komponen CoreDNS sebelum v1.8 tidak lagi dipelihara. Kami merekomendasikan Anda segera memutakhirkan versi tersebut.

Node kluster tempat CoreDNS berjalan sebaiknya tidak memiliki penggunaan CPU dan memori penuh. Jika tidak, QPS dan latensi tanggapan resolusi nama domain akan terpengaruh. Jika kondisi node kluster memungkinkan, Anda dapat mempertimbangkan penggunaan parameter kustom untuk menjadwalkan CoreDNS ke node kluster independen guna menyediakan layanan resolusi nama domain yang stabil.

Gunakan parameter kustom untuk menerapkan CoreDNS di node khusus

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

  2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel kiri, pilih 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 daripada jumlah replika CoreDNS untuk menghindari menjalankan beberapa replika CoreDNS di satu node.

  5. Di 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 > Component Management dan cari CoreDNS.

  7. Klik Configure di kartu CoreDNS. Di kotak dialog Configure, klik + Add di sebelah kanan NodeSelector. Atur parameter berikut dan klik OK.

    • Key: node-role-type

    • Value: CoreDNS

    CoreDNS dijadwalkan ulang ke node dengan label yang ditentukan.

Optimalkan konfigurasi CoreDNS

ACK hanya menyediakan konfigurasi default untuk CoreDNS. Anda harus memperhatikan parameter dalam konfigurasi dan mengoptimalkannya untuk memastikan CoreDNS dapat menyediakan layanan DNS bagi kontainer aplikasi Anda. Konfigurasi CoreDNS sangat fleksibel. Untuk informasi selengkapnya, lihat Konfigurasikan kebijakan DNS dan resolusi nama domain dan dokumentasi resmi CoreDNS.

Konfigurasi CoreDNS default yang diterapkan dengan versi kluster Kubernetes sebelumnya mungkin memiliki beberapa risiko. Kami merekomendasikan Anda memeriksa dan mengoptimalkan konfigurasi sebagai berikut:

Anda juga dapat memeriksa file konfigurasi CoreDNS menggunakan fitur inspeksi terjadwal dan diagnosis kesalahan AIOps. Jika hasil inspeksi AIOps menunjukkan bahwa konfigurasi ConfigMap CoreDNS tidak normal, periksa item-item di atas satu per satu.

Catatan

CoreDNS mungkin mengonsumsi memori ekstra saat menyegarkan konfigurasi. Setelah Anda memodifikasi item konfigurasi CoreDNS, amati status berjalan Pod. Jika Pod kekurangan memori, segera modifikasi batas memori kontainer di penerapan CoreDNS. Kami merekomendasikan Anda menyesuaikan memori menjadi 2 GB.

Nonaktifkan konfigurasi afinitas layanan kube-dns

Konfigurasi afinitas dapat menyebabkan perbedaan beban besar antar replika CoreDNS. Kami merekomendasikan Anda menonaktifkannya dengan mengikuti langkah-langkah berikut:

Gunakan konsol

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

  2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel kiri, pilih Network > Services.

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

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

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

  4. Hapus bidang sessionAffinity dan sessionAffinityConfig beserta 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 dan periksa apakah bidang sessionAffinity bernilai None. Jika nilainya None, layanan kube-dns telah berhasil dimodifikasi.

Gunakan baris perintah

  1. Jalankan perintah berikut untuk melihat informasi 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-langkah berikut.

    • Jika nilai bidang sessionAffinity adalah 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, jalankan perintah berikut lagi untuk memeriksa apakah nilai 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

Beberapa versi CoreDNS sebelumnya memiliki plugin Autopath yang diaktifkan. Plugin ini dapat menyebabkan hasil resolusi salah dalam beberapa skenario ekstrem. Anda harus memeriksa apakah plugin ini diaktifkan dan mengedit file konfigurasi untuk menonaktifkannya. Untuk informasi selengkapnya, lihat Autopath.

Catatan

Setelah Anda menonaktifkan plugin Autopath, QPS permintaan resolusi nama domain dari klien dapat meningkat hingga tiga kali lipat, dan waktu yang dibutuhkan untuk menyelesaikan satu nama domain juga dapat meningkat hingga tiga kali lipat. Perhatikan beban CoreDNS dan dampak terhadap bisnis.

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

Konfigurasikan shutdown yang mulus untuk CoreDNS

lameduck adalah mekanisme di CoreDNS yang menerapkan shutdown yang mulus. Jika CoreDNS perlu dihentikan atau dimulai ulang, mekanisme ini memastikan permintaan yang sedang diproses dapat diselesaikan secara normal tanpa gangguan mendadak. Mekanisme lameduck bekerja sebagai berikut:

  • Jika 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 waktu habis lameduck terlampaui.

Gunakan konsol

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

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

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

  4. Dalam file konfigurasi CoreDNS berikut, pastikan plugin health diaktifkan, atur waktu habis lameduck menjadi 15 s, 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 menjadi 5s.   
            # health {
            #     lameduck 5s
            # }      
            # Untuk ketiga skenario di atas, Anda harus memodifikasi konfigurasi secara seragam sebagai berikut dan menyesuaikan parameter lameduck menjadi 15s.
            health {
                lameduck 15s
            }       
            # Plugin lain tidak perlu dimodifikasi dan dihilangkan di sini.
        }

Jika Pod CoreDNS berjalan normal, konfigurasi shutdown yang mulus CoreDNS berhasil diperbarui. Jika Pod CoreDNS tidak normal, Anda dapat menemukan penyebabnya dengan melihat event dan log Pod.

Gunakan 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 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 menjadi 5s.   
            # health {
            #     lameduck 5s
            # }
            # Untuk ketiga skenario di atas, Anda harus memodifikasi konfigurasi secara seragam sebagai berikut dan menyesuaikan parameter lameduck menjadi 15s.
            health {
                lameduck 15s
            }
            # Plugin lain tidak perlu dimodifikasi dan dihilangkan di sini.
        }
  5. Setelah memodifikasi file konfigurasi CoreDNS, simpan dan keluar.

  6. Jika CoreDNS berjalan normal, konfigurasi shutdown yang mulus CoreDNS berhasil diperbarui. Jika Pod CoreDNS tidak normal, Anda dapat menemukan penyebabnya dengan melihat event dan log Pod.

Konfigurasikan protokol default untuk plugin forward dan server DNS VPC hulu

NodeLocal DNSCache menggunakan protokol TCP untuk berkomunikasi dengan CoreDNS. CoreDNS berkomunikasi dengan server DNS hulu menggunakan protokol yang digunakan oleh sumber permintaan. Oleh karena itu, secara default, permintaan untuk menyelesaikan nama domain di luar kluster dari kontainer aplikasi melewati NodeLocal DNSCache dan CoreDNS, lalu akhirnya dikirim melalui TCP ke server DNS VPC. Server DNS VPC adalah dua alamat IP, yaitu 100.100.2.136 dan 100.100.2.138, yang dikonfigurasi secara default pada Instance ECS.

Server DNS VPC memiliki dukungan terbatas untuk protokol TCP. Jika Anda menggunakan NodeLocal DNSCache, Anda harus memodifikasi konfigurasi CoreDNS untuk memprioritaskan protokol UDP dalam berkomunikasi dengan server DNS hulu guna menghindari kegagalan resolusi. Kami merekomendasikan Anda memodifikasi konfigurasi CoreDNS dengan mengubah ConfigMap bernama coredns di namespace kube-system. Untuk informasi selengkapnya, lihat Kelola ConfigMap. Tentukan prefer_udp sebagai protokol untuk meminta hulu di plugin forward. Setelah modifikasi, CoreDNS memprioritaskan protokol UDP dalam berkomunikasi dengan hulu. Modifikasinya sebagai berikut:

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

Konfigurasikan plugin ready untuk pemeriksaan kesiapan

Untuk versi CoreDNS 1.5.0 dan lebih baru, Anda harus mengonfigurasi plugin ready untuk 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 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. Perhatikan indentasi harus 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.

Konfigurasikan plugin multisocket untuk meningkatkan kinerja penguraian CoreDNS

CoreDNS v1.12.1 memperkenalkan plugin multisocket. Mengaktifkan plugin ini memungkinkan CoreDNS mendengarkan pada port yang sama menggunakan beberapa soket, yang meningkatkan kinerja CoreDNS dalam skenario dengan penggunaan CPU tinggi. Untuk pengenalan detail plugin ini, lihat dokumentasi komunitas.

Anda perlu mengaktifkan multisocket melalui 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 nilai NUM_SOCKETS dengan perkiraan penggunaan CPU, batas sumber daya CPU, dan sumber daya kluster yang tersedia. Contohnya:

  • Jika CoreDNS mengonsumsi 4 core pada puncaknya dan sumber daya yang tersedia adalah 8 core, atur NUM_SOCKETS menjadi 2.

  • Jika CoreDNS mengonsumsi 8 core pada puncaknya dan sumber daya yang tersedia adalah 64 core, atur NUM_SOCKETS menjadi 8.

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

Jika Anda tidak menentukan NUM_SOCKETS, GOMAXPROCS digunakan secara default, yang sama dengan batas CPU Pod CoreDNS. Jika batas CPU Pod tidak diatur, nilainya sama dengan jumlah core CPU pada node tempat Pod berada.