Kueri DNS di ACK mengalir melalui CoreDNS dan NodeLocal DNSCache, dengan parameter yang dapat disesuaikan di setiap lapisan.
Arsitektur resolusi DNS
Resolusi DNS di ACK bergantung pada lokasi aplikasi berjalan dan apakah NodeLocal DNSCache diaktifkan.
Parametertimeoutdanattemptsdalam diagram didefinisikan di bagian Kebijakan resolusi dan Kebijakan caching.
Aplikasi berbasis host (non-containerized)
Aplikasi yang berjalan langsung pada instans Elastic Compute Service (ECS) menggunakan /etc/resolv.conf host, yang mengarah ke server DNS Virtual Private Cloud (VPC).
Pod containerized standar (dnsPolicy: ClusterFirst)
Secara default, pod menggunakan kebijakan ClusterFirst. Semua kueri DNS dialihkan ke layanan CoreDNS dalam kluster.
Pod dengan NodeLocal DNSCache diaktifkan
Saat NodeLocal DNSCache diaktifkan, pod mengirim kueri ke agen caching lokal pada node yang sama. Ini memberikan dua manfaat:
-
Latensi berkurang: Kueri DNS diselesaikan secara lokal, melewati hop jaringan ke CoreDNS.
-
Perlindungan tabel conntrack: Kueri menggunakan agen lokal tanpa membuat entri conntrack, sehingga mengurangi race condition conntrack dan mencegah UDP DNS menghabiskan tabel conntrack.
Kebijakan resolusi
Sisi klien
Parameter /etc/resolv.conf ini diinterpretasikan oleh resolver glibc. Berikut adalah konfigurasi representatif untuk pod dengan ClusterFirst:
nameserver 10.x.x.x # CoreDNS ClusterIP
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5 timeout:5 attempts:2
Nilai default di berbagai 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 |
|
|
Nama domain non-FQDN ditambahkan dengan akhiran |
Tidak ada |
Tidak ada |
|
Tidak ada |
|
Tidak ada |
|
|
Jika nama domain berisi lebih banyak titik 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 saat resolusi gagal. |
2 |
3 |
2 |
2 |
2 |
3 |
|
|
Menanyakan server DNS secara round-robin. |
Nonaktif |
Aktif |
Nonaktif |
Nonaktif |
Nonaktif |
Aktif |
|
|
Jika diaktifkan, resolver membuka ulang socket antara permintaan berturut-turut pada socket yang sama. |
Nonaktif |
Aktif |
Nonaktif |
Nonaktif |
Nonaktif |
Aktif |
^①^ Parameter attempts hanya berlaku ketika server mengembalikan SERVFAIL, NOTIMP, atau REFUSED, atau mengembalikan NOERROR tanpa hasil. Lihat Detail permintaan parameter attempts.
^②^ Server DNS VPC (100.100.2.136 dan 100.100.2.138) adalah server DNS default pada instans ECS. Server ini menyelesaikan nama domain PrivateZone dan nama domain otoritatif.
^③^ CoreDNS ClusterIP adalah IP layanan kube-dns di namespace kube-system. Layanan ini menyelesaikan nama layanan internal serta meneruskan kueri PrivateZone dan kueri otoritatif.
^④^ NodeLocal DNSCache mendengarkan pada 169.254.20.10 di setiap node saat add-on diterapkan.
Lihat resolv.conf untuk opsi tambahan /etc/resolv.conf.
Resolver non-standar
Nilai default glibc di atas hanya berlaku jika kontainer menggunakan glibc. Dua pengecualian umum:
-
Alpine (musl libc): Pustaka bawaan
muslAlpine menggantikan glibc dan berperilaku berbeda (lihat musl libc):-
Tidak menghormati opsi
single-requestdansingle-request-reopendalam/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.
-
Permintaan A dan AAAA konkuren pada socket yang sama memicu kondisi race conntrack pada kernel lama, menyebabkan kehilangan paket intermiten.
-
-
Bahasa dengan resolver bawaan (Go, Node.js): Waktu proses ini sering melewati
/etc/resolv.confdan melakukan resolusi berbeda dari resolver sistem.
Server DNS dalam kluster
Secara default, CoreDNS membaca upstream-nya dari /etc/resolv.conf ECS dan meneruskan permintaan DNS dengan plugin bawaan forward. NodeLocal DNSCache menjalankan instans CoreDNS tersemat dengan konfigurasi penerusan yang sama.
Parameter untuk plugin forward (referensi lengkap):
|
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 kegagalan pemeriksaan kesehatan 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. Menurun secara dinamis berdasarkan waktu koneksi aktual. |
30s |
30s |
|
|
Timeout untuk menerima data dari server upstream. |
2s |
2s |
Kebijakan caching
Sisi klien
Caching sisi klien bervariasi tergantung gambar kontainer dan aplikasi.
Server DNS dalam kluster
Parameter cache untuk CoreDNS dan NodeLocal DNSCache di ACK:
|
Parameter |
Deskripsi |
Nilai default komunitas CoreDNS |
Default NodeLocal DNSCache ACK |
CoreDNS ACK default |
|
success Max TTL |
Waktu hidup maksimum (TTL) untuk hasil sukses yang di-cache. |
3600s |
30s |
30s |
|
success Min TTL |
TTL minimum untuk hasil sukses yang di-cache. |
5s |
5s |
5s |
|
success Capacity |
Jumlah hasil sukses yang di-cache. |
9984 |
9984 |
9984 |
|
denial Max TTL |
TTL maksimum untuk hasil gagal yang di-cache. |
1800s |
5s |
30s |
|
denial Min TTL |
TTL minimum untuk hasil gagal yang di-cache. |
5s |
5s |
5s |
|
denial Capacity |
Jumlah hasil gagal yang di-cache. |
9984 |
9984 |
9984 |
|
ServerError TTL |
TTL saat server 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 kedaluwarsa saat 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, Max TTL, dan Min TTL:
-
Jika TTL Hasil > Max TTL, TTL efektif adalah Max TTL.
-
Jika TTL Hasil < Min TTL, TTL efektif adalah Min TTL.
-
Jika Min TTL ≤ TTL Hasil ≤ Max TTL, TTL efektif adalah TTL Hasil.
Saran optimasi
Sesuaikan perilaku DNS dengan mengedit YAML pod, ConfigMap CoreDNS, atau ConfigMap NodeLocal DNSCache.
Tingkatkan toleransi kesalahan
Dengan dnsPolicy: Default, kontainer mewarisi pengaturan server DNS VPC dari /etc/resolv.conf ECS tetapi tidak mewarisi opsi rotate, single-request-reopen, timeout:2, dan attempts:3. Tanpa opsi ini, fluktuasi jaringan dapat menyebabkan kegagalan DNS intermiten.
Konfigurasi yang diwarisi:
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.138
Tambahkan dnsConfig untuk memulihkan 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:3
Ketersediaan tinggi dengan serve_stale
serve_stale memungkinkan CoreDNS mengembalikan entri cache kedaluwarsa saat server DNS upstream tidak dapat dijangkau, sehingga mencegah kegagalan resolusi akibat gangguan sementara.
serve_stale diaktifkan secara default di edisi unmanaged CoreDNS v1.12.1 dan versi selanjutnya. Lihat RFC-8767.
Format konfigurasi
serve_stale [DURATION] [REFRESH_MODE]
-
DURATION: Durasi entri kedaluwarsa tetap dapat disajikan setelah kedaluwarsa. Default:1h. Entri yang kedaluwarsa lebih lama dari ini tanpa refresh sukses tidak lagi disajikan. -
REFRESH_MODE: Mengontrol cara CoreDNS menangani entri kedaluwarsa:-
verify: Memeriksa keterjangkauan upstream terlebih dahulu, mengembalikan entri segar jika tersedia, atau fallback ke entri kedaluwarsa. Latensi lebih tinggi pada respons kedaluwarsa tetapi menghindari penyajian data usang saat data segar tersedia. -
immediate: Mengembalikan entri kedaluwarsa segera dan merefresh dari upstream di latar belakang. Lebih cepat tetapi mungkin menyajikan data usang.
-
Contoh
Konfigurasi 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:
cache 30 {
...
serve_stale 1h immediate
}
Dengan serve_stale 1h immediate, dalam skenario ekstrem — seperti resolusi DNS selama pembaruan layanan headless iteratif — CoreDNS mungkin mengembalikan entri kedaluwarsa. Jika hal ini sering terjadi, alihkan ke verify.