Topik ini menjelaskan kebijakan resolusi Sistem Nama Domain (DNS) dan kebijakan caching yang didukung oleh klaster Container Compute Service (ACS) dari Alibaba Cloud.
Pipeline resolusi DNS
Berikut adalah pipeline resolusi DNS dalam beberapa skenario:
Untuk informasi lebih lanjut tentang istilah dalam gambar berikut, seperti timeout dan attempts, lihat bagian "Kebijakan Resolusi" dan "Kebijakan Caching" dalam topik ini.
Aplikasi non-container berjalan pada Instance Elastic Compute Service (ECS).
Sebagai contoh, aplikasi bernama App berjalan pada instance ECS, seperti ditunjukkan pada gambar berikut.

Aplikasi container berjalan di pod dalam klaster Kubernetes. Pod menggunakan kebijakan DNS ClusterFirst.
Sebagai contoh, aplikasi bernama App berjalan di pod dalam klaster Kubernetes, seperti ditunjukkan pada gambar berikut.

Kebijakan resolusi
Client side
Dalam sebagian besar kasus, query DNS pod ditangani melalui antarmuka yang disediakan oleh glibc. Tabel berikut menggambarkan parameter yang dapat dikonfigurasi dalam file /etc/resolv.conf beserta nilai defaultnya dalam lingkungan yang berbeda. Parameter ini menentukan cara glibc melakukan resolusi DNS.
Parameter | Deskripsi | Nilai default di glibc | ECS | Nilai default untuk pod yang menggunakan kebijakan DNS ClusterFirst | Nilai default untuk pod yang menggunakan kebijakan DNS Default | Nilai default untuk pod yang menggunakan jaringan host dan kebijakan DNS Default |
| Server DNS yang menyelesaikan nama domain. | Tidak ada | Server DNS yang ditempatkan di virtual private cloud (VPC)② | Alamat IP klaster CoreDNS③ | Server DNS yang ditempatkan di VPC | Server DNS yang ditempatkan di VPC |
| Nama domain selain fully qualified domain names (FQDN) akan ditambahkan dengan akhiran yang ditentukan oleh parameter | Tidak ada | Tidak ada | <ns>.svc.cluster.localsvc.cluster.localcluster.local | Tidak ada | Tidak ada |
| Jika jumlah titik dalam string nama domain lebih besar dari nilai parameter ndots, nama domain tersebut adalah FQDN dan langsung diselesaikan. Jika jumlah titik dalam string nama domain kurang dari nilai parameter ndots, nama domain tersebut akan ditambahkan dengan akhiran yang ditentukan oleh parameter search sebelum nama domain diselesaikan. | 1 | 1 | 5 | 1 | 1 |
| Periode timeout setiap resolusi DNS. Unit: detik. | 5 | 2 | 5 | 5 | 2 |
| Jumlah maksimum percobaan ulang yang dapat dilakukan jika resolusi DNS gagal. | 2 | 3 | 2 | 2 | 3 |
| Mengirim query DNS ke server DNS secara bergantian. | Nonaktif | Aktif | Nonaktif | Nonaktif | Aktif |
| Setelah Anda menentukan parameter ini, jika dua permintaan DNS dikirim menggunakan socket yang sama, klien menutup socket setelah mengirim yang pertama dan membuka socket baru untuk mengirim yang kedua. | Nonaktif | Aktif | Nonaktif | Nonaktif | Aktif |
①Parameter attempts hanya berlaku dalam skenario tertentu, misalnya ketika SERVFAIL, NOTIMP, atau REFUSED dikembalikan, atau ketika NOERROR dikembalikan tanpa hasil resolusi. Untuk informasi lebih lanjut, lihat Pengenalan Parameter Attempts.
②Server DNS yang ditempatkan di VPC adalah server DNS default untuk instance ECS di VPC. Alamat IP server DNS adalah 100.100.2.136 dan 100.100.2.138. Server DNS menyelesaikan nama domain otoritatif dan nama domain yang ditambahkan ke Alibaba Cloud DNS PrivateZone.
③Alamat IP klaster CoreDNS adalah alamat IP layanan kube-dns di namespace kube-system. Layanan kube-dns meneruskan query DNS ke CoreDNS untuk nama domain internal, nama domain otoritatif, dan nama domain yang ditambahkan ke Alibaba Cloud DNS PrivateZone.
Untuk informasi lebih lanjut tentang cara mengonfigurasi resolv.conf, lihat resolv.conf.
Dalam kasus tertentu, konfigurasi resolusi DNS di sisi klien mungkin berbeda dari deskripsi sebelumnya.
Jika Anda menggunakan image Alpine Linux untuk menyebarkan container, konfigurasi resolusi DNS mungkin sangat berbeda karena Alpine Linux mengganti glibc dengan musl libc. Berikut beberapa perbedaan utama:
Alpine Linux tidak mendukung parameter single-request dan single-request-reopen dalam file /etc/resolv.conf.
Versi Alpine 3.3 dan sebelumnya tidak mendukung parameter search yang memungkinkan Anda menentukan domain pencarian. Akibatnya, penemuan layanan gagal diimplementasikan.
musl libc memproses query yang dikirim ke server DNS yang ditentukan dalam file /etc/resolv.conf secara paralel. Hal ini menyebabkan NodeLocal DNSCache gagal mengoptimalkan resolusi DNS.
musl libc memproses query A dan AAAA yang menggunakan socket yang sama secara paralel, yang dapat menyebabkan kehilangan paket pada port conntrack di versi kernel sebelumnya.
CatatanUntuk informasi lebih lanjut, lihat musl libc.
Jika Anda menggunakan Golang atau Node.js untuk mengembangkan aplikasi, aplikasi tersebut mungkin menggunakan resolver DNS bawaan, yang juga menyebabkan perbedaan signifikan dalam resolusi DNS.
Internal DNS servers in the cluster
Secara default, file /etc/resolv.conf CoreDNS diwarisi dari file /etc/resolv.conf pada instance ECS yang menjadi host CoreDNS. Namun, CoreDNS menggunakan plugin forward bawaan untuk meneruskan query DNS.
Tabel berikut menggambarkan parameter plugin forward. Untuk informasi lebih lanjut, lihat forward.
Parameter | Deskripsi | Nilai default di CoreDNS | Nilai default di NodeLocal DNSCache |
| Lebih memilih menggunakan UDP untuk berkomunikasi dengan server upstream. | Aktif | Nonaktif |
| Memaksa menggunakan TCP untuk berkomunikasi dengan server upstream. | Nonaktif | Aktif |
| Jumlah pemeriksaan kesehatan berturut-turut yang gagal sebelum server upstream dianggap tidak sehat. | 2 | 2 |
| Periode waktu koneksi ke server upstream tetap aktif. Periode waktu default adalah 10 detik. | 10s | 10s |
| Kebijakan yang digunakan untuk memilih server upstream. | random | random |
| Interval pemeriksaan kesehatan dilakukan. | 0.5s | 0.5s |
| Jumlah maksimum query bersamaan yang dapat dikirim ke server upstream. | Tidak ada | Tidak ada |
| Periode timeout koneksi ke server upstream. | 30s. Periode timeout berkurang secara dinamis berdasarkan durasi koneksi aktual. | 30s. Periode timeout berkurang secara dinamis berdasarkan durasi koneksi aktual. |
| Periode timeout permintaan yang dikirim ke server upstream. | 2s | 2s |
Kebijakan caching
Client side
Kebijakan caching DNS di sisi klien bervariasi berdasarkan konfigurasi container dan aplikasi. Anda dapat mengonfigurasi kebijakan caching DNS di sisi klien sesuai dengan kebutuhan Anda.
Internal DNS servers in the cluster
Parameter | Deskripsi | Nilai default CoreDNS | Nilai default CoreDNS di ACS |
success Max TTL | Waktu hidup maksimum (TTL) untuk cache resolusi DNS yang berhasil. | 3600s | 30s |
success Min TTL | Waktu hidup minimum (TTL) untuk cache resolusi DNS yang berhasil. | 5s | 5s |
success Capacity | Jumlah maksimum hasil resolusi DNS yang berhasil yang dapat di-cache. | 9984 | 9984 |
denial Max TTL | Waktu hidup maksimum (TTL) untuk cache resolusi DNS yang gagal. | 1800s | 30s |
denial Min TTL | Waktu hidup minimum (TTL) untuk cache resolusi DNS yang gagal. | 5s | 5s |
denial Capacity | Jumlah maksimum hasil resolusi DNS yang gagal yang dapat di-cache. | 9984 | 9984 |
ServerError TTL | Waktu hidup maksimum untuk hasil resolusi DNS yang dikembalikan dari server DNS upstream yang tidak sehat. | 5s | 0s. Jika versi CoreDNS yang terpasang lebih awal dari 1.8.4.2, nilai default adalah 5s. |
serve_stale | Menggunakan cache DNS lokal yang sudah kadaluarsa jika klien tidak dapat terhubung ke server DNS upstream. | Nonaktif | Nonaktif |
TTL aktual untuk cache DNS ditentukan oleh TTL catatan DNS yang dikembalikan, TTL maksimum, dan TTL minimum:
Jika TTL catatan DNS yang dikembalikan lebih besar dari TTL maksimum, TTL maksimum digunakan sebagai TTL aktual untuk cache DNS.
Jika TTL catatan DNS yang dikembalikan lebih kecil dari TTL minimum, TTL minimum digunakan sebagai TTL aktual untuk cache DNS.
Jika TTL catatan DNS yang dikembalikan lebih besar dari TTL minimum dan lebih kecil dari TTL maksimum, TTL catatan DNS yang dikembalikan digunakan sebagai TTL aktual untuk cache DNS.
Optimalkan resolusi DNS
Topik ini menjelaskan jalur resolusi DNS dalam klaster Kubernetes dan parameter terkait. Anda dapat mengubah pengaturan parameter dalam file YAML pod atau ConfigMap CoreDNS. Contohnya:
Jika Anda menentukan dnsPolicy:Default dalam file YAML pod klien, pod akan mewarisi pengaturan DNS dari instance ECS yang menjadi host pod. Oleh karena itu, alamat IP server DNS di VPC secara otomatis ditentukan dalam file /etc/resolv.conf di pod.
apiVersion: v1
kind: Pod
metadata:
name: example
namespace: default
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/example-ns/example:v1
name: example
# Setel parameter dnsPolicy ke Default.
dnsPolicy: Default
# File /etc/resolv.conf di pod.
# cat /etc/resolv.conf
nameserver 100.100.2.136
nameserver 100.100.2.138Dibandingkan dengan file /etc/resolv.conf dari instance ECS, file /etc/resolv.conf di pod tidak berisi opsi berikut: rotate single-request-reopen timeout:2 attempts:3. Hal ini dapat menyebabkan kesalahan resolusi ketika terjadi jitter jaringan. Anda harus menambahkan opsi-opsi ini untuk meningkatkan kemampuan toleransi kesalahan. Ubah file YAML pod berdasarkan konten berikut:
apiVersion: v1
kind: Pod
metadata:
name: example
namespace: default
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/example-ns/example:v1
name: example
# Setel parameter dnsPolicy ke Default.
dnsPolicy: Default
# Tambahkan opsi berikut.
dnsConfig:
options:
- name: timeout
value: "2"
- name: attempts
value: "3"
- name: rotate
- name: single-request-reopen
# Setelah Anda menambahkan opsi ke /etc/resolv.conf, redeploy pod untuk menerapkan modifikasi.
# cat /etc/resolv.conf
nameserver 100.100.2.136
nameserver 100.100.2.138
options rotate single-request-reopen timeout:2 attempts:3