Topik ini menjelaskan kebijakan resolusi nama domain dan caching untuk pod kontainer dalam kluster Kubernetes.
Pipeline Resolusi DNS
Gambar berikut menunjukkan pipeline resolusi nama domain untuk tiga jenis penerapan aplikasi.
Untuk informasi mengenai istilah seperti timeout dan attempts pada gambar, lihat bagian Kebijakan Resolusi dan Kebijakan Caching.
Aplikasi non-kontainer dijalankan langsung pada Instance ECS.
Contoh: Sebuah aplikasi dijalankan pada Instance ECS.

Aplikasi berbasis kontainer dijalankan di Kubernetes. Pod menggunakan kebijakan DNS ClusterFirst.
Contoh: Sebuah aplikasi dijalankan dalam pod kontainer Kubernetes.

Aplikasi berbasis kontainer dijalankan di Kubernetes. Pod menggunakan NodeLocal DNSCache.
Contoh: Sebuah aplikasi dijalankan dalam pod kontainer Kubernetes, dan NodeLocal DNSCache diterapkan.

Kebijakan Resolusi
Client Side
Dalam kebanyakan kasus, aplikasi melakukan resolusi nama domain menggunakan antarmuka yang disediakan oleh Glibc. Tabel berikut menjelaskan parameter resolusi nama domain yang dapat dikonfigurasi dalam file /etc/resolv.conf yang digunakan oleh Glibc.
Parameter | Deskripsi | Nilai default di Glibc | ECS | Pod dengan DNSPolicy diatur ke ClusterFirst | Pod dengan DNSPolicy diatur ke Default | Pod yang menggunakan NodeLocal DNSCache | Pod dengan DNSPolicy diatur ke Default dan menggunakan jaringan host |
| Server DNS yang digunakan untuk melakukan resolusi nama domain. | Kosong | Server DNS VPC② | ClusterIP CoreDNS③ | Server DNS VPC |
| Server DNS VPC |
| Untuk permintaan yang melibatkan nama domain yang bukan nama domain berkualifikasi penuh (FQDN), nama domain tersebut ditambahkan dengan akhiran | Kosong | Kosong | <ns>.svc.cluster.local svc.cluster.local cluster.local | Kosong | <ns>.svc.cluster.local svc.cluster.local cluster.local | Kosong |
| Jika jumlah titik dalam string nama domain lebih besar daripada nilai ndots, nama domain tersebut dianggap sebagai FQDN dan langsung diselesaikan. Jika jumlah titik kurang dari nilai ndots, nama domain tersebut ditambahkan dengan akhiran pencarian sebelum kueri dilakukan. | 1 | 1 | 5 | 1 | 3 | 1 |
| Periode timeout untuk satu permintaan resolusi nama domain, dalam detik. | 5 | 2 | 5 | 5 | 1 | 2 |
| Jumlah percobaan ulang jika resolusi nama domain gagal. | 2 | 3 | 2 | 2 | 2 | 3 |
| Menanyakan server DNS secara round-robin. | dimatikan | Diaktifkan | Dimatikan | Dimatikan | Dimatikan | Diaktifkan |
| Jika opsi ini diaktifkan dan dua permintaan dikirim menggunakan soket yang sama, resolver menutup soket setelah mengirim permintaan pertama dan membuka soket baru sebelum mengirim permintaan kedua. | dimatikan | Diaktifkan | Dimatikan | Dimatikan | dimatikan | Diaktifkan |
①Parameter attempts hanya berlaku dalam skenario tertentu, seperti ketika server mengembalikan SERVFAIL, NOTIMP, atau REFUSED, atau ketika server mengembalikan NOERROR tetapi tanpa hasil resolusi. Untuk informasi selengkapnya, lihat detail permintaan parameter attempts.
②Server DNS VPC adalah server DNS default yang dikonfigurasi pada Instance ECS. Alamat IP-nya adalah 100.100.2.136 dan 100.100.2.138. Server ini bertanggung jawab untuk menyelesaikan nama domain di PrivateZone dan nama domain otoritatif.
③ClusterIP CoreDNS adalah alamat IP layanan kube-dns yang disediakan oleh penerapan CoreDNS default di namespace kube-system dalam kluster Kubernetes. Layanan ini bertanggung jawab untuk menyelesaikan nama domain layanan internal dan meneruskan permintaan resolusi untuk PrivateZone dan nama domain otoritatif.
④IP NodeLocal DNSCache adalah 169.254.20.10. Ketika komponen NodeLocal DNSCache diterapkan, komponen tersebut mendengarkan pada alamat IP ini di setiap node.
Untuk informasi selengkapnya tentang konfigurasi resolv.conf, lihat resolv.conf.
Dalam beberapa kasus, kebijakan resolusi nama domain di sisi klien mungkin berbeda dari konfigurasi di atas:
Jika Anda menggunakan Alpine sebagai gambar kontainer, pustaka Musl bawaannya menggantikan Glibc, yang menyebabkan perbedaan signifikan dalam perilaku resolusi. Misalnya:
Alpine tidak mematuhi opsi single-request dan single-request-reopen dalam /etc/resolv.conf.
Versi Alpine 3.3 dan sebelumnya tidak mendukung parameter `search` atau domain pencarian, sehingga penemuan layanan tidak berfungsi.
Permintaan bersamaan ke beberapa server DNS yang dikonfigurasi dalam /etc/resolv.conf menyebabkan optimasi NodeLocal DNSCache menjadi tidak efektif.
Menggunakan soket yang sama untuk meminta rekaman A dan AAAA secara bersamaan memicu konflik port sumber Conntrack pada versi kernel lama, yang menyebabkan kehilangan paket.
CatatanUntuk informasi selengkapnya tentang perilaku resolusi, lihat musl libc.
Jika Anda menggunakan bahasa pemrograman seperti Golang atau NodeJS, aplikasi mungkin menggunakan resolver nama domain bawaan bahasa tersebut, yang juga memiliki perilaku yang sangat berbeda.
In-cluster DNS Servers
Secara default, file /etc/resolv.conf CoreDNS menggunakan konfigurasi ECS. Namun, CoreDNS menggunakan Plugin Forward bawaan untuk meneruskan permintaan DNS.
NodeLocal DNSCache menggunakan CoreDNS bawaan untuk penerusan layanan DNS. Metode konfigurasinya sama dengan CoreDNS.
Tabel berikut menjelaskan parameter yang mengontrol kebijakan resolusi Plugin Forward. Untuk informasi selengkapnya tentang Plugin Forward CoreDNS, lihat Forward.
Parameter | Deskripsi | Nilai default CoreDNS | Nilai default NodeLocal DNSCache |
| Lebih memilih menggunakan UDP untuk berkomunikasi dengan server hulu. | Diaktifkan | Dimatikan |
| Memaksa menggunakan TCP untuk berkomunikasi dengan server hulu. | Dimatikan | Diaktifkan |
| Jumlah pemeriksaan kesehatan gagal berturut-turut sebelum server hulu dianggap tidak sehat. | 2 | 2 |
| Menjaga koneksi ke server hulu selama 10 detik. | 10s | 10s |
| Kebijakan untuk memilih server hulu. | random | random |
| Interval pemeriksaan kesehatan. | 0,5s | 0,5s |
| Jumlah maksimum koneksi bersamaan ke server hulu. | Tidak ada | Tidak ada |
| Timeout untuk menghubungkan ke server hulu. | 30s. Nilai ini berkurang secara dinamis berdasarkan waktu aktual yang digunakan. | 30s. Nilai ini berkurang secara dinamis berdasarkan waktu aktual yang digunakan. |
| Timeout untuk menunggu data dari server hulu. | 2s | 2s |
Kebijakan Caching
Client Side
Kebijakan caching di sisi klien bervariasi tergantung pada kontainer dan aplikasi. Kebijakan caching aktual tergantung pada konfigurasi spesifik Anda.
In-cluster DNS Servers
Parameter | Deskripsi | Konfigurasi default komunitas CoreDNS | Konfigurasi default ACK NodeLocal DNSCache | Konfigurasi default ACK CoreDNS |
success Max TTL | Waktu hidup maksimum (TTL) untuk cache hasil resolusi nama domain yang berhasil. | 3600s | 30s | 30s |
success Min TTL | TTL minimum untuk cache hasil resolusi nama domain yang berhasil. | 5s | 5s | 5s |
success Capacity | Jumlah hasil resolusi nama domain yang berhasil untuk di-cache. | 9984 | 9984 | 9984 |
denial Max TTL | TTL maksimum untuk cache hasil resolusi nama domain yang gagal. | 1800s | 5s | 30s |
denial Min TTL | TTL minimum untuk cache hasil resolusi nama domain yang gagal. | 5s | 5s | 5s |
denial Capacity | Jumlah hasil resolusi nama domain yang gagal untuk di-cache. | 9984 | 9984 | 9984 |
ServerError TTL | TTL untuk hasil resolusi ketika server DNS hulu mengalami anomali. | 5s | 0s (Defaultnya 5s untuk versi Helm Chart NodeLocal DNSCache sebelum 1.5.0) | 0s (Defaultnya 5s untuk versi CoreDNS sebelum 1.8.4.2) |
serve_stale | Mengizinkan penggunaan cache lokal yang telah kedaluwarsa ketika server DNS hulu tidak dapat dihubungi. | dimatikan | Diaktifkan (Dimatikan secara default untuk versi Helm Chart NodeLocal DNSCache sebelum 1.5.0) | Dimatikan secara default untuk versi CoreDNS sebelum 1.12.1. Diaktifkan secara default untuk CoreDNS 1.12.1 dan yang lebih baru. |
TTL aktual cache ditentukan oleh TTL hasil resolusi nama domain, TTL maksimum, dan TTL minimum. Aturannya sebagai berikut:
Jika TTL hasil lebih besar daripada TTL Maksimum, TTL aktual adalah TTL Maksimum.
Jika TTL hasil lebih kecil daripada TTL Minimum, TTL aktual adalah TTL Minimum.
Jika TTL hasil berada di antara TTL Minimum dan TTL Maksimum, TTL aktual adalah TTL hasil.
Saran optimasi
Bagian ini menjelaskan jalur resolusi dan konfigurasi parameter dalam kluster Kubernetes. Anda dapat memodifikasi parameter dengan mengedit YAML Pod, ConfigMap CoreDNS, atau ConfigMap NodeLocal DNSCache. Berikut adalah contohnya.
Ketika Anda mengatur dnsPolicy:Default untuk pod klien, pengaturan server DNS VPC pada Instance ECS disalin ke file /etc/resolv.conf dalam kontainer.
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.138Dibandingkan dengan Instance ECS, konfigurasi kontainer kehilangan opsi rotate single-request-reopen timeout:2 attempts:3. Fluktuasi jaringan sesekali dapat menyebabkan kegagalan resolusi nama domain untuk layanan Anda. Anda dapat menambahkan parameter ini untuk meningkatkan toleransi kesalahan. Sesuaikan YAML Pod sebagai berikut:
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:3Gunakan serve_stale untuk memastikan stabilitas DNS
Opsi serve_stale adalah implementasi spesifik fitur penyajian entri kedaluwarsa dalam plugin cache CoreDNS. Ketika serve_stale diaktifkan, CoreDNS terus menyajikan entri kedaluwarsa dari cache jika server DNS hulu tidak dapat diakses. Fitur ini dapat meningkatkan keandalan resolusi DNS dan mencegah kegagalan resolusi yang disebabkan oleh fluktuasi layanan DNS hulu atau pengecualian sesekali.
Konfigurasi ini diaktifkan secara default di CoreDNS tidak terkelola versi 1.12.1 dan yang lebih baru. Untuk informasi selengkapnya tentang fitur ini, lihat RFC-8767.
Format konfigurasi
serve_stale [DURATION] [REFRESH_MODE]
DURATION: Periode validitas untuk entri kedaluwarsa. Nilai default adalah1 h. Jika entri cache kedaluwarsa, mencapai periode validitasnya, dan masih belum diperbarui, CoreDNS berhenti menyajikan entri tersebut.REFRESH_MODE: Kebijakan untuk menyajikan entri kedaluwarsa:verify: Sebelum mengirim entri kedaluwarsa ke klien, verifikasi apakah layanan DNS hulu aktif. Metode ini mungkin meningkatkan latensi resolusi untuk klien, tetapi dapat memberikan entri baru segera jika pembaruan terdeteksi.immediate: Segera kirim entri kedaluwarsa ke klien, lalu verifikasi apakah layanan DNS hulu aktif. Ini memberikan respons segera, tetapi waktu pembaruan mungkin tertinggal dari pembaruan layanan DNS hulu.
Contoh konfigurasi
Konfigurasi berikut digunakan secara default di CoreDNS tidak terkelola v1.12.1.2 dan yang lebih baru.
cache 30 {
...
serve_stale 30s verify
}Konfigurasi default untuk CoreDNS tidak terkelola v1.12.1.1-4035d7a99-aliyun:
cache 30 {
...
serve_stale 1h immediate
}Ketika Anda menggunakan konfigurasi default di atas, dalam beberapa skenario ekstrem (misalnya, ketika klien melakukan resolusi DNS selama pembaruan iteratif layanan headless), DNS mungkin mengembalikan entri kedaluwarsa. Jika situasi ini sering terjadi, Anda dapat mengubah kebijakan menjadi verify seperti yang ditunjukkan dalam Contoh Konfigurasi.