DNS merupakan salah satu layanan dasar paling kritis dalam kluster Kubernetes. Konfigurasi sisi klien yang tidak tepat atau skala kluster yang besar dapat menyebabkan timeout atau kegagalan resolusi DNS. Topik ini menjelaskan praktik terbaik untuk DNS di kluster Kubernetes guna membantu Anda menghindari masalah tersebut.
Catatan penting
Topik ini tidak berlaku untuk CoreDNS yang dikelola atau kluster ACK dengan mode Auto yang diaktifkan. CoreDNS yang dikelola secara otomatis melakukan penskalaan berdasarkan beban kerja, sehingga penyesuaian manual tidak diperlukan.
Isi
Praktik terbaik DNS mencakup aspek sisi klien dan sisi server:
-
Pada sisi klien, Anda dapat mengurangi latensi resolusi dengan mengoptimalkan permintaan resolusi nama domain. Anda juga dapat meminimalkan anomali resolusi menggunakan gambar kontainer yang sesuai, sistem operasi node yang tepat, dan NodeLocal DNSCache.
-
Pada sisi server CoreDNS, Anda dapat memantau status runtime CoreDNS untuk mendeteksi anomali DNS dan segera mengidentifikasi akar penyebabnya. Anda juga dapat meningkatkan ketersediaan tinggi CoreDNS dan throughput permintaan per detik (QPS) dengan menyesuaikan pengaturan deployment CoreDNS.
Untuk informasi lebih lanjut tentang CoreDNS, lihat dokumentasi resmi CoreDNS.
Optimalkan permintaan resolusi nama domain
Resolusi nama domain DNS merupakan salah satu aktivitas jaringan paling sering terjadi di Kubernetes. Banyak dari permintaan ini dapat dioptimalkan atau dihindari. Anda dapat mengoptimalkan permintaan resolusi nama domain dengan cara berikut:
-
(Direkomendasikan) Gunakan kolam koneksi. Jika aplikasi berkontainer sering mengakses layanan lain, gunakan kolam koneksi. Kolam koneksi menyimpan cache koneksi layanan hulu di memori, sehingga menghindari overhead resolusi DNS dan pembentukan koneksi TCP untuk setiap akses.
-
Gunakan mode asinkron atau long polling untuk memperoleh alamat IP yang sesuai dengan nama domain DNS.
-
Gunakan cache DNS:
-
(Direkomendasikan) Jika aplikasi Anda tidak dapat dimodifikasi untuk menggunakan kolam koneksi, pertimbangkan untuk menyimpan cache hasil resolusi DNS di sisi aplikasi. Untuk informasi lebih lanjut, lihat Gunakan NodeLocal DNSCache.
-
Jika NodeLocal DNSCache tidak tersedia, Anda dapat menyimpan cache kueri DNS di dalam kontainer menggunakan Name Service Cache Daemon (NSCD). Untuk informasi lebih lanjut, lihat Gunakan NSCD di kluster Kubernetes.
-
-
Optimalkan file resolv.conf: Parameter ndots dan search dalam file resolv.conf memengaruhi efisiensi resolusi nama domain berdasarkan cara Anda menulis nama domain dalam konfigurasi kontainer. Untuk informasi lebih lanjut tentang cara kerja parameter ndots dan search, lihat Konfigurasi kebijakan DNS dan resolusi nama domain.
-
Optimalkan konfigurasi nama domain. Saat aplikasi berkontainer mengakses nama domain, konfigurasikan nama domain sebagai berikut untuk meminimalkan upaya resolusi dan mengurangi waktu resolusi:
-
Untuk Pod yang mengakses Service dalam namespace yang sama, gunakan
<service-name>, denganservice-nameadalah nama Service tersebut. -
Untuk Pod yang mengakses Service lintas namespace, gunakan
<service-name>.<namespace-name>, dengannamespace-nameadalah namespace dari Service tersebut. -
Saat mengakses domain eksternal, gunakan fully qualified domain names (FQDN). Tambahkan titik trailing (.) pada nama domain umum untuk menentukannya sebagai alamat absolut. Praktik ini menghindari beberapa pencarian tidak valid yang disebabkan oleh penggabungan domain
search. Misalnya, saat mengakses www.aliyun.com, gunakan FQDN www.aliyun.com..-
Pada kluster versi 1.33 atau lebih baru, Anda dapat mengonfigurasi domain search sebagai "." tunggal (lihat isu terkait: 125883) untuk mencapai efek serupa:
dnsPolicy: None dnsConfig: nameservers: ["192.168.0.10"] ## Ganti 192.168.0.10 dengan clusterIP layanan CoreDNS aktual searches: - . - default.svc.cluster.local ## Ganti "default" dengan nama namespace Anda - svc.cluster.local - cluster.localSetelah menerapkan konfigurasi ini, file /etc/resolv.conf di Pod akan tampak sebagai berikut:
search . default.svc.cluster.local svc.cluster.local cluster.local nameserver 192.168.0.10"." sebagai domain search pertama memastikan bahwa semua permintaan domain diperlakukan sebagai FQDN dan langsung di-resolve tanpa upaya pencarian yang tidak perlu.
PentingPerhatikan bahwa konfigurasi ini mengharuskan Anda menyetel
dnsPolicykeNoneagar berlaku.
-
-
Pahami konfigurasi DNS dalam kontainer
-
Resolver DNS yang berbeda mungkin berperilaku sedikit berbeda karena perbedaan implementasi. Anda mungkin menemukan kasus di mana dig <domain> berhasil di-resolve tetapi ping <domain> gagal.
-
Hindari penggunaan gambar dasar Alpine. Pustaka musl libc dalam gambar kontainer Alpine berbeda dari glibc standar dan dapat menyebabkan masalah seperti berikut:
-
Versi Alpine 3.18 dan sebelumnya tidak mendukung perintah tc yang kembali ke protokol TCP.
-
Versi Alpine 3.3 dan sebelumnya tidak mendukung parameter search atau domain search, yang menghambat penemuan layanan.
-
Kueri konkuren ke beberapa server DNS yang dikonfigurasi dalam /etc/resolv.conf dapat membatalkan optimasi NodeLocal DNSCache.
-
Kueri konkuren rekaman A dan AAAA yang menggunakan soket yang sama dapat memicu konflik port sumber conntrack pada kernel lama, yang menyebabkan kehilangan paket.
Untuk informasi lebih lanjut, lihat musl libc.
-
-
Jika Anda menggunakan aplikasi Go, pastikan Anda memahami perbedaan antara implementasi resolver DNS CGO dan Pure Go.
Hindari timeout resolusi DNS probabilistik yang disebabkan oleh cacat IPVS
Jika Anda menggunakan IPVS sebagai mode load balancing kube-proxy, Anda mungkin mengalami timeout resolusi DNS intermiten selama skala-masuk atau restart CoreDNS. Masalah ini disebabkan oleh cacat pada kernel Linux. Untuk informasi lebih lanjut, lihat IPVS.
Anda dapat mengurangi dampak cacat IPVS dengan salah satu metode berikut:
-
Gunakan NodeLocal DNSCache. Untuk informasi lebih lanjut, lihat Gunakan NodeLocal DNSCache.
-
Modifikasi timeout persistensi sesi UDP IPVS di kube-proxy. Untuk informasi lebih lanjut, lihat Bagaimana cara memodifikasi timeout persistensi sesi UDP IPVS di kube-proxy?.
Gunakan NodeLocal DNSCache
Dalam beberapa skenario, CoreDNS mungkin mengalami masalah berikut:
-
Kadang-kadang, kueri A dan AAAA konkuren dapat menyebabkan kehilangan paket, yang mengakibatkan kegagalan resolusi DNS.
-
Tabel conntrack penuh pada node dapat menyebabkan kehilangan paket, yang mengakibatkan kegagalan resolusi DNS.
Untuk meningkatkan stabilitas dan kinerja layanan DNS di kluster Anda, Anda dapat menginstal komponen NodeLocal DNSCache. Komponen ini menjalankan cache DNS pada setiap node di kluster untuk meningkatkan kinerja DNS. Untuk informasi lebih lanjut tentang NodeLocal DNSCache dan cara menerapkannya di kluster ACK, lihat Gunakan komponen NodeLocal DNSCache.
Setelah menginstal NodeLocal DNSCache, Anda harus menyuntikkan konfigurasi cache DNS ke dalam Pod Anda. Anda dapat menjalankan perintah berikut untuk menambahkan label ke namespace. Pod baru yang dibuat di namespace ini secara otomatis menerima konfigurasi cache DNS. Untuk informasi tentang metode penyuntikan lainnya, lihat dokumen yang ditautkan pada paragraf sebelumnya.
kubectl label namespace default node-local-dns-injection=enabled
Gunakan versi CoreDNS yang sesuai
CoreDNS mempertahankan kompatibilitas mundur yang baik dengan berbagai versi Kubernetes. Kami merekomendasikan agar Anda menjaga CoreDNS pada versi stabil terbaru. Halaman Manajemen Komponen di konsol ACK menyediakan fitur untuk menginstal, meningkatkan, dan mengonfigurasi CoreDNS. Anda dapat memantau status komponen Anda di halaman Manajemen Komponen. Jika tersedia peningkatan untuk CoreDNS, lakukan peningkatan tersebut selama jam sepi.
-
Untuk petunjuk cara melakukan peningkatan, lihat Peningkatan otomatis untuk CoreDNS non-managed.
-
Untuk catatan rilis CoreDNS, lihat CoreDNS.
Versi CoreDNS sebelum v1.7.0 memiliki risiko yang diketahui, termasuk namun tidak terbatas pada hal berikut:
-
Jika konektivitas antara CoreDNS dan server API gagal, misalnya selama restart server API, migrasi, atau karena fluktuasi jaringan, CoreDNS mungkin restart karena gagal menulis log error. Untuk informasi lebih lanjut, lihat Setel flag logtostderr klog.
-
CoreDNS mengonsumsi memori tambahan selama startup. Batas memori default dapat memicu masalah kehabisan memori (OOM) di kluster besar. Hal ini dapat menyebabkan Pod CoreDNS berulang kali restart tanpa pemulihan otomatis. Untuk informasi lebih lanjut, lihat CoreDNS menggunakan banyak memori selama fase inisialisasi.
-
CoreDNS memiliki masalah yang diketahui yang memengaruhi domain Headless Service dan resolusi domain eksternal. Untuk informasi lebih lanjut, lihat plugin/kubernetes: handle tombstones in default processor dan Data tidak disinkronkan saat CoreDNS terhubung kembali ke server api kubernetes setelah pemutusan koneksi yang lama.
-
Jika suatu node abnormal, versi CoreDNS lama mungkin men-deploy Pod pada node abnormal tersebut karena kebijakan toleransi default. Pod tersebut mungkin tidak dievakuasi secara otomatis, yang menyebabkan kegagalan resolusi domain.
Versi minimum CoreDNS yang direkomendasikan bervariasi berdasarkan versi kluster Kubernetes, seperti ditunjukkan pada tabel berikut:
|
Versi kluster |
Versi CoreDNS minimum yang direkomendasikan |
|
Di bawah 1.14.8 |
v1.6.2 (tidak lagi dipelihara) |
|
1.14.8 dan seterusnya, di bawah 1.20.4 |
v1.7.0.0-f59c03d-aliyun |
|
1.20.4 dan seterusnya, di bawah 1.21.0 |
v1.8.4.1-3a376cc-aliyun |
|
1.21.0 dan seterusnya |
v1.11.3.2-f57ea7ed6-aliyun |
Pantau status runtime CoreDNS
Metrik pemantauan
CoreDNS mengekspos metrik kesehatan, seperti hasil resolusi, melalui antarmuka Prometheus standar. Hal ini membantu Anda mendeteksi anomali pada CoreDNS atau server DNS hulu.
Prometheus untuk ACK mencakup metrik pemantauan CoreDNS dan aturan peringatan bawaan. Anda dapat mengaktifkan fitur Prometheus dan Dashboard di Konsol Container Service for Kubernetes. Untuk informasi lebih lanjut, lihat Pemantauan komponen CoreDNS.
Jika Anda menjalankan instance Prometheus self-managed untuk kluster Kubernetes Anda, Anda dapat mengamati metrik terkait dan menyetel peringatan untuk metrik kritis. Untuk informasi lebih lanjut, lihat dokumentasi resmi Prometheus CoreDNS.
Log operasional
Saat terjadi anomali DNS, Anda dapat menggunakan log CoreDNS untuk segera mendiagnosis akar penyebabnya. Anda dapat mengaktifkan log resolusi domain CoreDNS dan pengumpulan log SLS. Untuk informasi lebih lanjut, lihat Analisis dan pantau log CoreDNS.
Pengiriman event Kubernetes
Pada CoreDNS v1.9.3.6-32932850-aliyun dan seterusnya, Anda dapat mengaktifkan plugin k8s_event untuk mengirimkan log CoreDNS kritis sebagai event Kubernetes ke Event Hub. Untuk informasi lebih lanjut tentang plugin k8s_event, lihat k8s_event.
Instans CoreDNS yang baru diterapkan memiliki fitur ini diaktifkan secara default. Jika Anda melakukan peningkatan dari versi CoreDNS lama, Anda harus memodifikasi file konfigurasi secara manual untuk mengaktifkan fitur tersebut.
-
Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS.
kubectl -n kube-system edit configmap/coredns -
Tambahkan plugin kubeAPI dan k8s_event.
apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } // Mulai penambahan (abaikan perbedaan lainnya). kubeapi k8s_event { level info error warning // Kirim log kritis dengan level info, error, atau warning. } // Akhir penambahan. kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } // Di bawah ini dihilangkan. } -
Periksa status dan log Pod CoreDNS. Jika log berisi kata
reload, modifikasi berhasil.
Pastikan ketersediaan tinggi CoreDNS
CoreDNS berfungsi sebagai otoritas DNS untuk kluster. Kegagalan CoreDNS dapat menyebabkan akses Service internal gagal, yang dapat mengganggu sebagian besar bisnis Anda. Anda dapat memastikan ketersediaan tinggi CoreDNS dengan langkah-langkah berikut:
Evaluasi tekanan komponen CoreDNS
Anda dapat menjalankan uji stres DNS di kluster Anda untuk mengevaluasi tekanan komponen. Banyak alat open-source, seperti DNSPerf, dapat membantu hal ini. Jika Anda tidak dapat mengevaluasi tekanan DNS secara akurat, ikuti rekomendasi berikut:
-
Selalu terapkan minimal dua Pod CoreDNS, dengan setiap Pod memiliki batas resource minimal 1 core CPU dan 1 GB memori.
-
Kapasitas QPS CoreDNS berkorelasi langsung dengan penggunaan CPU. Dengan NodeLocal DNSCache, setiap core CPU dapat mendukung lebih dari 10.000 QPS. Persyaratan QPS DNS untuk workload bisnis sangat bervariasi. Anda harus memantau penggunaan CPU puncak setiap Pod CoreDNS. Jika penggunaan CPU melebihi satu core selama periode puncak bisnis, lakukan penskalaan jumlah replika CoreDNS. Jika penggunaan CPU puncak tidak diketahui, sebagai langkah konservatif, terapkan satu Pod CoreDNS untuk setiap delapan node di kluster.
Sesuaikan jumlah Pod CoreDNS
Jumlah Pod CoreDNS secara langsung menentukan resource komputasi yang tersedia. Anda dapat menyesuaikan jumlah ini berdasarkan evaluasi Anda.
Karena UDP tidak memiliki mekanisme pengiriman ulang, skala-masuk atau restart Pod CoreDNS dapat menyebabkan timeout atau anomali resolusi DNS di seluruh kluster yang berlangsung hingga lima menit jika terdapat cacat UDP IPVS pada node kluster. Untuk solusi masalah resolusi terkait IPVS, lihat Pemecahan masalah anomali resolusi DNS.
-
Menyesuaikan jumlah Pod secara otomatis berdasarkan kebijakan yang direkomendasikan
Anda dapat menerapkan
dns-autoscalerberikut. Alat ini secara otomatis menyesuaikan jumlah Pod CoreDNS secara real-time berdasarkan rasio yang direkomendasikan yaitu satu Pod untuk setiap delapan node kluster. Rumus jumlah replika adalah `replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica))`, yang dibatasi oleh batasmaxdanmin. -
Penyesuaian manual
Anda dapat menyesuaikan jumlah Pod CoreDNS secara manual dengan menjalankan perintah berikut.
kubectl scale --replicas={target} deployment/coredns -n kube-system # Ganti {target} dengan jumlah Pod yang diinginkan -
Jangan gunakan autoscaling workload
Meskipun mekanisme autoscaling workload seperti Penyesuaian Otomatis Pod Horizontal (HPA) atau CronHPA dapat menyesuaikan jumlah Pod secara otomatis, mekanisme ini memicu operasi penskalaan yang sering. Karena anomali resolusi yang dapat terjadi selama skala-masuk Pod seperti yang dijelaskan sebelumnya, jangan gunakan autoscaling workload untuk mengontrol jumlah Pod CoreDNS.
Sesuaikan spesifikasi Pod CoreDNS
Cara lain untuk menyesuaikan resource CoreDNS adalah dengan memodifikasi spesifikasi Pod. Di kluster ACK yang dikelola Pro, Pod CoreDNS memiliki batas memori default 2Gi dan tidak memiliki batas CPU. Kami merekomendasikan agar Anda menyetel batas CPU ke 4096m, dengan minimum 1024m. Anda dapat menyesuaikan konfigurasi Pod CoreDNS di konsol.
Jadwalkan Pod CoreDNS
Konfigurasi penjadwalan yang salah dapat mencegah Pod CoreDNS diterapkan, yang dapat menyebabkan kegagalan CoreDNS. Sebelum melanjutkan, pastikan Anda sepenuhnya memahami penjadwalan.
Terapkan Pod CoreDNS di berbagai zona dan node kluster untuk menghindari kegagalan node tunggal atau zona tunggal. Versi CoreDNS sebelum v1.8.4.3 menggunakan anti-afinitas node lemah secara default. Hal ini dapat menyebabkan beberapa atau semua Pod diterapkan pada node yang sama karena sumber daya node yang tidak mencukupi. Jika hal ini terjadi, Anda dapat menghapus Pod untuk memicu penjadwalan ulang atau meningkatkan ke versi komponen terbaru. Versi CoreDNS sebelum v1.8 tidak lagi dipelihara. Kami merekomendasikan agar Anda segera meningkatkannya.
Hindari menerapkan CoreDNS pada node kluster yang memiliki pemanfaatan CPU atau memori penuh karena hal ini memengaruhi QPS DNS dan latensi respons. Jika memungkinkan, gunakan parameter kustom untuk menjadwalkan CoreDNS pada node kluster khusus guna memastikan resolusi nama domain yang stabil.
Optimalkan konfigurasi CoreDNS
Container Service for Kubernetes (ACK) hanya menyediakan konfigurasi CoreDNS default. Anda harus meninjau semua parameter dan mengoptimalkannya untuk memastikan CoreDNS melayani kontainer aplikasi Anda dengan baik. Konfigurasi CoreDNS sangat fleksibel. Untuk informasi lebih lanjut, lihat Konfigurasi kebijakan DNS dan resolusi nama domain dan dokumentasi resmi CoreDNS.
Konfigurasi CoreDNS default yang diterapkan dengan versi Kubernetes lama mungkin memiliki risiko. Anda dapat memeriksa dan mengoptimalkan konfigurasi ini dengan cara berikut:
Anda juga dapat menggunakan fitur inspeksi terjadwal dan diagnosis kesalahan di Container Intelligence Operations untuk memeriksa file konfigurasi CoreDNS. Jika Container Intelligence Operations melaporkan anomali konfigurasi ConfigMap CoreDNS, tinjau item yang disebutkan di atas.
CoreDNS mungkin mengonsumsi memori tambahan saat memuat ulang konfigurasi. Setelah memodifikasi item konfigurasi CoreDNS, pantau status Pod. Jika Pod mengalami kekurangan memori, segera tingkatkan batas memori di Deployment CoreDNS. Kami merekomendasikan agar Anda menyetel memori ke 2 GB.
Nonaktifkan pengaturan afinitas untuk layanan kube-dns
Pengaturan afinitas dapat menyebabkan ketidakseimbangan beban yang signifikan di antara replika CoreDNS. Anda dapat menonaktifkannya dengan salah satu cara berikut:
Metode konsol
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di namespace kube-system, klik Edit YAML di sebelah kanan layanan kube-dns.
-
Jika nilai bidang sessionAffinity adalah
None, Anda dapat melewati langkah-langkah berikut. -
Jika nilai sessionAffinity adalah
ClientIP, lanjutkan dengan langkah-langkah berikut.
-
-
Hapus bidang sessionAffinity dan sessionAffinityConfig beserta semua subkey-nya. Lalu, klik Update.
# Hapus semua konten berikut. sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 -
Klik Edit YAML lagi di sebelah kanan layanan kube-dns dan verifikasi bahwa nilai bidang sessionAffinity adalah
None. Jika nilai bidang tersebut adalahNone, layanan Kube-DNS telah berhasil diperbarui.
Metode baris perintah
-
Jalankan perintah berikut untuk melihat konfigurasi layanan kube-dns.
kubectl -n kube-system get svc kube-dns -o yaml-
Jika nilai bidang sessionAffinity adalah
None, Anda dapat melewati langkah-langkah berikut. -
Jika nilai sessionAffinity adalah
ClientIP, lanjutkan dengan langkah-langkah berikut.
-
-
Jalankan perintah berikut untuk membuka dan mengedit layanan kube-dns.
kubectl -n kube-system edit service kube-dns -
Hapus semua pengaturan terkait sessionAffinity (sessionAffinity, sessionAffinityConfig, dan semua subkey). Lalu, simpan perubahan dan keluar.
# Hapus semua konten berikut. sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 -
Setelah modifikasi, jalankan perintah berikut lagi untuk memverifikasi bahwa nilai bidang sessionAffinity adalah
None. Jika nilainyaNone, pembaruan layanan kube-dns berhasil.kubectl -n kube-system get svc kube-dns -o yaml
Nonaktifkan plugin Autopath
Beberapa versi CoreDNS lama memiliki plugin Autopath yang diaktifkan. Plugin ini dapat menghasilkan hasil resolusi yang salah dalam skenario ekstrem. Anda dapat memverifikasi apakah plugin tersebut diaktifkan dan menonaktifkannya dengan mengedit file konfigurasi. Untuk informasi lebih lanjut, lihat Autopath.
Setelah menonaktifkan plugin Autopath, QPS kueri DNS sisi klien mungkin meningkat hingga tiga kali lipat, dan waktu resolusi domain tunggal mungkin meningkat hingga tiga kali lipat. Anda harus memantau beban CoreDNS dan dampaknya terhadap bisnis Anda.
-
Jalankan perintah
kubectl -n kube-system edit configmap corednsuntuk membuka file konfigurasi CoreDNS. -
Hapus baris
autopath @kubernetesdan simpan perubahan. -
Periksa status dan log Pod CoreDNS. Jika log berisi kata
reload, modifikasi berhasil.
Konfigurasikan shutdown yang mulus untuk CoreDNS
Mekanisme lameduck di CoreDNS memungkinkan shutdown yang mulus. Saat CoreDNS berhenti atau restart, mekanisme ini memastikan bahwa permintaan yang sedang berlangsung diselesaikan secara normal tanpa terputus secara tiba-tiba. Mekanisme lameduck bekerja sebagai berikut:
-
Saat CoreDNS dihentikan, ia memasuki mode Lameduck.
-
Dalam mode
lameduck, CoreDNS berhenti menerima permintaan baru tetapi terus memproses permintaan yang ada hingga selesai atau hingga periode timeoutlameduckberakhir.
Metode konsol
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di namespace kube-system, klik Edit YAML di sebelah kanan item konfigurasi coredns.
-
Merujuk pada file konfigurasi CoreDNS berikut. Pastikan plugin health diaktifkan dan atur timeout lameduck ke
15s. Lalu, klik OK.
.:53 {
errors
# Plugin health mungkin memiliki pengaturan default yang berbeda di berbagai versi CoreDNS.
# Kasus 1: plugin health dinonaktifkan secara default.
# Kasus 2: plugin health diaktifkan secara default tetapi waktu lameduck tidak diatur.
# health
# Kasus 3: plugin health diaktifkan secara default dengan waktu lameduck diatur ke 5s.
# health {
# lameduck 5s
# }
# Untuk ketiga kasus tersebut, modifikasi secara seragam sebagai berikut untuk menyetel lameduck ke 15s.
health {
lameduck 15s
}
# Jangan modifikasi plugin lain; dihilangkan di sini.
}
Jika Pod CoreDNS berjalan normal, konfigurasi shutdown yang mulus berhasil diperbarui. Jika Pod menjadi abnormal, periksa event dan log Pod untuk mengidentifikasi penyebabnya.
Metode baris perintah
-
Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS.
-
Merujuk pada Corefile berikut. Pastikan plugin
healthdiaktifkan dan atur parameter lameduck ke15s. -
Simpan perubahan dan keluar setelah memodifikasi file konfigurasi CoreDNS.
-
Jika CoreDNS berjalan normal, konfigurasi shutdown yang mulus berhasil diperbarui. Jika Pod menjadi abnormal, periksa event dan log Pod untuk mengidentifikasi penyebabnya.
kubectl -n kube-system edit configmap/coredns
.:53 {
errors
# Plugin health mungkin memiliki pengaturan default yang berbeda di berbagai versi CoreDNS.
# Kasus 1: plugin health dinonaktifkan secara default.
# Kasus 2: plugin health diaktifkan secara default tetapi waktu lameduck tidak diatur.
# health
# Kasus 3: plugin health diaktifkan secara default dengan waktu lameduck diatur ke 5s.
# health {
# lameduck 5s
# }
# Untuk ketiga kasus tersebut, modifikasi secara seragam sebagai berikut untuk menyetel lameduck ke 15s.
health {
lameduck 15s
}
# Jangan modifikasi plugin lain; dihilangkan di sini.
}
Tetapkan protokol default untuk plugin Forward saat berkomunikasi dengan server DNS VPC hulu
NodeLocal DNSCache berkomunikasi dengan CoreDNS menggunakan TCP. CoreDNS menggunakan protokol yang sama dengan permintaan masuk saat berkomunikasi dengan server DNS hulu. Secara default, permintaan resolusi domain eksternal dari kontainer aplikasi melewati NodeLocal DNSCache dan CoreDNS, lalu mencapai server DNS VPC (100.100.2.136 dan 100.100.2.138) menggunakan TCP.
Server DNS VPC memiliki dukungan terbatas untuk TCP. Jika Anda menggunakan NodeLocal DNSCache, Anda harus memodifikasi konfigurasi CoreDNS agar selalu memprioritaskan UDP saat berkomunikasi dengan server DNS hulu untuk menghindari anomali resolusi. Anda dapat memodifikasi ConfigMap bernama coredns di namespace kube-system sebagai berikut. Untuk informasi lebih lanjut, lihat Kelola ConfigMaps. Di plugin forward, tentukan prefer_udp sebagai protokol hulu. Setelah modifikasi ini, CoreDNS memprioritaskan penggunaan UDP untuk komunikasi hulu:
# Sebelum modifikasi
forward . /etc/resolv.conf
# Setelah modifikasi
forward . /etc/resolv.conf {
prefer_udp
}
Konfigurasikan plugin Pemeriksaan kesiapan Ready
Versi CoreDNS setelah 1.5.0 memerlukan plugin ready untuk mengaktifkan pemeriksaan kesiapan.
-
Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS.
kubectl -n kube-system edit configmap/coredns -
Periksa baris
ready. Jika tidak ada, tambahkanready. Tekan Esc, ketik:wq!, lalu tekan Enter untuk menyimpan perubahan dan keluar.apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready # Tambahkan baris ini jika tidak ada, pastikan indentasi konsisten dengan Kubernetes. kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 prefer_udp } cache 30 loop log reload loadbalance } -
Periksa status dan log Pod CoreDNS. Jika log berisi kata
reload, modifikasi berhasil.
Konfigurasikan plugin multisocket untuk meningkatkan kinerja resolusi CoreDNS
CoreDNS v1.12.1 memperkenalkan plugin multisocket. Jika Anda mengaktifkan plugin ini, CoreDNS dapat menggunakan beberapa soket untuk mendengarkan pada port yang sama, yang meningkatkan kinerja dalam skenario CPU tinggi. Untuk informasi lebih lanjut tentang plugin ini, lihat dokumentasi komunitas.
Anda dapat mengaktifkan multisocket di ConfigMap coredns:
.:53 {
...
prometheus :9153
multisocket [NUM_SOCKETS]
forward . /etc/resolv.conf
...
}
NUM_SOCKETS menentukan jumlah soket yang mendengarkan pada port yang sama.
Rekomendasi konfigurasi: Kami merekomendasikan agar Anda menyelaraskan nilai NUM_SOCKETS dengan perkiraan penggunaan CPU, batas resource CPU, dan resource yang tersedia di kluster. Contohnya:
-
Jika CoreDNS mengonsumsi 4 core pada puncaknya dan 8 core tersedia, atur
NUM_SOCKETSke 2. -
Jika CoreDNS mengonsumsi 8 core pada puncaknya dan 64 core tersedia, atur
NUM_SOCKETSke 8.
Untuk menentukan konfigurasi optimal, Anda dapat menguji pengaturan berbeda dan mengukur QPS serta beban.
Jika Anda tidak menentukan NUM_SOCKETS, CoreDNS menggunakan GOMAXPROCS secara default. Nilai `GOMAXPROCS` sama dengan batas CPU Pod CoreDNS. Jika tidak ada batas CPU yang ditetapkan, nilainya sama dengan jumlah core CPU pada node.