Topik ini menjelaskan alur kerja resolusi DNS, perilaku sisi klien, dan kebijakan caching sisi server di kluster Alibaba Cloud Container Service for Kubernetes (ACK).
Arsitektur resolusi DNS
Perilaku resolusi DNS di ACK bergantung pada lokasi aplikasi berjalan dan apakah add-on NodeLocal DNSCache aktif.
Untuk detail tentang parameter sepertitimeoutdanattemptsyang dirujuk dalam diagram, lihat Kebijakan resolusi dan Kebijakan caching.
Skenario 1: Aplikasi berbasis host (non-kontainer)
Aplikasi yang berjalan langsung di instans Elastic Compute Service (ECS) menggunakan /etc/resolv.conf host, yang mengarah ke server DNS VPC.

Skenario 2: Pod kontainer standar (dnsPolicy: ClusterFirst)
Secara default, pod menggunakan kebijakan ClusterFirst. Semua kueri DNS dialihkan ke layanan CoreDNS dalam kluster.

Skenario 3: Pod dengan NodeLocal DNSCache diaktifkan
Saat NodeLocal DNSCache aktif, pod mengirim kueri ke agen caching lokal pada node yang sama. Hal ini memberikan dua manfaat:
Latensi berkurang: Kueri DNS diselesaikan secara lokal, melewati hop jaringan ke CoreDNS.
Perlindungan tabel conntrack: Kueri dikirim ke agen lokal tanpa membuat entri baru pada tabel conntrack, sehingga mengurangi kondisi balapan conntrack dan mencegah entri DNS UDP menghabiskan kapasitas tabel conntrack.

Kebijakan resolusi
Sisi klien
Parameter berikut berasal dari /etc/resolv.conf dan diinterpretasikan oleh resolver glibc. Berikut adalah konfigurasi representatif untuk pod standar yang menggunakan ClusterFirst:
nameserver 10.x.x.x # CoreDNS ClusterIP
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5 timeout:5 attempts:2Tabel berikut mencantumkan nilai default di semua lingkungan penerapan.
Parameter | Deskripsi | Nilai default di glibc | ECS | Pod dengan DNSPolicy diatur ke | Pod dengan DNSPolicy diatur ke | Pod yang menggunakan NodeLocal DNSCache | Pod dengan DNSPolicy diatur ke Default dan menggunakan jaringan host |
| Server DNS yang digunakan untuk menyelesaikan nama domain. | Tidak ada | Server DNS VPC② | CoreDNS ClusterIP③ | Server DNS VPC |
| Server DNS VPC |
| Untuk permintaan yang melibatkan nama domain yang bukan fully qualified domain name (FQDN), nama domain tersebut ditambahkan dengan sufiks | Tidak ada | Tidak ada |
| Tidak ada |
| Tidak ada |
| Jika jumlah titik dalam string nama domain lebih besar daripada nilai | 1 | 1 | 5 | 1 | 3 | 1 |
| Timeout untuk satu permintaan resolusi DNS. Satuan: detik. | 5 | 2 | 5 | 5 | 1 | 2 |
| Jumlah maksimum percobaan ulang jika resolusi DNS gagal. | 2 | 3 | 2 | 2 | 2 | 3 |
| Menanyakan server DNS secara round-robin. | Nonaktif | Aktif | Nonaktif | Nonaktif | Nonaktif | Aktif |
| Jika diaktifkan dan dua permintaan dikirim menggunakan socket yang sama, resolver menutup socket setelah permintaan pertama dan membuka socket baru sebelum permintaan kedua. | Nonaktif | Aktif | Nonaktif | Nonaktif | Nonaktif | Aktif |
^①^ Parameter attempts hanya berlaku dalam skenario tertentu: ketika server mengembalikan SERVFAIL, NOTIMP, atau REFUSED, atau ketika server mengembalikan NOERROR tetapi tanpa hasil resolusi. Untuk detailnya, lihat Detail permintaan parameter Attempts.
^②^ Server DNS VPC adalah server DNS default yang dikonfigurasi pada instans ECS. Alamat IP-nya adalah 100.100.2.136 dan 100.100.2.138. Server ini menyelesaikan nama domain di PrivateZone dan nama domain otoritatif.
^③^ CoreDNS ClusterIP adalah alamat IP layanan kube-dns di namespace kube-system. Layanan ini menyelesaikan nama domain layanan internal dan meneruskan permintaan resolusi untuk PrivateZone dan nama domain otoritatif.
^④^ IP NodeLocal DNSCache adalah 169.254.20.10. Saat add-on NodeLocal DNSCache diterapkan, layanan ini mendengarkan pada alamat IP ini di setiap node.
Untuk opsi tambahan /etc/resolv.conf, lihat resolv.conf.Resolver non-standar
Nilai default glibc di atas hanya berlaku ketika kontainer menggunakan glibc. Dua pengecualian umum:
Alpine (musl libc): Pustaka bawaan
muslAlpine menggantikan glibc dan berperilaku berbeda dalam beberapa hal: Untuk detail perilaku resolusi musl, lihat musl libc.Tidak mematuhi opsi
single-requestdansingle-request-reopendi/etc/resolv.conf.Alpine 3.3 dan versi sebelumnya tidak mendukung parameter
searchatau domain pencarian, yang menyebabkan penemuan layanan gagal.Permintaan konkuren ke beberapa server DNS membuat optimasi NodeLocal DNSCache tidak efektif.
Menggunakan socket yang sama untuk meminta rekaman A dan AAAA secara konkuren memicu kondisi balapan conntrack pada versi kernel lama, menyebabkan kehilangan paket secara intermiten.
Bahasa dengan resolver bawaan (Go, Node.js): Waktu proses ini sering melewati
/etc/resolv.confsepenuhnya dan menunjukkan perilaku resolusi yang berbeda dari resolver sistem.
Server DNS dalam kluster
Secara default, CoreDNS membaca upstream-nya dari /etc/resolv.conf ECS dan menggunakan Plugin forward bawaan untuk meneruskan permintaan DNS. NodeLocal DNSCache menjalankan instance CoreDNS tersemat dan menggunakan konfigurasi penerusan yang sama.
Tabel berikut mencantumkan parameter yang mengontrol kebijakan resolusi Plugin forward. Untuk referensi lengkap, lihat Forward.
Parameter | Deskripsi | Nilai default CoreDNS | Nilai default NodeLocal DNSCache |
| Menggunakan UDP untuk berkomunikasi dengan server upstream jika memungkinkan. | Aktif | Nonaktif |
| Memaksa TCP untuk semua komunikasi upstream. | Nonaktif | Aktif |
| Jumlah pemeriksaan kesehatan gagal berturut-turut sebelum server upstream ditandai tidak sehat. | 2 | 2 |
| Durasi koneksi ke server upstream tetap terbuka. | 10s | 10s |
| Kebijakan pemilihan server upstream. |
|
|
| Interval pemeriksaan kesehatan. | 0,5s | 0,5s |
| Jumlah maksimum koneksi upstream konkuren. | Tidak ada | Tidak ada |
| Timeout untuk menghubungkan ke server upstream. Nilainya berkurang secara dinamis berdasarkan waktu koneksi aktual. | 30s | 30s |
| Timeout untuk menunggu data dari server upstream. | 2s | 2s |
Kebijakan caching
Sisi klien
Caching sisi klien bervariasi tergantung pada gambar kontainer dan aplikasi. Kebijakan efektif bergantung pada konfigurasi spesifik Anda.
Server DNS dalam kluster
Tabel berikut mencantumkan parameter cache untuk CoreDNS dan NodeLocal DNSCache di ACK.
Parameter | Deskripsi | Nilai default komunitas CoreDNS | NodeLocal DNSCache default ACK | CoreDNS ACK default |
success Max TTL | Waktu hidup maksimum (TTL) untuk hasil resolusi DNS sukses yang dicache. | 3600s | 30s | 30s |
success Min TTL | TTL minimum untuk hasil resolusi DNS sukses yang dicache. | 5s | 5s | 5s |
success Capacity | Jumlah hasil resolusi DNS sukses yang dicache. | 9984 | 9984 | 9984 |
denial Max TTL | TTL maksimum untuk hasil resolusi DNS gagal yang dicache. | 1800s | 5s | 30s |
denial Min TTL | TTL minimum untuk hasil resolusi DNS gagal yang dicache. | 5s | 5s | 5s |
denial Capacity | Jumlah hasil resolusi DNS gagal yang dicache. | 9984 | 9984 | 9984 |
ServerError TTL | TTL yang diterapkan saat server DNS upstream tidak tersedia. | 5s | 0s (default adalah 5s untuk Helm Chart NodeLocal DNSCache versi sebelum 1.5.0) | 0s (default adalah 5s untuk versi CoreDNS sebelum 1.8.4.2) |
serve_stale | Memungkinkan CoreDNS menyajikan entri cache yang telah kadaluarsa saat server DNS upstream tidak dapat dijangkau. | Nonaktif | Aktif (nonaktif secara default untuk Helm Chart NodeLocal DNSCache versi sebelum 1.5.0) | Aktif (nonaktif secara default untuk versi CoreDNS sebelum 1.12.1) |
TTL efektif ditentukan oleh TTL hasil resolusi, Max TTL, dan Min TTL sebagai berikut:
Jika Result TTL > Max TTL, TTL efektif adalah Max TTL.
Jika Result TTL < Min TTL, TTL efektif adalah Min TTL.
Jika Min TTL ≤ Result TTL ≤ Max TTL, TTL efektif adalah Result TTL.
Saran optimasi
Atur perilaku DNS dengan mengedit YAML pod, ConfigMap CoreDNS, atau ConfigMap NodeLocal DNSCache.
Tingkatkan toleransi kesalahan
Saat dnsPolicy: Default diatur pada pod, kontainer mewarisi pengaturan server DNS VPC dari /etc/resolv.conf instans ECS. Namun, kontainer tersebut tidak mewarisi opsi rotate, single-request-reopen, timeout:2, dan attempts:3. Tanpa opsi ini, fluktuasi jaringan dapat menyebabkan kegagalan resolusi DNS secara intermiten.
Berikut adalah konfigurasi yang diwariskan:
apiVersion: v1
kind: Pod
metadata:
name: example
namespace: default
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/example-ns/example:v1
name: example
# Nilai dnsPolicy dalam YAML Pod adalah Default.
dnsPolicy: Default
# File /etc/resolv.conf dalam kontainer saat ini.
# cat /etc/resolv.conf
nameserver 100.100.2.136
nameserver 100.100.2.138Tambahkan dnsConfig untuk mengembalikan opsi toleransi kesalahan yang hilang:
apiVersion: v1
kind: Pod
metadata:
name: example
namespace: default
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/example-ns/example:v1
name: example
# Nilai dnsPolicy dalam YAML pod adalah Default.
dnsPolicy: Default
# Tambahkan konfigurasi toleransi kesalahan berikut.
dnsConfig:
options:
- name: timeout
value: "2"
- name: attempts
value: "3"
- name: rotate
- name: single-request-reopen
# Setelah modifikasi, redeploy pod. Parameter options ditambahkan ke /etc/resolv.conf dalam kontainer.
# cat /etc/resolv.conf
nameserver 100.100.2.136
nameserver 100.100.2.138
options rotate single-request-reopen timeout:2 attempts:3Ketersediaan tinggi dengan serve_stale
Fitur serve_stale memungkinkan CoreDNS mengembalikan entri cache yang telah kadaluarsa saat server DNS upstream tidak dapat dijangkau. Hal ini mencegah kegagalan resolusi akibat gangguan sementara pada upstream.
serve_stale diaktifkan secara default di edisi unmanaged CoreDNS v1.12.1 dan versi selanjutnya. Untuk spesifikasi RFC, lihat RFC-8767.Format konfigurasi
serve_stale [DURATION] [REFRESH_MODE]DURATION: Durasi entri yang telah kadaluarsa tetap memenuhi syarat untuk disajikan setelah masa berlakunya habis. Nilai default adalah1h. Jika entri telah kadaluarsa lebih lama dari durasi ini tanpa refresh yang berhasil, CoreDNS berhenti menyajikannya.REFRESH_MODE: Mengontrol cara CoreDNS menangani entri yang telah kadaluarsa:verify: Pertama-tama memverifikasi bahwa layanan DNS upstream dapat dijangkau, lalu mengembalikan hasil ke klien — menggunakan entri segar jika upstream merespons, atau kembali ke entri yang telah kadaluarsa jika tidak. Hal ini meningkatkan latensi pada respons kadaluarsa tetapi mencegah penyajian entri usang saat entri segar tersedia.immediate: Mengembalikan entri yang telah kadaluarsa ke klien segera, lalu memeriksa upstream di latar belakang. Hal ini memberikan respons lebih cepat tetapi mungkin menyajikan data usang jika upstream telah diperbarui.
Contoh
Konfigurasi berikut adalah default di edisi unmanaged CoreDNS v1.12.1.2 dan versi selanjutnya:
cache 30 {
...
serve_stale 30s verify
}Konfigurasi default untuk edisi unmanaged CoreDNS v1.12.1.1-4035d7a99-aliyun adalah:
cache 30 {
...
serve_stale 1h immediate
}Dengan serve_stale 1h immediate, dalam skenario ekstrem — seperti saat klien melakukan resolusi DNS selama pembaruan iteratif layanan headless — CoreDNS mungkin mengembalikan entri yang telah kadaluarsa. Jika hal ini terjadi secara sering, ubah kebijakan menjadi verify.