All Products
Search
Document Center

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

Last Updated:Jun 18, 2026

Konfigurasikan jumlah pod, sumber daya, penjadwalan, dan isolasi node untuk mencegah gangguan CoreDNS dalam mode unmanaged.

Dalam mode unmanaged, ketersediaan dan kinerja CoreDNS bergantung pada jumlah pod, batas sumber daya, penjadwalan, dan distribusi node. Pengaturan default cocok untuk kluster kecil; beban kerja produksi memerlukan penyesuaian.

Dampak potensial

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

  • Ketersediaan: Penjadwalan yang tidak tepat menciptakan titik kegagalan tunggal di tingkat node atau zona. Sumber daya yang tidak mencukupi menyebabkan pengusiran pod dan gangguan DNS.

  • Kinerja: Konflik sumber daya pada node bersama meningkatkan latensi respons. Beban node yang tinggi menyebabkan kehilangan paket I/O dan kegagalan permintaan DNS.

Menyesuaikan jumlah pod CoreDNS

Penting

Karena UDP tidak memiliki pengiriman ulang, skala-masuk atau restart CoreDNS—terutama saat cacat IPVS menyebabkan kehilangan paket—dapat memicu timeout atau kegagalan resolusi DNS di seluruh kluster hingga lima menit. Lihat Pemecahan Masalah Masalah Resolusi DNS.

Penting

Jangan gunakan Penyesuaian Otomatis Pod Horizontal (HPA) atau CronHPA untuk CoreDNS. Skala-masuk yang sering menyebabkan kegagalan resolusi.

Menilai tekanan DNS

Sebelum menyesuaikan jumlah replika, nilai tekanan DNS. Alat seperti DNSPerf dapat mengukur beban DNS.

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

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

  • Permintaan per detik (QPS) resolusi DNS meningkat secara linear seiring konsumsi CPU. Dengan NodeLocal DNSCache, setiap core CPU menangani lebih dari 10.000 permintaan per detik (QPS). Kebutuhan QPS berbagai beban kerja sangat bervariasi, jadi pantau penggunaan CPU puncak setiap pod CoreDNS; jika ada pod yang melebihi satu core selama jam sibuk bisnis, tambah jumlah replika.

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

Catatan

Penambahan replika hanya membantu jika node memiliki sumber daya yang cukup. Jika node kekurangan memori, tambahkan node atau tingkatkan sumber daya per node.

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

Konfigurasi penyesuaian otomatis (disarankan)

cluster-proportional-autoscaler menyesuaikan jumlah replika CoreDNS berdasarkan ukuran kluster. Berbeda dengan HPA, komponen ini tidak bergantung pada metrik CPU atau melakukan skala-masuk yang mengganggu. Rasio default: 1 pod per 8 node.

Rumus jumlah replika: replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica)). Parameter min dan max membatasi jumlah pada rentang 2–100.

Terapkan 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

Skalakan secara manual

Untuk menetapkan jumlah replika tertentu:

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

Menyesuaikan spesifikasi pod CoreDNS

Dalam kluster ACK Pro, konfigurasi pod CoreDNS default adalah:

Sumber daya Batas default
CPU Tidak ada batas
Memori 2 GiB

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

Penting

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

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

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

  3. Di tab Networking, temukan CoreDNS dan klik Configuration.

    image

  4. Ubah konfigurasi CoreDNS dan klik OK.

    image

Terapkan pada kelompok node khusus

Kelompok node khusus mengisolasi CoreDNS dari beban kerja lain dan mencegah konflik sumber daya.

Penting

Menjadwalkan ulang pod CoreDNS akan merestartnya, yang dapat menyebabkan lonjakan latensi DNS singkat atau kegagalan. Lakukan hal ini selama jam sepi.

Buat kelompok node khusus

Saat membuat kelompok node, ikuti panduan berikut:

  • CoreDNS bersifat intensif jaringan, bukan komputasi-intensif. Gunakan instans peningkatan jaringan dengan ukuran yang direkomendasikan 4 core dan memori 8 GB.

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

  • Tambahkan taint dan label untuk mencegah pod lain berjalan di node tersebut. Misalnya, gunakan system-addon: system-addon sebagai pasangan kunci-nilai taint dan label, dengan Effect diatur ke NoSchedule.

Lihat Membuat dan Mengelola Kelompok Node.

Jadwalkan pod CoreDNS ke kelompok node

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

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

    Jangan hapus label NodeSelector yang sudah ada.

    image.png

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

    image.png

  4. Klik OK, lalu verifikasi bahwa pod CoreDNS berjalan di 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 di node yang sama. Jika suatu node gagal, DNS tetap tersedia di node lain.

  • Penjadwalan sadar topologi (tingkat zona): Mendistribusikan pod CoreDNS di berbagai zona ketersediaan, mencegah titik kegagalan tunggal di tingkat zona yang tidak dapat diatasi oleh anti-afinitas pod saja.

Penting

Kebijakan ini hanya berlaku selama penjadwalan awal. Jika konfigurasi node atau zona berubah, temukan coredns Deployment di Konsol ACK dan klik Redeploy.

Anti-afinitas pod

CoreDNS menggunakan aturan anti-afinitas requiredDuringSchedulingIgnoredDuringExecution untuk mencegah dua pod CoreDNS berbagi node. Hal ini memerlukan minimal 2 node dengan sumber daya yang cukup, 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 di berbagai zona. Pengaturan whenUnsatisfiable: DoNotSchedule menegakkan 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 menyebabkan kegagalan penjadwalan atau distribusi tidak merata.

  • Tingkatkan kluster Anda ke v1.27 atau lebih baru dan CoreDNS ke v1.12.1.3 atau lebih baru. Versi kluster sebelumnya tidak mendukung matchLabelKeys, sehingga pembaruan rolling CoreDNS dapat berakhir dengan pod yang tidak merata di berbagai zona dan bahkan meninggalkan beberapa zona tanpa cakupan. Lihat konfigurasi 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

Selisih jumlah pod antara dua zona mana pun tidak boleh melebihi maxSkew (default 1). labelSelector menghitung pod dari Set Replika lama maupun baru, sehingga untuk memenuhi maxSkew=1, penjadwal lebih memilih zona dengan jumlah total pod lebih sedikit. Setelah pod lama dihentikan, pod baru mungkin berkumpul di beberapa zona saja.

CoreDNS v1.12.1.3 dan lebih baru memperbaiki hal ini dengan matchLabelKeys (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 hanya pada Set Replika saat ini, sehingga pembaruan rolling mendistribusikan pod secara merata di berbagai zona.