All Products
Search
Document Center

Container Service for Kubernetes:Menyebarkan CoreDNS unmanaged yang stabil dan berkinerja tinggi

Last Updated:Mar 26, 2026

CoreDNS adalah server DNS default dalam kluster ACK. Server ini menangani resolusi semua nama Service di dalam kluster maupun domain eksternal. Karena setiap workload bergantung pada DNS, kegagalan CoreDNS dapat menyebabkan gangguan layanan luas di seluruh kluster.

Dalam mode unmanaged, CoreDNS berjalan seperti workload lainnya. Keandalannya bergantung pada jumlah pod, batas sumber daya, kebijakan penjadwalan, dan distribusi node. Konfigurasi default cocok untuk kluster kecil atau dengan lalu lintas rendah. Untuk workload produksi atau skala besar, sesuaikan pengaturan ini berdasarkan skala dan kebutuhan ketersediaan Anda.

Dampak potensial

Konfigurasi CoreDNS yang salah atau kekurangan sumber daya dapat menyebabkan dua jenis masalah:

  • Ketersediaan: konfigurasi penjadwalan yang tidak tepat menciptakan titik kegagalan tunggal di tingkat node atau zona. Batas sumber daya yang tidak mencukupi menyebabkan pod dievakuasi, sehingga mengganggu layanan DNS.

  • Kinerja: konflik sumber daya dengan workload lain pada node yang sama meningkatkan latensi respons. Beban node yang tinggi menyebabkan kehilangan paket I/O jaringan, sehingga permintaan DNS gagal.

Sesuaikan jumlah pod CoreDNS

Penting

Karena paket UDP tidak memiliki mekanisme pengiriman ulang, proses skala-masuk atau restart pod CoreDNS—terutama ketika cacat IPVS menyebabkan kehilangan paket UDP pada node kluster—dapat memicu timeout atau kegagalan resolusi nama domain di seluruh kluster yang berlangsung hingga lima menit. Untuk detail lebih lanjut, lihat Pemecahan Masalah Masalah Resolusi DNS.

Penting

Jangan gunakan Penyesuaian Otomatis Pod Horizontal (HPA) atau CronHPA untuk mengelola jumlah pod CoreDNS. Pengontrol ini sering melakukan skala-masuk pod, yang menyebabkan kegagalan resolusi.

Nilai tekanan komponen

Sebelum menyesuaikan jumlah replika, nilai tekanan DNS kluster Anda. Alat seperti DNSPerf dapat mengukur beban DNS secara keseluruhan.

Jika Anda tidak dapat mengukur tekanan DNS secara langsung, gunakan panduan berikut:

  • Jalankan minimal 2 pod CoreDNS, masing-masing dengan batas sumber daya minimal 1 core CPU dan 1 GB memori.

  • Dengan NodeLocal DNSCache diaktifkan, setiap core CPU menangani lebih dari 10.000 permintaan per detik (QPS). Pantau penggunaan CPU puncak per pod. Jika ada pod yang secara konsisten menggunakan lebih dari 1 core CPU selama jam sibuk, lakukan skala-keluar.

  • Tanpa data beban, mulailah dengan 1 pod CoreDNS per 8 node kluster sebagai garis dasar konservatif.

Catatan

Skala-keluar pod hanya membantu jika node memiliki sumber daya yang cukup tersedia. Jika node kluster kekurangan memori, menambahkan lebih banyak pod tidak akan menyelesaikan masalah—Anda perlu menambahkan node atau meningkatkan sumber daya per node.

Setelah Anda mengetahui jumlah replika target, gunakan penyesuaian otomatis (disarankan) atau lakukan penskalaan secara manual.

Konfigurasikan penyesuaian otomatis (disarankan)

Komponen cluster-proportional-autoscaler menyesuaikan jumlah replika CoreDNS secara real time berdasarkan ukuran kluster. Berbeda dengan HPA, komponen ini tidak bergantung pada metrik CPU CoreDNS dan tidak melakukan operasi skala-masuk yang dapat mengganggu DNS. Secara default, komponen ini menargetkan 1 pod per 8 node kluster.

Rumus jumlah replika adalah: replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica)). Parameter min dan max menjaga jumlah pod antara 2 dan 100.

Sebarkan autoscaler dengan manifes berikut:

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

Lakukan penskalaan secara manual

Untuk mengatur jumlah replika tertentu secara langsung:

kubectl scale --replicas=<target> deployment/coredns -n kube-system # Ganti <target> dengan jumlah pod target.

Sesuaikan spesifikasi pod CoreDNS

Dalam kluster ACK Pro, konfigurasi default pod CoreDNS adalah:

Sumber dayaBatas default
CPUTidak ada batas
Memori2 GiB

Tetapkan batas CPU menjadi 4096m (minimum 1024m) berdasarkan penggunaan puncak yang Anda amati.

Penting

Mengubah spesifikasi pod CoreDNS akan merestart pod tersebut, yang dapat menyebabkan lonjakan latensi DNS singkat atau kegagalan resolusi. Lakukan operasi ini selama jam sepi.

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

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

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

    image

  4. Ubah konfigurasi CoreDNS dan klik OK.

    image

Sebarkan pada kelompok node khusus

Menjadwalkan pod CoreDNS ke kelompok node khusus mengisolasi mereka dari workload lain dan mencegah konflik sumber daya.

Penting

Menjadwalkan ulang pod CoreDNS ke kelompok node khusus akan merestart pod tersebut, yang dapat menyebabkan lonjakan latensi DNS singkat atau kegagalan resolusi. Lakukan operasi ini selama jam sepi.

Buat kelompok node khusus

Saat membuat kelompok node, ikuti panduan berikut:

  • CoreDNS bersifat intensif jaringan tetapi tidak intensif komputasi. Gunakan instans peningkatan jaringan dengan minimal 4 core CPU dan 8 GB memori.

  • Kelompok node harus memiliki minimal 2 node, karena CoreDNS menjalankan 2 pod secara default.

  • Tambahkan taint dan label untuk mencegah pod lain dijadwalkan ke node ini. Misalnya, gunakan system-addon: system-addon sebagai pasangan kunci-nilai taint sekaligus label. Atur Effect taint menjadi NoSchedule.

Untuk langkah-langkah terperinci, lihat Membuat dan Mengelola Kelompok Node.

Jadwalkan pod CoreDNS ke kelompok node

  1. Pada halaman Add-ons, temukan kartu CoreDNS dan klik Configuration.

  2. Pada bagian NodeSelector, tambahkan label kelompok node khusus.

    Jangan hapus label NodeSelector yang sudah ada.

    image.png

  3. Pada bagian Tolerations, tambahkan toleransi yang sesuai dengan taint kelompok node.

    image.png

  4. Klik OK. Lalu jalankan perintah berikut untuk memastikan pod CoreDNS berjalan pada kelompok node khusus:

    kubectl -n kube-system get pod -o wide --show-labels | grep coredns

Gunakan kebijakan penjadwalan untuk ketersediaan tinggi

Untuk melindungi ketersediaan DNS, CoreDNS menggunakan dua kebijakan penjadwalan secara default:

  • Anti-afinitas pod (tingkat node): mencegah dua pod CoreDNS berjalan pada node yang sama. Jika suatu node gagal, DNS tetap tersedia di node lain.

  • Penjadwalan sadar topologi (tingkat zona): mendistribusikan pod CoreDNS ke berbagai zona ketersediaan. Jika hanya anti-afinitas pod yang digunakan dan kedua pod berada di zona yang sama, gangguan pada zona tersebut tetap mengganggu DNS. Penjadwalan sadar topologi mengatasi hal ini dengan menerapkan distribusi lintas-zona.

Penting

Kebijakan penjadwalan ini hanya berlaku saat pod dijadwalkan awal. Jika konfigurasi node atau zona berubah, buka Konsol ACK, temukan coredns Deployment, lalu klik Redeploy untuk mendistribusikan ulang pod.

Anti-afinitas pod

CoreDNS menggunakan aturan anti-afinitas pod requiredDuringSchedulingIgnoredDuringExecution untuk memastikan tidak ada dua pod CoreDNS yang berbagi node yang sama. Agar berfungsi, kluster Anda harus memiliki minimal 2 node dengan permintaan sumber daya yang cukup tersedia, tidak termasuk:

  • k8s.aliyun.com: true — node dengan penyesuaian otomatis node diaktifkan

  • type: virtual-kubelet — node virtual

  • alibabacloud.com/lingjun-worker: true — Node Lingjun

Konfigurasi afinitas default adalah:

      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              # virtual nodes have this label
              - key: type
                operator: NotIn
                values:
                - virtual-kubelet
              # lingjun worker nodes have this label
              - key: alibabacloud.com/lingjun-worker
                operator: NotIn
                values:
                - "true"
          preferredDuringSchedulingIgnoredDuringExecution:
          - preference:
              matchExpressions:
              # autoscaled nodes have this label
              - key: k8s.aliyun.com
                operator: NotIn
                values:
                - "true"
            weight: 100
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: k8s-app
                operator: In
                values:
                - kube-dns
            topologyKey: kubernetes.io/hostname

Penjadwalan sadar topologi

Secara default, CoreDNS menggunakan penjadwalan sadar topologi untuk menyebarkan pod ke berbagai zona. Pengaturan whenUnsatisfiable: DoNotSchedule menerapkan hal ini—pod tidak akan dijadwalkan jika kondisi keseimbangan zona tidak dapat dipenuhi.

Agar berfungsi secara andal:

  • Kluster Anda harus memiliki node di minimal 2 zona berbeda, masing-masing dengan minimal 1 node yang memiliki sumber daya cukup untuk CoreDNS.

  • Semua node harus memiliki label topology.kubernetes.io/zone (diterapkan secara default). Label yang hilang atau tidak konsisten dapat menyebabkan kegagalan penjadwalan atau distribusi tidak merata.

  • Upgrade kluster Anda ke v1.27 atau lebih baru dan CoreDNS ke v1.12.1.3 atau lebih baru untuk mendapatkan perbaikan matchLabelKeys yang dijelaskan di bawah.

Versi CoreDNS sebelum v1.12.1.3 menggunakan kendala penyebaran topologi berikut:

topologySpreadConstraints:
- labelSelector:
    matchLabels:
      k8s-app: kube-dns
  maxSkew: 1
  topologyKey: topology.kubernetes.io/zone
  whenUnsatisfiable: DoNotSchedule
Penting

Selama pembaruan rolling, konfigurasi ini dapat menghasilkan distribusi akhir pod yang tidak merata. labelSelector menghitung pod dari Set Replika lama dan baru. Untuk memenuhi maxSkew=1, penjadwal lebih memilih zona dengan jumlah total pod lebih sedikit (gabungan lama dan baru). Setelah pod lama dihapus, pod baru mungkin terkonsentrasi hanya di beberapa zona.

CoreDNS v1.12.1.3 dan lebih baru mengatasi hal ini dengan fitur matchLabelKeys yang diperkenalkan di Kubernetes v1.27:

topologySpreadConstraints:
- labelSelector:
    matchLabels:
      k8s-app: kube-dns
  matchLabelKeys:
  - pod-template-hash
  nodeTaintsPolicy: Honor
  maxSkew: 1
  topologyKey: topology.kubernetes.io/zone
  whenUnsatisfiable: DoNotSchedule

Menambahkan matchLabelKeys: [pod-template-hash] membatasi kendala penyebaran hanya pada pod dari Set Replika saat ini, sehingga pembaruan rolling menghasilkan distribusi merata di semua zona.