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:IPatauIP: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;tcpmemaksa 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
-
Plugin CoreDNS terkelola telah diinstal pada versi 1.9.3.20 atau lebih baru. Untuk informasi selengkapnya, lihat Service discovery DNS.
-
Klien kubectl telah terhubung ke kluster. Untuk informasi selengkapnya, lihat Obtain the kubeconfig file of a cluster and use kubectl to connect to the cluster.
Batasan
-
Anda hanya dapat membuat satu CR
CustomDNSConfig, dan harus diberi namadefault. Jika Anda membuat CR dengan nama lain, fase-nya diatur menjadiNotSupporteddan konfigurasinya diabaikan. -
Bidang
upstreamshanya mendukung alamat IPv4 (format:IPatauIP:PORT). Maksimal 15 alamat per zona. -
Bidang
ipAddressdalam entrihostshanya mendukung alamat IPv4. -
Bidang
transportConfigtidak 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 hulu100.100.2.136dan100.100.2.138(alamat layanan resolusi DNS internal default; lihat Endpoints untuk detailnya). -
foo.com— memetakana.foo.comdanb.foo.comke alamat IP statis menggunakan pluginhosts.
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
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).
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 (".").
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
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 bukandefault. Konfigurasi ditolak. Hapus CR tersebut dan terapkan ulang denganname: default.
Untuk memantau status CR secara real-time selama perubahan disebarkan:
kubectl get customdnsconfig default -w