全部产品
Search
文档中心

Container Service for Kubernetes:Kebijakan resolusi dan cache DNS

更新时间:Nov 21, 2025

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.

Catatan

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.

    DNS解析链路1.png

  • Aplikasi berbasis kontainer dijalankan di Kubernetes. Pod menggunakan kebijakan DNS ClusterFirst.

    Contoh: Sebuah aplikasi dijalankan dalam pod kontainer Kubernetes.

    DNS解析链路2.png

  • Aplikasi berbasis kontainer dijalankan di Kubernetes. Pod menggunakan NodeLocal DNSCache.

    Contoh: Sebuah aplikasi dijalankan dalam pod kontainer Kubernetes, dan NodeLocal DNSCache diterapkan.

    DNS解析链路3.png

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

nameserver

Server DNS yang digunakan untuk melakukan resolusi nama domain.

Kosong

Server DNS VPC

ClusterIP CoreDNS

Server DNS VPC

  • IP NodeLocal DNSCache

  • ClusterIP CoreDNS

Server DNS VPC

search

Untuk permintaan yang melibatkan nama domain yang bukan nama domain berkualifikasi penuh (FQDN), nama domain tersebut ditambahkan dengan akhiran search untuk membentuk FQDN sebelum permintaan dikirim.

Kosong

Kosong

<ns>.svc.cluster.local svc.cluster.local cluster.local

Kosong

<ns>.svc.cluster.local svc.cluster.local cluster.local

Kosong

ndots:n

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

timeout:n

Periode timeout untuk satu permintaan resolusi nama domain, dalam detik.

5

2

5

5

1

2

attempts:n

Jumlah percobaan ulang jika resolusi nama domain gagal.

2

3

2

2

2

3

rotate

Menanyakan server DNS secara round-robin.

dimatikan

Diaktifkan

Dimatikan

Dimatikan

Dimatikan

Diaktifkan

single-request-reopen

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.

Catatan

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.

    Catatan

    Untuk 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

prefer_udp

Lebih memilih menggunakan UDP untuk berkomunikasi dengan server hulu.

Diaktifkan

Dimatikan

force_tcp

Memaksa menggunakan TCP untuk berkomunikasi dengan server hulu.

Dimatikan

Diaktifkan

max_fails

Jumlah pemeriksaan kesehatan gagal berturut-turut sebelum server hulu dianggap tidak sehat.

2

2

expire

Menjaga koneksi ke server hulu selama 10 detik.

10s

10s

policy

Kebijakan untuk memilih server hulu.

random

random

health_check

Interval pemeriksaan kesehatan.

0,5s

0,5s

max_concurrent

Jumlah maksimum koneksi bersamaan ke server hulu.

Tidak ada

Tidak ada

dial timeout

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.

read timeout

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.

Catatan

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.138

Dibandingkan 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:3

Gunakan 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 adalah 1 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
}
Penting

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.