全部产品
Search
文档中心

Container Service for Kubernetes:Konfigurasi CoreDNS yang tidak dikelola

更新时间:Nov 11, 2025

ACK menggunakan CoreDNS sebagai server DNS default. Topik ini menjelaskan plugin umum untuk CoreDNS dan memberikan petunjuk konfigurasi untuk berbagai skenario.

Prasyarat

Deskripsi skenario

Topik ini menjelaskan skenario di mana CoreDNS dalam klaster ACK digunakan untuk resolusi nama domain. Dalam skenario ini, kebijakan dnsPolicy: ClusterFirst digunakan, seperti yang ditunjukkan dalam contoh konfigurasi berikut:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  containers:
  - image: alpine
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alpine
  dnsPolicy: ClusterFirst

Untuk informasi selengkapnya mengenai konfigurasi dnsPolicy dan skenarionya, lihat Konfigurasi kebijakan DNS dan resolusi nama domain.

Konfigurasi CoreDNS default

Sebuah klaster ACK mencakup item konfigurasi CoreDNS item konfigurasi di namespace kube-system. CoreDNS mengaktifkan dan mengonfigurasi plugin berdasarkan item konfigurasi ini. Item konfigurasi tersebut dapat sedikit berbeda antar versi CoreDNS. Sebelum memodifikasi konfigurasi, rujuk ke dokumentasi resmi CoreDNS. Kode berikut menunjukkan file konfigurasi default untuk CoreDNS 1.6.2:

  Corefile: |
    .:53 {
        errors
        log
        health {
           lameduck 15s
        }
        ready
        kubernetes {{.ClusterDomain}} in-addr.arpa ip6.arpa {
          pods verified
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . /etc/resolv.conf {
              prefer_udp
        }
        cache 30
        loop
        reload
        loadbalance
    }
Catatan

Dalam file konfigurasi, ClusterDomain merujuk pada nama domain klaster yang Anda tentukan saat membuat klaster. Nilai default-nya adalah cluster.local.

Parameter

Deskripsi

errors

Mengirim pesan kesalahan ke standar output.

health

Menampilkan status kesehatan CoreDNS. Port pendengar default adalah 8080. Ini biasanya digunakan untuk pemeriksaan kesehatan. Anda dapat memeriksa status kesehatan di http://localhost:8080/health.

ready

Menampilkan status plugin CoreDNS. Port pendengar default adalah 8181. Ini biasanya digunakan untuk pemeriksaan kesiapan. Anda dapat memeriksa status kesiapan di http://localhost:8181/ready. Ketika semua plugin berjalan, status kesiapan adalah 200.

kubernetes

Plugin Kubernetes CoreDNS. Plugin ini menyediakan resolusi layanan di dalam klaster.

prometheus

Antarmuka data metrik untuk CoreDNS. Anda dapat memperoleh data pemantauan dalam format Prometheus di http://localhost:9153/metrics.

forward (atau proxy)

Meneruskan permintaan kueri nama domain ke server DNS yang telah ditentukan sebelumnya. Dalam konfigurasi default, jika sebuah nama domain tidak berada dalam domain Kubernetes, permintaan akan diteruskan ke resolver yang telah ditentukan (/etc/resolv.conf). Secara default, konfigurasi /etc/resolv.conf dari host digunakan.

cache

Cache DNS.

loop

Mendeteksi loop. Jika loop terdeteksi, CoreDNS berhenti.

reload

Memungkinkan pemuatan ulang otomatis file Corefile yang berubah. Setelah Anda mengedit konfigurasi ConfigMap, tunggu dua menit agar perubahan berlaku.

loadbalance

Pemimbang beban DNS round-robin. Plugin ini dapat mengacak urutan rekaman A, AAAA, dan MX dalam tanggapan.

multisocket

CoreDNS v1.12.1 menambahkan plugin multisocket. Mengaktifkan plugin ini memungkinkan CoreDNS menggunakan beberapa soket untuk mendengarkan port yang sama secara bersamaan. Hal ini meningkatkan kinerja CoreDNS dalam skenario penggunaan CPU tinggi. Untuk informasi selengkapnya, lihat Konfigurasi plugin multisocket untuk meningkatkan kinerja penguraian CoreDNS.

Konfigurasi CoreDNS yang diperluas

Anda dapat memperluas konfigurasi CoreDNS untuk mendukung skenario berikut:

  • Skenario 1: Aktifkan layanan log

    Untuk mencatat setiap permintaan resolusi nama domain yang diproses oleh CoreDNS, aktifkan plugin log. Tambahkan log ke Corefile, seperti yang ditunjukkan dalam contoh konfigurasi berikut:

      Corefile: |
        .:53 {
            errors
            log
            health {
               lameduck 15s
            }
            ready
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . /etc/resolv.conf {
                  prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }
  • Skenario 2: Gunakan server DNS kustom untuk nama domain tertentu

    Untuk menyelesaikan nama domain dengan akhiran example.com menggunakan server DNS yang dikelola sendiri (alamat IP 10.10.0.10), Anda dapat mengonfigurasi blok server terpisah untuk nama domain tersebut. Contoh konfigurasi berikut menunjukkan contohnya:

    example.com:53 {
      errors
      cache 30
      forward . 10.10.0.10 {
      prefer_udp
      }
    }

    Konfigurasi lengkapnya adalah sebagai berikut:

      Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            ready
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . /etc/resolv.conf {
              prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }
        example.com:53 {
            errors
            cache 30
            forward . 10.10.0.10 {
            prefer_udp
            }
        }
  • Skenario 3: Gunakan server DNS yang dikelola sendiri untuk semua nama domain eksternal

    Jika nama domain yang diselesaikan oleh DNS lokal Anda tidak memiliki akhiran yang sama, Anda dapat mengonfigurasi CoreDNS untuk menggunakan server DNS yang dikelola sendiri untuk semua nama domain eksternal. Dalam kasus ini, Anda harus meneruskan permintaan untuk nama domain yang tidak dapat diselesaikan oleh DNS lokal Anda ke DNS Alibaba Cloud. Jangan langsung memodifikasi file /etc/resolv.conf pada instance ECS klaster. Misalnya, jika server DNS yang dikelola sendiri Anda berada di alamat IP 10.10.0.10 dan 10.10.0.20, Anda dapat memodifikasi parameter forward, seperti yang ditunjukkan dalam contoh konfigurasi berikut:

      Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            ready
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . 10.10.0.10 10.10.0.20 {
              prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }
  • Skenario 4: Sesuaikan hosts

    Untuk memetakan nama domain tertentu ke alamat IP, seperti menetapkan alamat IP 127.0.0.1 ke www.example.com, Anda dapat menggunakan plugin hosts, seperti yang ditunjukkan dalam contoh konfigurasi berikut:

      Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            ready
            
            hosts {
              127.0.0.1 www.example.com
              fallthrough
            }
          
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . /etc/resolv.conf {
              prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }
    Penting

    Anda harus mengonfigurasi fallthrough. Jika tidak, resolusi nama domain untuk host yang tidak disesuaikan akan gagal.

  • Skenario 5: Akses layanan di dalam klaster dari luar klaster

    Untuk memungkinkan proses yang berjalan pada node klaster (instance ECS) mengakses layanan di dalam klaster, Anda dapat mengatur nameserver dalam file /etc/resolv.conf setiap instance ECS ke ClusterIP kube-dns. Namun, kami sangat menyarankan agar Anda tidak langsung memodifikasi file /etc/resolv.conf pada instance ECS.

    Untuk skenario jaringan internal, pendekatan yang lebih baik adalah mengekspos layanan di dalam klaster menggunakan SLB internal-facing. Kemudian, di Konsol Alibaba Cloud DNS PrivateZone, tambahkan rekaman A yang menyelesaikan nama domain layanan ke alamat IP internal SLB.

  • Skenario 6: Gunakan nama domain terpadu untuk mengakses layanan atau lakukan resolusi CNAME untuk nama domain di dalam klaster

    Anda dapat menggunakan nama domain terpadu, seperti foo.example.com, untuk mengakses layanan Anda dari Internet, jaringan internal, dan dari dalam klaster. Hal ini dicapai sebagai berikut:

    • Layanan foo.default.svc.cluster.local di dalam klaster diekspos menggunakan SLB yang menghadap internet. Nama domain foo.example.com dikonfigurasi untuk diselesaikan ke alamat IP publik SLB ini.

    • Layanan foo.default.svc.cluster.local di dalam klaster diekspos melalui SLB internal-facing. Di VPC, Anda dapat menggunakan Alibaba Cloud DNS PrivateZone untuk menyelesaikan foo.example.com ke alamat IP SLB internal-facing ini. Untuk informasi selengkapnya, lihat Skenario 4: Sesuaikan hosts.

    • Di dalam klaster, Anda dapat menggunakan plugin rewrite untuk membuat rekaman CNAME yang memetakan foo.example.com ke foo.default.svc.cluster.local, seperti yang ditunjukkan dalam contoh konfigurasi berikut:

        Corefile: |
          .:53 {
              errors
              health {
                 lameduck 15s
              }
              ready
              
              rewrite stop {
                name exact foo.example.com foo.default.svc.cluster.local
                answer name foo.default.svc.cluster.local foo.example.com 
              }
      
              kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                fallthrough in-addr.arpa ip6.arpa
                ttl 30
              }
              prometheus :9153
              forward . /etc/resolv.conf {
                prefer_udp
              }
              cache 30
              loop
              reload
              loadbalance
          }
  • Skenario 7: Cegah CoreDNS mengembalikan tanggapan terhadap kueri untuk rekaman AAAA (IPv6)

    Jika kontainer aplikasi tidak memerlukan rekaman AAAA, Anda dapat mengonfigurasi CoreDNS untuk mencegat kueri untuk rekaman AAAA dan mengembalikan tanggapan kosong (NODATA). Hal ini mengurangi lalu lintas jaringan yang tidak perlu. Contoh konfigurasi berikut menunjukkan cara melakukannya:

      Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            # Tambahkan baris berikut untuk plugin Template. Biarkan data lainnya tidak berubah.
            template IN AAAA .
        
        }
  • Skenario 8: Aktifkan fitur layanan multi-klaster ACK One

    Catatan

    Fitur layanan multi-klaster ACK One didukung di CoreDNS 1.9.3 dan versi yang lebih baru. Jika komponen CoreDNS Anda berada di versi sebelum 1.9.3, Anda harus melakukan peningkatan CoreDNS sebelum dapat mengaktifkan fitur ini. Untuk informasi selengkapnya, lihat Tingkatkan CoreDNS yang tidak dikelola secara otomatis dan Tingkatkan CoreDNS yang tidak dikelola secara manual.

    1. Jalankan perintah berikut untuk mengedit item konfigurasi CoreDNS:

      kubectl edit configmap/coredns -n kube-system
    2. Tambahkan baris multicluster clusterset.local di atas baris yang berisi kubernetes. Hal ini mengaktifkan plugin multicluster dan menetapkan akhiran nama domain untuk layanan multi-klaster menjadi clusterset.local.

      Corefile: |
          .:53 {
              # Konten lainnya dihilangkan.
              # Tambahkan baris berikut.
              multicluster clusterset.local
              kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                fallthrough in-addr.arpa ip6.arpa
                ttl 30
              }
              # Konten lainnya dihilangkan.
          }
    3. Setelah melakukan perubahan, tekan tombol Esc, masukkan :wq!, lalu tekan tombol Enter untuk menyimpan file konfigurasi dan keluar dari mode edit.

  • Skenario 9: Tentukan server DNS hulu yang berbeda untuk nama domain eksternal yang berbeda

    Prasyarat:

    CoreDNS v1.11.3 atau yang lebih baru.

    Metode konfigurasi:

    Dalam satu blok server, Anda dapat menggunakan plugin forward untuk mengonfigurasi server DNS hulu yang berbeda untuk nama domain yang berbeda. Untuk informasi selengkapnya mengenai parameter plugin forward, lihat forward.

    Contoh konfigurasi:

    Corefile: |
        .:53 {
            # Konten lainnya dihilangkan.
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            # Tentukan 10.20.0.1 sebagai server DNS untuk foo.com.
            forward foo.com 10.20.0.1
            # Tentukan 10.30.0.1 sebagai server DNS untuk bar.com.
            forward bar.com 10.30.0.1
            # Untuk nama domain lainnya, gunakan server DNS yang ditentukan dalam /etc/resolv.conf pada node. 
            forward . /etc/resolv.conf
            # Konten lainnya dihilangkan.
        }