All Products
Search
Document Center

Container Service for Kubernetes:Praktik terbaik DNS

Last Updated:Jun 21, 2026

DNS merupakan layanan kritis dalam kluster Kubernetes. Dalam kondisi tertentu, seperti konfigurasi klien yang tidak tepat atau pada kluster berskala besar, DNS dapat mengalami timeout dan kegagalan resolusi. Topik ini menyediakan praktik terbaik untuk DNS di kluster Kubernetes guna membantu Anda menghindari masalah tersebut.

Catatan

Topik ini tidak berlaku untuk edisi terkelola CoreDNS atau kluster ACK yang telah mengaktifkan Auto Mode. Edisi terkelola CoreDNS secara otomatis melakukan scaling berdasarkan beban, sehingga tidak memerlukan penyesuaian manual.

Dalam topik ini

Praktik terbaik DNS mencakup optimasi sisi klien dan sisi server:

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

Optimalkan permintaan resolusi nama domain

Resolusi DNS merupakan salah satu operasi jaringan paling sering dilakukan dalam kluster Kubernetes. Banyak dari permintaan ini dapat dioptimalkan atau dihindari untuk mengurangi latensi dan beban pada infrastruktur DNS. Anda dapat mengoptimalkan permintaan resolusi nama domain dengan cara berikut:

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

  • Gunakan mode asinkron atau long-polling untuk mendapatkan alamat IP suatu nama domain.

  • Gunakan cache DNS:

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

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

  • Optimalkan file resolv.conf: Karena mekanisme parameter ndots dan search dalam file resolv.conf, cara Anda menulis nama domain dalam kontainer menentukan efisiensi resolusi nama domain. Untuk informasi lebih lanjut tentang mekanisme parameter ndots dan search, lihat Konfigurasi Kebijakan DNS dan Resolusi Nama Domain.

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

    • Untuk mengakses layanan dalam namespace yang sama dari sebuah Pod, gunakan <service-name>, di mana service-name adalah nama layanan tersebut.

    • Untuk mengakses layanan dalam namespace berbeda dari sebuah Pod, gunakan <service-name>.<namespace-name>, di mana namespace-name adalah namespace tempat layanan tersebut berada.

    • Saat sebuah Pod mengakses nama domain eksternal, gunakan Fully Qualified Domain Name (FQDN), yang diakhiri dengan titik (.), untuk mencegah beberapa pencarian DNS tidak valid yang disebabkan oleh penambahan domain dari daftar search. Misalnya, untuk mengakses www.aliyun.com, gunakan FQDN-nya www.aliyun.com..

      • Pada kluster yang menjalankan Kubernetes 1.22 atau lebih baru, Anda dapat mengonfigurasi domain pencarian sebagai satu titik (.) untuk mencapai efek serupa (lihat Issue 125883):

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

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

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

        Domain pencarian pertama adalah ".", yang membuat resolver memperlakukan domain target sebagai FQDN. Resolver pertama kali mencoba menyelesaikan nama domain apa adanya, melewati ekspansi domain pencarian yang tidak perlu.

        Penting

        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"]  ## 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

Pahami konfigurasi DNS dalam kontainer

  • Resolver DNS yang berbeda dapat berperilaku berbeda karena variasi implementasi. Anda mungkin menemui kasus di mana dig <domain> berhasil tetapi ping <domain> gagal.

  • Hindari penggunaan Alpine sebagai gambar dasar. Gunakan gambar dasar lain, seperti Debian atau CentOS. Pustaka musl libc yang dibangun dalam gambar kontainer Alpine memiliki beberapa perbedaan implementasi dibandingkan glibc standar, yang dapat menyebabkan masalah termasuk namun tidak terbatas pada hal berikut:

    • Fallback TCP: Alpine 3.18 dan versi sebelumnya tidak mendukung fallback ke TCP ketika flag truncated (TC) dikembalikan.

    • Domain pencarian: Alpine 3.3 dan versi sebelumnya tidak mendukung parameter search, yang mengganggu penemuan layanan.

    • Konflik optimasi: Alpine melakukan kueri secara konkuren ke semua server DNS yang dikonfigurasi dalam /etc/resolv.conf, yang dapat mem-bypass dan membatalkan optimasi NodeLocal DNSCache.

    • Kondisi race conntrack: Permintaan rekaman A dan AAAA secara konkuren yang menggunakan soket yang sama dapat memicu konflik port sumber conntrack pada kernel Linux lama, yang mengakibatkan kehilangan paket.

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

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

Hindari timeout DNS yang disebabkan oleh cacat IPVS

Saat kluster menggunakan IPVS sebagai mode load balancing kube-proxy, Anda mungkin mengalami timeout resolusi DNS probabilistik saat CoreDNS diskalakan turun atau direstart. Masalah ini disebabkan oleh cacat pada kernel Linux komunitas. Untuk informasi lebih lanjut, lihat IPVS.

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

Gunakan NodeLocal DNSCache

CoreDNS mungkin mengalami masalah berikut:

  • Dalam kasus langka, kueri A dan AAAA secara konkuren dapat menyebabkan kehilangan paket, yang mengarah pada kegagalan resolusi DNS.

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

Untuk meningkatkan stabilitas dan performa DNS dalam kluster Anda, instal komponen NodeLocal DNSCache. Komponen ini meningkatkan performa DNS kluster dengan menjalankan cache DNS pada setiap node kluster. Untuk informasi lebih lanjut tentang NodeLocal DNSCache dan cara menerapkannya dalam kluster ACK, lihat Gunakan komponen NodeLocal DNSCache.

Penting

Setelah Anda menginstal NodeLocal DNSCache, Anda harus menyuntikkan konfigurasi cache DNS ke dalam Pod Anda. Anda dapat menjalankan perintah berikut untuk menambahkan label ke namespace tertentu. 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 yang dirujuk pada paragraf sebelumnya.

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

Gunakan versi CoreDNS yang sesuai

CoreDNS menawarkan kompatibilitas mundur yang baik dengan versi Kubernetes. Selalu perbarui CoreDNS ke versi stabil terbaru. Halaman Add-ons di konsol ACK memungkinkan Anda menginstal, meningkatkan, dan mengonfigurasi CoreDNS. Periksa status komponen CoreDNS di halaman Add-ons. Jika tersedia pembaruan, jadwalkan pembaruan tersebut selama jam sepi.

Versi CoreDNS sebelum v1.7.0 memiliki beberapa risiko potensial, termasuk:

  • Saat konektivitas antara CoreDNS dan server API tidak normal, misalnya karena restart, migrasi, atau fluktuasi jaringan server API, CoreDNS mungkin restart karena gagal menulis log error. Untuk informasi lebih lanjut, lihat Set klog's logtostderr flag.

  • CoreDNS mengonsumsi memori ekstra saat startup. Batas memori default mungkin memicu masalah kehabisan memori (OOM) pada kluster berskala besar. Dalam kasus parah, hal ini dapat menyebabkan Pod CoreDNS masuk ke loop restart dan gagal pulih. Untuk informasi lebih lanjut, lihat CoreDNS uses a lot memory during initialization phase.

  • CoreDNS memiliki beberapa masalah yang dapat memengaruhi resolusi nama domain layanan headless dan nama domain di luar kluster. Untuk informasi lebih lanjut, lihat plugin/kubernetes: handle tombstones in default processor dan Data is not synced when CoreDNS reconnects to kubernetes api server after protracted disconnection.

  • Jika sebuah node kluster menjadi abnormal, kebijakan toleransi default pada beberapa versi CoreDNS sebelumnya mungkin menyebabkan Pod CoreDNS dijadwalkan ke node abnormal tersebut. Pod ini tidak dapat dievakuasi secara otomatis, yang mengarah pada kegagalan resolusi DNS.

Versi minimum CoreDNS yang direkomendasikan bervariasi tergantung pada versi Kubernetes kluster.

Versi kluster

Versi CoreDNS minimum

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 dan lebih baru

v1.11.3.2-f57ea7ed6-aliyun

Pantau status operasional CoreDNS

Metrik

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

Managed Service for Prometheus menyediakan dasbor pemantauan metrik bawaan dan aturan peringatan 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 yang relevan di Prometheus dan menyiapkan peringatan untuk indikator kunci. Untuk informasi lebih lanjut, lihat dokumentasi resmi CoreDNS untuk Prometheus.

Log

Jika terjadi anomali DNS, log CoreDNS dapat membantu Anda mendiagnosis akar penyebabnya dengan cepat. Kami merekomendasikan Anda mengaktifkan logging resolusi nama domain CoreDNS dan mengumpulkan log-nya dengan Log Service. Untuk informasi lebih lanjut, 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 kritis sebagai event Kubernetes ke Pusat Insiden. Untuk informasi lebih lanjut tentang plugin k8s_event, lihat k8s_event.

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

  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 // Kirim log kritis dengan status info, error, dan warning.
            }
            // Akhir penambahan.
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods verified
                fallthrough in-addr.arpa ip6.arpa
            }
            // ... (konten sisanya dihilangkan)
        }
  3. Periksa status operasional dan log Pod CoreDNS. Jika log berisi kata reload, modifikasi berhasil.

Pastikan ketersediaan tinggi CoreDNS

CoreDNS adalah otoritas DNS untuk kluster. Kegagalan CoreDNS dapat menyebabkan kegagalan akses layanan dalam kluster, yang berpotensi menyebabkan ketidaktersediaan layanan secara luas. Anda dapat mengambil langkah-langkah berikut untuk memastikan ketersediaan tinggi CoreDNS:

Evaluasi tekanan komponen CoreDNS

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

  • Selalu atur jumlah Pod CoreDNS minimal 2, dengan batas resource minimal 1 core dan 1 GiB untuk satu Pod.

  • QPS resolusi nama domain CoreDNS berkorelasi positif dengan konsumsi CPU-nya. Dengan NodeLocal DNSCache diaktifkan, setiap core CPU dapat mendukung lebih dari 10.000 QPS. Permintaan QPS untuk permintaan nama domain sangat bervariasi tergantung jenis layanan. Anda dapat mengamati penggunaan CPU puncak setiap Pod CoreDNS. Jika sebuah Pod menggunakan lebih dari satu core CPU selama jam sibuk, kami merekomendasikan Anda melakukan scale out replika CoreDNS. Jika Anda tidak dapat menentukan penggunaan CPU puncak, Anda dapat secara konservatif menggunakan rasio 1:8 antara Pod dan node kluster. Artinya, untuk setiap 8 node kluster yang Anda tambahkan, 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 evaluasi Anda.

Penting

Karena kurangnya mekanisme pengiriman ulang pada paket UDP, jika ada risiko kehilangan paket pada node kluster akibat cacat UDP IPVS, scaling in atau restart Pod CoreDNS dapat menyebabkan timeout atau anomali resolusi DNS di seluruh kluster hingga lima menit. Untuk solusi anomali resolusi yang disebabkan oleh cacat IPVS, lihat Pemecahan masalah resolusi DNS.

  • Menyesuaikan secara otomatis berdasarkan kebijakan yang direkomendasikan

    Anda dapat menerapkan dns-autoscaler berikut. Alat ini secara otomatis menyesuaikan jumlah Pod CoreDNS secara real-time berdasarkan kebijakan yang direkomendasikan (rasio 1:8 antara Pod dan node kluster). Jumlah Pod dihitung menggunakan rumus berikut: replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica)), dan dibatasi oleh parameter 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 auto-scaling beban kerja

    Meskipun fitur auto-scaling beban kerja seperti Horizontal Pod Autoscaler (HPA) dan CronHPA juga dapat menyesuaikan jumlah Pod secara otomatis, fitur ini melakukan operasi scaling yang sering. Karena anomali resolusi yang terjadi saat Pod diskalakan turun, jangan gunakan auto-scaling beban kerja untuk mengontrol jumlah Pod CoreDNS.

Sesuaikan 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 2Gi, tanpa batas CPU. Atur batas CPU ke 4096m, dengan minimum 1024m. Anda dapat menyesuaikan konfigurasi Pod CoreDNS di konsol.

Ubah konfigurasi CoreDNS di konsol

  1. Masuk ke Konsol ACK atau . 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. Di kartu tersebut, klik Configuration.

  4. Ubah konfigurasi CoreDNS, lalu klik OK.

    Kotak dialog menampilkan pesan bahwa pembaruan parameter akan menghasilkan ulang templat YAML komponen dan dapat menimpa perubahan yang dilakukan melalui kubectl. Parameter yang dapat dikonfigurasi meliputi MemoryRequest, CpuRequest, MemoryLimit (mengatur terlalu rendah dapat memicu OOMKilled), CpuLimit (disarankan dua kali CpuRequest), dan NodeSelector (dalam pasangan kunci-nilai).

Jadwalkan Pod CoreDNS

Penting

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

Kami merekomendasikan Anda menerapkan Pod CoreDNS di berbagai zona ketersediaan dan node kluster untuk menghindari kegagalan single-node atau single-zona ketersediaan. Versi komponen CoreDNS sebelum v1.8.4.3 memiliki kebijakan anti-afinitas lunak default di tingkat node, yang dapat menyebabkan beberapa atau semua Pod diterapkan pada node yang sama jika sumber daya tidak mencukupi. Jika hal ini terjadi, hapus Pod untuk memicu penjadwalan ulang, atau tingkatkan komponen ke versi terbaru. Versi komponen CoreDNS sebelum v1.8 tidak lagi dipelihara dan harus segera ditingkatkan.

Node kluster tempat CoreDNS berjalan sebaiknya tidak memiliki CPU atau memori yang sepenuhnya terpakai, karena hal ini memengaruhi QPS dan latensi respons resolusi nama domain. Saat kondisi node kluster memungkinkan, pertimbangkan untuk menggunakan parameter khusus untuk menjadwalkan CoreDNS ke node kluster khusus guna menyediakan layanan resolusi nama domain yang stabil.

Gunakan parameter khusus untuk menerapkan CoreDNS pada node khusus

  1. Masuk ke Konsol ACK atau . 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 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 dan mengoptimalkan parameter ini untuk memastikan CoreDNS dapat menyediakan layanan DNS yang tepat untuk kontainer bisnis Anda. Konfigurasi CoreDNS sangat fleksibel. Untuk informasi lebih lanjut, lihat Konfigurasi kebijakan DNS dan resolusi nama domain dan dokumentasi resmi CoreDNS.

Anda juga dapat menggunakan fitur inspeksi terjadwal dan diagnosis kesalahan dari Container Intelligence Service untuk memeriksa file konfigurasi CoreDNS. Jika hasil inspeksi dari Container Intelligence Service menunjukkan pengecualian konfigurasi ConfigMap CoreDNS, periksa setiap item di atas.

Catatan

CoreDNS mungkin mengonsumsi memori ekstra saat menyegarkan konfigurasinya. Setelah Anda memodifikasi ConfigMap CoreDNS, amati status Pod. Jika sebuah Pod kehabisan memori, segera tingkatkan batas memori kontainer dalam Penyebaran CoreDNS. Sesuaikan batas memori menjadi 2 GB.

Nonaktifkan afinitas sesi untuk kube-dns

Afinitas sesi dapat menyebabkan ketidakseimbangan beban signifikan antara replika CoreDNS. Nonaktifkan dengan mengikuti langkah-langkah berikut:

Konsol

  1. Masuk ke Konsol ACK atau . 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, tidak diperlukan tindakan lebih lanjut.

    • Jika bidang sessionAffinity diatur ke ClientIP, lanjutkan dengan 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 verifikasi bahwa bidang sessionAffinity diatur ke None. Nilai None menunjukkan bahwa layanan Kube-DNS berhasil dimodifikasi.

CLI

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

    kubectl -n kube-system get svc kube-dns -o yaml
    • Jika bidang sessionAffinity diatur ke None, tidak diperlukan tindakan lebih lanjut.

    • Jika bidang sessionAffinity diatur ke ClientIP, lanjutkan dengan 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 diatur ke None. Jika nilainya None, perubahan pada layanan Kube-DNS berhasil.

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

Nonaktifkan plugin autopath

Beberapa versi CoreDNS sebelumnya mengaktifkan plugin autopath, yang dapat menyebabkan error resolusi dalam beberapa kasus tepi. Periksa apakah plugin tersebut diaktifkan dan edit file konfigurasi untuk menonaktifkannya. Untuk informasi lebih lanjut, lihat Autopath.

Catatan

Setelah Anda menonaktifkan plugin autopath, QPS 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 dampak bisnisnya.

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

  2. Hapus baris autopath @kubernetes dan simpan file tersebut.

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

Konfigurasikan shutdown yang mulus

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

  • Saat proses CoreDNS akan dihentikan, proses tersebut memasuki mode Lameduck.

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

Konsol

  1. Masuk ke Konsol ACK atau . 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. Dalam file konfigurasi CoreDNS, pastikan plugin health diaktifkan dan atur timeout lameduck ke 15s. Lalu, klik OK.

  5. .:53 {
            errors       
            # Plugin health mungkin memiliki pengaturan berbeda di berbagai versi CoreDNS.
            # Skenario 1: Plugin health tidak diaktifkan secara default.   
            # Skenario 2: Plugin health diaktifkan, tetapi durasi lameduck tidak diatur.
            # health      
            # Skenario 3: Plugin health diaktifkan, dan durasi lameduck diatur ke 5s.   
            # health {
            #     lameduck 5s
            # }      
            # Untuk ketiga skenario tersebut, 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 normal, perubahan berhasil. Jika sebuah Pod CoreDNS menjadi abnormal, Anda dapat mengidentifikasi penyebabnya dengan melihat event dan log-nya.

CLI

  1. Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS.

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

  4. .:53 {
            errors     
            # Plugin health mungkin memiliki pengaturan berbeda di berbagai versi CoreDNS.
            # Skenario 1: Plugin health tidak diaktifkan secara default.     
            # Skenario 2: Plugin health diaktifkan, tetapi durasi lameduck tidak diatur.
            # health
            # Skenario 3: Plugin health diaktifkan, dan durasi lameduck diatur ke 5s.   
            # health {
            #     lameduck 5s
            # }
            # Untuk ketiga skenario tersebut, modifikasi konfigurasi sebagai berikut untuk mengatur parameter lameduck ke 15s.
            health {
                lameduck 15s
            }
            # Plugin lain tidak perlu dimodifikasi dan dihilangkan di sini.
        }
  5. Simpan dan keluar setelah memodifikasi file konfigurasi CoreDNS.

  6. Jika CoreDNS berjalan normal, perubahan berhasil. Jika sebuah Pod CoreDNS menjadi abnormal, Anda dapat mengidentifikasi penyebabnya dengan melihat event dan log-nya.

Konfigurasikan protokol default untuk plugin forward

NodeLocal DNSCache menggunakan TCP untuk berkomunikasi dengan CoreDNS. CoreDNS kemudian berkomunikasi dengan server DNS hulu menggunakan protokol yang sama dengan permintaan masuk. Oleh karena itu, secara default, permintaan dari kontainer bisnis untuk menyelesaikan nama domain di luar kluster melewati NodeLocal DNSCache dan CoreDNS, lalu mencapai server DNS VPC (secara default, 100.100.2.136 dan 100.100.2.138 pada Instance ECS) melalui TCP.

Server DNS VPC memiliki dukungan terbatas untuk TCP. Jika Anda menggunakan NodeLocal DNSCache, Anda perlu memodifikasi konfigurasi CoreDNS untuk memprioritaskan UDP dalam berkomunikasi dengan server DNS hulu guna menghindari anomali resolusi. Kami merekomendasikan Anda memodifikasi file konfigurasi CoreDNS, yaitu ConfigMap bernama coredns di namespace kube-system. Untuk informasi lebih lanjut, lihat Kelola ConfigMaps. Dalam plugin forward, tentukan protokol untuk permintaan hulu sebagai prefer_udp. Setelah modifikasi ini, CoreDNS memprioritaskan UDP untuk berkomunikasi dengan server hulu. Modifikasinya sebagai berikut:

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

Konfigurasikan plugin ready

Versi CoreDNS setelah 1.5.0 harus memiliki plugin ready dikonfigurasi 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 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 operasional dan log Pod CoreDNS. Jika log berisi kata reload, modifikasi berhasil.

Tingkatkan performa dengan plugin multisocket

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

Anda perlu mengaktifkan multisocket menggunakan ConfigMap coredns:

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

NUM_SOCKETS menentukan jumlah soket yang mendengarkan pada port yang sama.

Konfigurasi yang direkomendasikan: Sesuaikan NUM_SOCKETS dengan perkiraan pemanfaatan CPU, batas resource CPU, dan sumber daya kluster yang tersedia. 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, kami merekomendasikan Anda menguji QPS dan beban dengan pengaturan 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.