All Products
Search
Document Center

Container Service for Kubernetes:Konfigurasikan parameter kustom untuk CoreDNS terkelola

Last Updated:Mar 18, 2026

Saat men-deploy aplikasi terkontainerisasi ke kluster, Anda sering perlu melakukan resolusi nama domain eksternal selain nama layanan dalam kluster. Container Service for Kubernetes (ACK) memungkinkan Anda menyesuaikan perilaku DNS untuk CoreDNS terkelola dengan membuat resource kustom CustomDNSConfig (CR). Resource ini dapat digunakan untuk mengarahkan domain tertentu ke server DNS hulu, memetakan hostname ke alamat IP statis, atau mengganti resolver default untuk semua kueri.

Ikhtisar

CoreDNS terkelola ACK menyediakan CustomResourceDefinition (CRD) CustomDNSConfig ber-cakupan kluster dalam grup API networking.alibabacloud.com/v1beta1. Saat Anda membuat atau memperbarui CR default, sebuah controller merekonsiliasikannya ke ConfigMap CoreDNS (Corefile) dan memicu reload langsung—tanpa perlu me-restart pod.

CRD CustomDNSConfig ber-cakupan kluster hanya memiliki satu instans bernama default. Desain ini memastikan konfigurasi DNS otoritatif tunggal per kluster dan mencegah konflik antara beberapa konfigurasi. Untuk memperbarui konfigurasi, terapkan perubahan pada CR yang sudah ada, bukan membuat yang baru.

Cara kerja:

CustomDNSConfig CR (default)
        ↓  controller reconciles
CoreDNS ConfigMap (Corefile)
        ↓  CoreDNS reloads (~20 seconds)
Live DNS resolution updated

Templat CR

Contoh berikut menunjukkan struktur lengkap CR CustomDNSConfig dengan semua bidang yang didukung dan nilai placeholder:

apiVersion: networking.alibabacloud.com/v1beta1
kind: CustomDNSConfig
metadata:
  name: default
  namespace: default
spec:
  zones:
  - name: example.com
    forward:
      protocolStrategy: ""
      transportConfig: {}
      upstreams:
      - xxx.xxx.xxx.xxx     # Alamat IP
      - xxx.xxx.xxx.xxx:53  # IP:port
    hosts:
    - hostName: "a.example.com"
      ipAddress: xxx.xxx.xxx.xxx

Referensi bidang CR

Tabel berikut menjelaskan bidang-bidang dalam CR CustomDNSConfig:

  • spec.zones[].name: string, wajib, default ".". Nama zona DNS. Harus berupa fully qualified domain name (FQDN). Zona khusus "." cocok dengan semua kueri dan merepresentasikan resolver default.

  • spec.zones[].forward.upstreams: []string, opsional. Alamat server DNS hulu. Format: IP atau IP:PORT. Hanya IPv4. Maksimal 15 alamat per zona. Jika tidak diatur, Alibaba Cloud DNS PrivateZone digunakan.

  • spec.zones[].forward.protocolStrategy: string, opsional, default "". Protokol transport. "" menggunakan UDP; tcp memaksa TCP.

  • spec.zones[].forward.transportConfig: object, opsional, default {}. Konfigurasi transport TLS. Tidak dapat diubah.

  • spec.zones[].hosts[].hostName: string, wajib. Hostname yang dipetakan secara statis. Harus mematuhi aturan penamaan DNS.

  • spec.zones[].hosts[].ipAddress: string, wajib. Alamat IPv4 untuk hostname tersebut.

Konsep zona: Zona mendefinisikan namespace DNS. Menentukan example.com akan mencocokkan example.com dan semua subdomain-nya (misalnya, api.example.com). Zona khusus "." cocok dengan semua kueri dan merepresentasikan resolver default.

Plugin forward mengarahkan kueri untuk suatu zona ke server DNS hulu yang ditentukan. Gunakan ini untuk domain privat yang di-host di DNS on-premises atau layanan DNS cloud lainnya.

Plugin hosts menyediakan pemetaan statis dari hostname ke IP tanpa melakukan kueri ke server hulu. Gunakan ini saat Anda memerlukan sejumlah kecil override hostname tetap.

Prasyarat

Batasan

  • Anda hanya dapat membuat satu CR CustomDNSConfig, dan harus diberi nama default. Jika Anda membuat CR dengan nama lain, fase-nya diatur menjadi NotSupported dan konfigurasinya diabaikan.

  • Bidang upstreams hanya mendukung alamat IPv4 (format: IP atau IP:PORT). Maksimal 15 alamat per zona.

  • Bidang ipAddress dalam entri hosts hanya mendukung alamat IPv4.

  • Bidang transportConfig tidak dapat dimodifikasi.

Skenario 1: Konfigurasikan zona kustom

Gunakan skenario ini untuk mengarahkan kueri domain tertentu ke server DNS hulu atau memetakan hostname dalam domain ke alamat IP statis.

Contoh berikut mengonfigurasi dua zona kustom:

  • example.com — mengarahkan semua kueri ke server DNS hulu 100.100.2.136 dan 100.100.2.138 (alamat layanan resolusi DNS internal default; lihat Endpoints untuk detailnya).

  • foo.com — memetakan a.foo.com dan b.foo.com ke alamat IP statis menggunakan plugin hosts.

Langkah 1: Buat manifes CR.

Buat file bernama default.yaml dengan konten berikut:

apiVersion: networking.alibabacloud.com/v1beta1
kind: CustomDNSConfig
metadata:
  name: default   # Harus diberi nama "default"
spec:
  zones:
  - name: example.com
    forward:
      upstreams:
      - 100.100.2.136  # Atur alamat server DNS hulu untuk example.com ke 100.100.2.136 dan 100.100.2.138.
      - 100.100.2.138
  - name: foo.com
    hosts:
    - hostName: "a.foo.com"  # Konfigurasikan alamat IP statis kustom untuk a.foo.com dan b.foo.com dalam zona foo.com.
      ipAddress: 192.168.0.251
    - hostName: "b.foo.com"
      ipAddress: 192.168.0.252
Catatan

100.100.2.136 dan 100.100.2.138 adalah alamat layanan resolusi DNS internal default yang dialokasikan oleh sistem. Untuk informasi selengkapnya, lihat Endpoints.

Langkah 2: Terapkan manifes.

kubectl apply -f default.yaml

Langkah 3: Verifikasi bahwa Corefile telah dihasilkan.

kubectl get customdnsconfig default -o yaml | grep corefile -A 35 -B 1

Output yang diharapkan:

status:
  corefile: |
    example.com:53 {
        prometheus :9153
        forward .  100.100.2.136 100.100.2.138 {
          policy random
          prefer_udp
        }
    ...
    }
    foo.com:53 {
        prometheus :9153
        hosts {
          192.168.0.251    a.foo.com
          192.168.0.252    b.foo.com
          fallthrough
        }
        forward .  /etc/resolv.conf {
          policy random
          prefer_udp
        }
    ...
    }
  ...
--
  corefileHash: 41f7be21cf3022c305091665ed33b1e5
  lastTransitionTime: "2024-09-13T09:07:37Z"
  phase: GenerateSuccess

Status phase: GenerateSuccess mengonfirmasi bahwa CR diterima dan Corefile telah dihasilkan.

Langkah 4: Verifikasi resolusi DNS.

Setelah konfigurasi direload (sekitar 20 detik), jalankan pod uji untuk memastikan kueri DNS terselesaikan dengan benar:

# Uji apakah example.com diselesaikan melalui server DNS hulu
kubectl run -it --rm dns-test --image=busybox:1.28 --restart=Never -- nslookup example.com

# Uji apakah pemetaan host statis berfungsi untuk foo.com
kubectl run -it --rm dns-test --image=busybox:1.28 --restart=Never -- nslookup a.foo.com

Output nslookup harus menampilkan alamat yang Anda konfigurasikan (192.168.0.251 untuk a.foo.com, 192.168.0.252 untuk b.foo.com).

Catatan

Anda dapat memetakan satu hostname ke beberapa alamat IP. Contohnya:

hosts:
  - hostName: "a.example.com"
    ipAddress: 10.0.0.123
  - hostName: "a.example.com"
    ipAddress: 10.0.0.124

Skenario 2: Modifikasi konfigurasi zona default

Gunakan skenario ini untuk mengubah server DNS hulu untuk semua kueri kluster—yaitu, mengganti zona resolver default bawaan (".").

Catatan

spec.zones mengonfigurasi zona kustom. Gunakan spec.zones dengan name: "." untuk mengganti server hulu zona default yang menangani semua kueri kluster.

Langkah 1: Buat manifes CR.

Buat file bernama default.yaml dengan konten berikut:

apiVersion: networking.alibabacloud.com/v1beta1
kind: CustomDNSConfig
metadata:
  name: default   # Harus diberi nama "default"
spec:
  zones:
  - name: .
    forward:
      upstreams:
      - 100.100.2.136  # Alamat server DNS hulu untuk zona default kustom bernama "." adalah 100.100.2.136 dan 100.100.2.138.
      - 100.100.2.138

Langkah 2: Terapkan manifes.

kubectl apply -f default.yaml

Langkah 3: Verifikasi bahwa Corefile telah dihasilkan.

kubectl get customdnsconfig default -o yaml | grep corefile -A 35 -B 1

Output yang diharapkan:

status:
  corefile: |
    .:53 {
        errors
        health {
          lameduck 20s
        }
        ready
        kubeapi {
          kubeconfig /etc/kubernetes/config/managed-coredns.conf
        }
        k8s_event {
          level error warning
        }
    ...
        prometheus :9153
        forward .  100.100.2.136 100.100.2.138 {
          policy random
          prefer_udp
        }
    ...
    }
  corefileHash: 847bf69cc4c97cee965945f45d17c661
  lastTransitionTime: "2024-09-13T09:54:22Z"
  phase: GenerateSuccess

Status phase: GenerateSuccess mengonfirmasi bahwa konfigurasi zona default telah diperbarui.

Langkah 4: Verifikasi resolusi DNS.

Setelah konfigurasi direload (sekitar 20 detik), jalankan pod uji untuk memastikan kueri eksternal diarahkan melalui server hulu yang dikonfigurasi:

kubectl run -it --rm dns-test --image=busybox:1.28 --restart=Never -- nslookup kubernetes.default.svc.cluster.local
Catatan

Setelah Anda membuat atau memodifikasi CR CustomDNSConfig, CoreDNS melakukan reload konfigurasi, yang memakan waktu sekitar 20 detik. Anda dapat menyesuaikan durasi reload dengan mengubah nilai lameduck dalam Corefile. Nilai default-nya adalah 20 detik.

Pemecahan Masalah

CR dengan nama selain default menampilkan NotSupported

Anda hanya dapat membuat satu CR CustomDNSConfig per kluster, dan harus diberi nama default. Jika Anda membuat CR dengan nama berbeda, controller mengatur fasenya menjadi NotSupported dan mengabaikannya.

Contoh berikut menunjukkan perilaku ini.

Langkah 1: Buat file bernama test.yaml dengan nama CR non-default.

apiVersion: networking.alibabacloud.com/v1beta1
kind: CustomDNSConfig
metadata:
  name: test  ## Anda hanya dapat membuat CR CustomDNSConfig bernama default.
spec:
  zones:
  - name: example.com
    forward:
      upstreams:
      - 100.100.2.138
  - name: foo.com
    hosts:
    - hostName: "ah.foo.com"
      ipAddress: 1.1.xx.251
    - hostName: "aha.foo.com"
      ipAddress: 1.1.xx.252

Langkah 2: Terapkan manifes.

kubectl apply -f test.yaml

Langkah 3: Periksa status semua CR CustomDNSConfig.

kubectl get customdnsconfig

Output yang diharapkan:

NAME      PHASE             VERSION                            AGE
default   GenerateSuccess   847bf69cc4c97cee96xxxxxxxxxxx      89m
test      NotSupported                                         9s

CR test menampilkan NotSupported, yang mengonfirmasi bahwa hanya CR bernama default yang diterima. Untuk memperbaikinya, hapus CR yang salah nama dan terapkan konfigurasi Anda ke CR default sebagai gantinya:

kubectl delete customdnsconfig test
kubectl apply -f default.yaml

Informasi event

Controller CoreDNS kustom menyinkronkan informasi event ke namespace default. Gunakan event ini untuk mengonfirmasi sinkronisasi konfigurasi yang berhasil atau mendiagnosis kegagalan.

Jalankan perintah berikut untuk melihat event:

kubectl get events

Output yang diharapkan:

LAST SEEN   TYPE     REASON                  OBJECT                           MESSAGE
45m         Normal   CustomDNSConfigSyncOk   customdnsconfig/default          custom dns config sync to coredns configmap success

Tabel berikut menjelaskan jenis-jenis event:

  • Normal / CustomDNSConfigSyncOk: CR berhasil direkonsiliasi ke ConfigMap CoreDNS. Tidak perlu tindakan.

  • NotSupported: Nama CR bukan default. Konfigurasi ditolak. Hapus CR tersebut dan terapkan ulang dengan name: default.

Untuk memantau status CR secara real-time selama perubahan disebarkan:

kubectl get customdnsconfig default -w