DNS merupakan layanan kritis dalam kluster Kubernetes. Dalam kondisi tertentu, seperti konfigurasi klien yang tidak tepat atau skala kluster yang besar, resolusi DNS dapat mengalami timeout atau gagal. Panduan ini menyediakan praktik terbaik untuk mencegah masalah tersebut.
Catatan penggunaan
Topik ini tidak berlaku untuk kluster Container Service for Kubernetes (ACK) yang menggunakan edisi managed CoreDNS atau memiliki Auto Mode diaktifkan. Kluster tersebut melakukan penskalaan secara otomatis berdasarkan beban dan tidak memerlukan penyesuaian manual.
Daftar isi
Praktik terbaik DNS mencakup optimasi sisi klien dan sisi server:
-
Sisi klien: Kurangi latensi dengan mengoptimalkan permintaan DNS dan minimalkan kegagalan dengan menggunakan gambar kontainer, sistem operasi node, dan NodeLocal DNSCache yang sesuai.
-
Sisi server: Identifikasi pengecualian DNS dan temukan akar penyebabnya dengan memantau status operasional CoreDNS. Anda juga dapat meningkatkan ketersediaan tinggi dan throughput permintaan per detik (QPS) dengan menyesuaikan konfigurasi penerapannya.
Untuk informasi lebih lanjut tentang CoreDNS, lihat dokumentasi resmi CoreDNS.
Optimalkan permintaan resolusi DNS
Resolusi DNS merupakan operasi jaringan yang sering terjadi dalam kluster Kubernetes. Anda dapat mengoptimalkan atau menghindari banyak permintaan ini untuk mengurangi latensi dan beban pada infrastruktur DNS:
-
(Direkomendasikan) Gunakan kolam koneksi. Jika aplikasi Anda sering meminta layanan lain, kami merekomendasikan penggunaan kolam koneksi. Kolam koneksi menyimpan koneksi aktif ke layanan upstream dalam memori. Praktik ini menghilangkan overhead resolusi DNS dan handshake TCP untuk setiap permintaan.
-
Gunakan permintaan asinkron atau long polling untuk mendapatkan alamat IP yang dipetakan ke nama domain.
-
Gunakan cache DNS:
-
(Direkomendasikan) Jika Anda tidak dapat merefaktor aplikasi untuk menggunakan kolam koneksi guna terhubung ke layanan lain, pertimbangkan untuk menyimpan hasil resolusi DNS di sisi klien. Untuk informasi lebih lanjut, lihat Gunakan NodeLocal DNSCache.
-
Jika Anda tidak dapat menggunakan NodeLocal DNSCache, Anda dapat menggunakan Name Service Cache Daemon (NSCD) bawaan dalam kontainer Anda. Untuk informasi lebih lanjut tentang cara menggunakan cache NSCD, lihat Gunakan NSCD dalam kluster Kubernetes.
-
-
Optimalkan file resolv.conf: Cara Anda menulis nama domain dalam kontainer menentukan efisiensi resolusi nama domain karena cara kerja parameter ndots dan search dalam file resolv.conf. Untuk informasi lebih lanjut tentang mekanisme parameter ndots dan search, lihat Konfigurasi kebijakan DNS dan resolusi nama domain.
-
Optimalkan konfigurasi nama domain. Saat aplikasi mengakses nama domain, tentukan sesuai prinsip berikut. Hal ini meminimalkan upaya resolusi DNS dan mengurangi latensi.
-
Saat sebuah Pod mengakses Service dalam namespace yang sama, gunakan
<service-name>untuk mengakses Service tersebut.service-namemenunjukkan nama Service tersebut. -
Saat sebuah Pod mengakses Service dalam namespace berbeda, gunakan
<service-name>.<namespace-name>untuk mengakses Service tersebut.namespace-namemenunjukkan namespace tempat Service tersebut berada. -
Saat sebuah Pod mengakses domain eksternal, prioritaskan penggunaan FQDN, yaitu nama domain yang diakhiri titik (
.), untuk menghindari beberapa pencarian tidak perlu akibat penambahan domainsearch. Misalnya, saat Anda mengakses www.aliyun.com, gunakan FQDN www.aliyun.com..-
Dalam kluster yang menjalankan Kubernetes 1.33 atau lebih baru, Anda dapat mengonfigurasi domain pencarian sebagai satu titik (
.) (lihat Issue 125883). Hal ini secara efektif mengubah semua permintaan DNS menjadi permintaan FQDN, sehingga mencegah iterasi domain pencarian yang tidak perlu:dnsPolicy: None dnsConfig: nameservers: ["192.168.0.10"] ## Ganti 192.168.0.10 dengan clusterIP layanan kube-dns. searches: - . - default.svc.cluster.local ## Catatan: Ganti default dengan namespace aktual. - svc.cluster.local - cluster.localDengan konfigurasi di atas, file /etc/resolv.conf dalam Pod adalah sebagai berikut:
search . default.svc.cluster.local svc.cluster.local cluster.local nameserver 192.168.0.10Dengan
.sebagai domain pencarian pertama, sistem langsung memperlakukan nama domain target permintaan resolusi sebagai FQDN, mencoba menyelesaikannya secara langsung, dan menghindari pencarian yang tidak perlu.PentingAnda harus mengatur
dnsPolicykeNoneagar konfigurasi ini berlaku.
-
-
Pahami konfigurasi DNS dalam kontainer
-
Resolver DNS yang berbeda memiliki perbedaan implementasi halus, yang dapat menyebabkan
dig <domain>berhasil sementaraping <domain>gagal. -
Kami sangat merekomendasikan penggunaan gambar dasar seperti Debian atau CentOS daripada Alpine Linux. Pustaka
musl libcyang digunakan di Alpine memiliki beberapa perbedaan implementasi dibandingkan denganglibcstandar, yang menyebabkan masalah termasuk namun tidak terbatas pada:-
Versi Alpine 3.18 dan sebelumnya tidak mendukung fallback ke TCP untuk respons terpotong (TC).
-
Versi Alpine 3.3 dan sebelumnya tidak mendukung parameter search atau domain pencarian. Hal ini mengganggu penemuan layanan.
-
Permintaan konkuren ke beberapa server DNS yang dikonfigurasi dalam /etc/resolv.conf dapat melewati optimasi NodeLocal DNSCache.
-
Menggunakan soket yang sama untuk permintaan rekaman A dan AAAA secara konkuren dapat memicu konflik port sumber conntrack pada versi kernel lama, yang menyebabkan kehilangan paket.
Untuk informasi lebih lanjut tentang masalah ini, lihat dokumentasi musl libc.
-
-
Jika Anda menggunakan aplikasi Go, pahami perbedaan antara resolver DNS dalam implementasi cgo dan pure Go.
Atasi timeout DNS intermiten dalam mode IPVS
Saat kluster menggunakan IPVS sebagai mode load balancing kube-proxy, Anda mungkin mengalami timeout resolusi DNS intermiten saat CoreDNS di-scale down atau direstart. Masalah ini disebabkan oleh bug dalam kernel Linux. Untuk informasi lebih lanjut, lihat IPVS.
Anda dapat menggunakan salah satu metode berikut untuk mengurangi dampak cacat IPVS ini:
-
Gunakan NodeLocal DNSCache. Untuk informasi lebih lanjut, lihat Gunakan NodeLocal DNSCache.
-
Modifikasi timeout persistensi sesi UDP IPVS dalam kube-proxy. Untuk informasi lebih lanjut, lihat Bagaimana cara memodifikasi timeout persistensi sesi UDP IPVS dalam kube-proxy?.
Gunakan NodeLocal DNSCache
CoreDNS kadang-kadang mengalami masalah berikut:
-
Dalam kasus langka, kehilangan paket dapat terjadi karena kueri A dan AAAA konkuren, yang menyebabkan kegagalan resolusi DNS.
-
Tabel conntrack penuh pada sebuah node dapat menyebabkan kehilangan paket, yang mengarah pada kegagalan resolusi DNS.
Untuk meningkatkan stabilitas dan kinerja layanan DNS dalam kluster Anda, kami merekomendasikan Anda menginstal add-on NodeLocal DNSCache. Add-on ini meningkatkan kinerja DNS kluster dengan menjalankan cache DNS lokal pada setiap node. Untuk informasi detail tentang NodeLocal DNSCache dan cara menerapkannya dalam kluster ACK, lihat Gunakan add-on NodeLocal DNSCache.
Setelah Anda menginstal NodeLocal DNSCache, Anda harus menyuntikkan konfigurasi cache DNS ke dalam Pod Anda. Jalankan perintah berikut untuk menambahkan label ke namespace yang ditentukan. Pod baru yang dibuat dalam namespace ini akan secara otomatis memiliki konfigurasi cache DNS yang disuntikkan. Untuk informasi lebih lanjut tentang metode penyuntikan lainnya, lihat dokumentasi di atas.
kubectl label namespace default node-local-dns-injection=enabled
Gunakan versi CoreDNS yang sesuai
CoreDNS menawarkan kompatibilitas mundur yang baik dengan Kubernetes. Namun, sangat penting untuk selalu memperbarui CoreDNS ke versi stabil terbaru. Halaman Add-ons di konsol ACK memungkinkan Anda menginstal, meningkatkan, dan mengonfigurasi CoreDNS. Periksa status add-on CoreDNS di halaman Add-ons. Jika tersedia pembaruan, jadwalkan selama jam sepi.
-
Untuk informasi lebih lanjut tentang cara melakukan peningkatan, lihat Peningkatan otomatis untuk CoreDNS yang tidak dikelola.
-
Untuk catatan rilis versi CoreDNS, lihat CoreDNS.
Versi CoreDNS sebelum v1.7.0 memiliki risiko potensial, termasuk namun tidak terbatas pada:
-
Jika konektivitas antara CoreDNS dan server API tidak normal (misalnya, karena restart server API, migrasi, atau fluktuasi jaringan), CoreDNS akan restart karena gagal menulis log error. Untuk informasi lebih lanjut, lihat Set klog's logtostderr flag.
-
CoreDNS mengonsumsi memori ekstra saat startup. Batas memori default dapat menyebabkan masalah kehabisan memori (OOM) dalam kluster berskala besar. Dalam kasus parah, Pod CoreDNS dapat masuk ke loop restart dan tidak dapat dipulihkan secara otomatis. Untuk informasi lebih lanjut, lihat CoreDNS uses a lot memory during initialization phase.
-
CoreDNS memiliki beberapa masalah yang dapat memengaruhi resolusi nama domain Service headless dan nama domain di luar kluster. Untuk informasi lebih lanjut, lihat plugin/kubernetes: handle tombstones in default processor dan Data is not synced when CoreDNS reconnects to kubernetes api server after protracted disconnection.
-
Saat sebuah node kluster tidak normal, kebijakan toleransi default dalam beberapa versi CoreDNS sebelumnya dapat menyebabkan Pod CoreDNS dijadwalkan ke node yang tidak normal tanpa dievakuasi, yang mengarah pada error resolusi DNS.
Versi minimum CoreDNS yang direkomendasikan bervariasi berdasarkan versi Kubernetes kluster Anda. Tabel berikut menjelaskan detailnya.
|
Versi kluster |
Versi minimum yang direkomendasikan |
|
Sebelum 1.14.8 |
v1.6.2 (End-of-life) |
|
1.14.8 atau lebih baru, tetapi sebelum 1.20.4 |
v1.7.0.0-f59c03d-aliyun |
|
1.20.4 atau lebih baru, tetapi sebelum 1.21.0 |
v1.8.4.1-3a376cc-aliyun |
|
1.21.0 atau lebih baru |
v1.11.3.2-f57ea7ed6-aliyun |
Pantau status operasional CoreDNS
Pantau metrik
CoreDNS mengekspos metrik kesehatan, seperti hasil resolusi DNS, melalui antarmuka Prometheus standar untuk membantu mendeteksi error pada server CoreDNS bahkan pada server DNS upstream.
Managed Service for Prometheus menyediakan aturan pemantauan dan peringatan metrik bawaan untuk CoreDNS. Anda dapat mengaktifkan Prometheus dan fitur dasbornya di Konsol ACK. Untuk informasi lebih lanjut, lihat Pantau komponen CoreDNS.
Jika Anda menggunakan instance Prometheus yang dikelola sendiri untuk memantau kluster Kubernetes Anda, Anda dapat mengamati metrik terkait di Prometheus dan mengatur peringatan untuk metrik utama. Untuk informasi lebih lanjut, lihat dokumentasi resmi Prometheus CoreDNS.
Log
Jika terjadi error DNS, log CoreDNS membantu Anda mendiagnosis akar penyebabnya dengan cepat. Kami merekomendasikan Anda mengaktifkan pencatatan resolusi nama domain CoreDNS dan pengumpulan Log Service. Untuk informasi lebih lanjut, lihat Analisis dan pantau log CoreDNS.
Pengiriman event Kubernetes
Dalam CoreDNS v1.9.3.6-32932850-aliyun dan versi lebih baru, Anda dapat mengaktifkan plugin k8s_event untuk mengirimkan log kritis CoreDNS ke pusat event sebagai event Kubernetes. Untuk informasi lebih lanjut tentang plugin k8s_event, lihat k8s_event.
Fitur ini diaktifkan secara default dalam penerapan CoreDNS baru. Jika Anda meningkatkan CoreDNS dari versi sebelumnya ke v1.9.3.6-32932850-aliyun atau lebih baru, Anda perlu memodifikasi file konfigurasi secara manual untuk mengaktifkan fitur ini.
-
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 } // Awal penambahan (abaikan perbedaan lainnya) kubeapi k8s_event { level info error warning // Mengirimkan log kritis tingkat info, error, dan warning. } // Akhir penambahan kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } // ... (konfigurasi sisanya dihilangkan) } -
Periksa status dan log Pod CoreDNS. Jika log berisi kata
reload, modifikasi berhasil.
Ketersediaan tinggi CoreDNS
CoreDNS adalah otoritas DNS untuk kluster Anda. Kegagalan CoreDNS dapat mencegah akses ke Service dalam kluster dan dapat menyebabkan gangguan aplikasi secara luas. Anda dapat mengambil langkah-langkah berikut untuk memastikan ketersediaan tinggi CoreDNS:
Evaluasi beban pada CoreDNS
Anda dapat menjalankan uji stres DNS dalam kluster Anda untuk mengevaluasi beban. Banyak alat open source, seperti DNSPerf, dapat membantu Anda mencapai hal ini. Jika Anda tidak dapat mengevaluasi beban DNS dalam kluster Anda secara akurat, rujuk rekomendasi berikut.
-
Kami merekomendasikan Anda mengatur jumlah Pod CoreDNS minimal 2 dalam semua skenario. Batas resource untuk satu Pod harus minimal 1 core dan 1 GiB memori.
-
QPS resolusi DNS yang dapat disediakan CoreDNS berkorelasi positif dengan konsumsi CPU. Dengan NodeLocal DNSCache, setiap core CPU biasanya dapat mendukung lebih dari 10.000 QPS. Persyaratan QPS untuk permintaan DNS sangat bervariasi antar jenis layanan. Anda dapat mengamati penggunaan CPU puncak setiap Pod CoreDNS. Jika konsumsi CPU melebihi satu core selama jam sibuk, lakukan scale-out replika CoreDNS. Jika Anda tidak dapat menentukan penggunaan CPU puncak, gunakan rasio replika-ke-node konservatif 1:8.
Sesuaikan replika CoreDNS
Jumlah replika CoreDNS secara langsung menentukan resource komputasi yang dapat digunakan CoreDNS. Anda dapat menyesuaikan jumlah replika CoreDNS berdasarkan evaluasi Anda.
Karena kurangnya mekanisme pengiriman ulang dalam UDP, jika ada risiko kehilangan paket pada node kluster akibat cacat UDP IPVS, melakukan scale-in atau restart Pod CoreDNS dapat menyebabkan timeout atau error resolusi DNS di seluruh kluster hingga lima menit. Untuk informasi lebih lanjut tentang cara menyelesaikan error resolusi yang disebabkan oleh cacat IPVS, lihat Pemecahan masalah error resolusi DNS.
-
Menyesuaikan secara otomatis berdasarkan kebijakan yang direkomendasikan
Anda dapat menerapkan
dns-autoscalerberikut. Alat ini secara otomatis menyesuaikan jumlah replika CoreDNS secara real-time berdasarkan rasio replika-ke-node 1:8 yang direkomendasikan. Jumlah replika dihitung menggunakan rumus berikut: replika = max(ceil(core × 1/corePerReplika), ceil(node × 1/nodePerReplika)). Hasilnya juga dibatasi oleh nilaimaxdanmin. -
Menyesuaikan secara manual
Anda dapat menjalankan perintah berikut untuk menyesuaikan jumlah replika CoreDNS secara manual:
kubectl scale --replicas={target} deployment/coredns -n kube-system # Ganti {target} dengan jumlah replika yang diinginkan. -
Jangan gunakan auto-scaling beban kerja
Meskipun mekanisme auto-scaling beban kerja, seperti Horizontal Pod Autoscaler (HPA) dan CronHPA, juga dapat menyesuaikan jumlah replika, mekanisme ini melakukan penskalaan yang sering. Karena scale-in dapat menyebabkan error resolusi, jangan gunakan auto-scaling beban kerja untuk CoreDNS.
Sesuaikan spesifikasi Pod CoreDNS
Anda juga dapat menyesuaikan resource CoreDNS dengan memodifikasi spesifikasi Pod. Dalam kluster ACK managed Pro, batas memori default untuk Pod CoreDNS adalah 2 GiB, tanpa batas CPU. Untuk kinerja yang konsisten, kami merekomendasikan batas CPU minimal 1024m. Anda dapat menyesuaikan permintaan dan batas resource ini di konsol.
Jadwalkan Pod CoreDNS
Konfigurasi penjadwalan yang salah dapat mencegah Pod CoreDNS diterapkan, yang menyebabkan kegagalan CoreDNS. Sebelum melakukan operasi ini, pastikan Anda memahami penjadwalan.
Kami merekomendasikan Anda menerapkan Pod CoreDNS di zona ketersediaan berbeda dan pada node kluster berbeda untuk mencegah single point of failure. Versi add-on CoreDNS sebelum v1.8.4.3 memiliki anti-afinitas node yang disukai secara default, yang dapat menyebabkan Pod diterapkan pada node yang sama jika resource tidak mencukupi. Jika hal ini terjadi, hapus Pod untuk memicu penjadwalan ulang atau tingkatkan add-on ke versi terbaru. Versi add-on CoreDNS sebelum v1.8 tidak lagi dipelihara. Segera tingkatkan ke versi terbaru.
Pastikan node yang menjalankan CoreDNS tidak jenuh dengan penggunaan CPU atau memori tinggi, karena hal ini memengaruhi QPS dan latensi respons resolusi DNS. Jika resource node kluster memungkinkan, pertimbangkan untuk menggunakan parameter khusus untuk menjadwalkan CoreDNS ke node kluster independen guna menyediakan layanan resolusi DNS yang stabil.
Optimalkan konfigurasi CoreDNS
ACK menyediakan konfigurasi default untuk CoreDNS. Anda harus meninjau parameter dalam konfigurasi dan mengoptimalkannya untuk memastikan CoreDNS dapat menyediakan layanan DNS yang tepat untuk kontainer bisnis Anda. CoreDNS sangat dapat dikonfigurasi. Untuk informasi lebih lanjut, lihat Konfigurasikan kebijakan DNS dan resolusi nama domain dan dokumentasi resmi CoreDNS.
Konfigurasi CoreDNS default dalam kluster Kubernetes lama mungkin memiliki beberapa risiko. Kami merekomendasikan Anda memeriksa dan mengoptimalkan item berikut:
Anda juga dapat menggunakan fitur inspeksi terjadwal dan diagnosis kesalahan dari Container Intelligence Service untuk memeriksa file konfigurasi CoreDNS. Jika layanan melaporkan konfigurasi ConfigMap CoreDNS yang tidak normal, tinjau item yang tercantum di atas.
CoreDNS dapat mengonsumsi memori ekstra saat menyegarkan konfigurasinya. Setelah Anda memodifikasi ConfigMap CoreDNS, pantau status Pod. Jika Pod memiliki memori tidak mencukupi, segera modifikasi batas memori kontainer dalam Deployment CoreDNS. Kami merekomendasikan Anda menyesuaikan memori menjadi 2 GiB.
Nonaktifkan afinitas untuk layanan kube-dns
Konfigurasi afinitas dapat menyebabkan ketidakseimbangan beban signifikan antara replika CoreDNS yang berbeda. Kami merekomendasikan Anda mengikuti langkah-langkah berikut untuk menonaktifkannya:
Konsol
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di 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 bidang sessionAffinity diatur ke
None, Anda dapat melewati langkah-langkah berikut. -
Jika bidang sessionAffinity diatur ke
ClientIP, lakukan langkah-langkah berikut.
-
-
Hapus bidang sessionAffinity dan sessionAffinityConfig serta semua sub-kuncinya. Lalu, klik Update.
# Hapus semua konten berikut. sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 -
Klik Edit YAML di sebelah kanan layanan kube-dns lagi. Verifikasi bahwa bidang sessionAffinity diatur ke
None. NilaiNonemenunjukkan bahwa layanan Kube-DNS berhasil diperbarui.
CLI
-
Jalankan perintah berikut untuk melihat detail konfigurasi layanan kube-dns:
kubectl -n kube-system get svc kube-dns -o yaml-
Jika bidang sessionAffinity diatur ke
None, Anda dapat melewati langkah-langkah berikut. -
Jika bidang sessionAffinity diatur ke
ClientIP, lakukan langkah-langkah berikut.
-
-
Jalankan perintah berikut untuk membuka dan mengedit layanan bernama kube-dns:
kubectl -n kube-system edit service kube-dns -
Hapus pengaturan terkait sessionAffinity (sessionAffinity, sessionAffinityConfig, dan semua sub-kuncinya), lalu simpan dan keluar.
# Hapus semua konten berikut. sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 -
Setelah modifikasi selesai, jalankan perintah berikut lagi untuk memeriksa apakah bidang sessionAffinity adalah
None. Jika nilainyaNone, layanan Kube-DNS berhasil diubah.kubectl -n kube-system get svc kube-dns -o yaml
Nonaktifkan plugin autopath
Plugin autopath, yang diaktifkan dalam beberapa versi CoreDNS awal, dapat menyebabkan error resolusi dalam kasus tertentu. Periksa apakah plugin diaktifkan dan nonaktifkan dengan mengedit file konfigurasi. Untuk informasi lebih lanjut, lihat Autopath.
Setelah Anda menonaktifkan plugin autopath, QPS untuk permintaan resolusi DNS sisi klien dapat meningkat hingga tiga kali lipat, dan waktu yang dibutuhkan untuk menyelesaikan satu nama domain juga dapat meningkat hingga tiga kali lipat. Pantau beban CoreDNS dan dampaknya terhadap layanan Anda.
-
Jalankan perintah
kubectl -n kube-system edit configmap corednsuntuk membuka file konfigurasi CoreDNS. -
Hapus baris
autopath @kubernetes, lalu simpan dan keluar. -
Periksa status dan log Pod CoreDNS. Jika log berisi kata
reload, modifikasi berhasil.
Konfigurasikan shutdown yang mulus untuk CoreDNS
lameduck adalah mekanisme shutdown yang mulus dalam CoreDNS. Mekanisme ini memastikan bahwa saat CoreDNS dihentikan atau direstart, permintaan yang sedang berlangsung diselesaikan dengan benar dan tidak terputus secara tiba-tiba. Mekanisme lameduck bekerja sebagai berikut:
-
Saat proses CoreDNS akan dihentikan, ia memasuki mode lameduck.
-
Dalam mode
lameduck, CoreDNS berhenti menerima permintaan baru tetapi terus memproses permintaan yang telah diterima hingga semua permintaan selesai atau periode timeoutlameduckterlampaui.
Konsol
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di namespace kube-system, klik Edit YAML di sebelah kanan ConfigMap coredns.
-
Rujuk file konfigurasi CoreDNS berikut. Pastikan plugin health diaktifkan dan sesuaikan timeout lameduck menjadi
15s. Lalu, klik OK.
.:53 {
errors
# Plugin health mungkin memiliki pengaturan berbeda di versi CoreDNS yang berbeda.
# Skenario 1: Plugin health tidak diaktifkan secara default.
# Skenario 2: Plugin health diaktifkan secara default, tetapi waktu lameduck tidak diatur.
# health
# Skenario 3: Plugin health diaktifkan secara default, dan waktu lameduck diatur ke 5s.
# health {
# lameduck 5s
# }
# Untuk ketiga skenario, modifikasi konfigurasi sebagai berikut untuk mengatur parameter lameduck ke 15s.
health {
lameduck 15s
}
# Plugin lain tidak perlu dimodifikasi dan dihilangkan di sini.
}
Jika Pod CoreDNS berjalan sebagaimana mestinya, konfigurasi shutdown yang mulus berhasil diperbarui. Jika Pod CoreDNS tidak normal, Anda dapat melihat event dan log Pod untuk mengidentifikasi penyebabnya.
CLI
-
Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS:
-
Rujuk Corefile berikut. Pastikan plugin
healthdiaktifkan dan sesuaikan parameter lameduck menjadi15s. -
Setelah Anda memodifikasi file konfigurasi CoreDNS, simpan dan keluar.
-
Jika CoreDNS berjalan sebagaimana mestinya, konfigurasi shutdown yang mulus berhasil diperbarui. Jika Pod CoreDNS tidak normal, Anda dapat melihat event dan log Pod untuk mengidentifikasi penyebabnya.
kubectl -n kube-system edit configmap/coredns
.:53 {
errors
# Plugin health mungkin memiliki pengaturan berbeda di versi CoreDNS yang berbeda.
# Skenario 1: Plugin health tidak diaktifkan secara default.
# Skenario 2: Plugin health diaktifkan secara default, tetapi waktu lameduck tidak diatur.
# health
# Skenario 3: Plugin health diaktifkan secara default, dan waktu lameduck diatur ke 5s.
# health {
# lameduck 5s
# }
# Untuk ketiga skenario, modifikasi konfigurasi sebagai berikut untuk mengatur parameter lameduck ke 15s.
health {
lameduck 15s
}
# Plugin lain tidak perlu dimodifikasi dan dihilangkan di sini.
}
Konfigurasikan protokol plugin forward
Saat menggunakan NodeLocal DNSCache, rantai komunikasi adalah: Aplikasi → NodeLocal DNSCache (TCP) → CoreDNS (TCP). Secara default, CoreDNS kemudian berkomunikasi dengan server DNS upstream menggunakan protokol yang sama dengan permintaan sumber. Artinya, permintaan resolusi nama domain eksternal dari workload Anda melewati NodeLocal DNSCache dan CoreDNS, lalu dikirim ke server DNS VPC (dua alamat IP 100.100.2.136 dan 100.100.2.138 yang dikonfigurasi secara default pada Instance ECS) melalui TCP.
Server DNS VPC memiliki dukungan terbatas untuk TCP. Jika Anda menggunakan NodeLocal DNSCache, Anda perlu memodifikasi konfigurasi CoreDNS agar selalu memprioritaskan UDP untuk komunikasi dengan server DNS upstream guna menghindari error resolusi. Modifikasi file konfigurasi CoreDNS, yaitu ConfigMap bernama coredns di namespace kube-system. Untuk informasi lebih lanjut, lihat Kelola ConfigMaps. Di plugin forward, tentukan protokol untuk permintaan upstream sebagai prefer_udp. Setelah modifikasi, CoreDNS akan memprioritaskan UDP untuk komunikasi upstream. Modifikasinya sebagai berikut:
# Sebelum modifikasi
forward . /etc/resolv.conf
# Setelah modifikasi
forward . /etc/resolv.conf {
prefer_udp
}
Konfigurasikan plugin ready
Versi CoreDNS 1.5.0 dan lebih baru memerlukan plugin ready untuk diaktifkan guna mengaktifkan pemeriksaan kesiapan.
-
Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS:
kubectl -n kube-system edit configmap/coredns -
Periksa apakah file berisi baris dengan
ready. Jika tidak, tambahkan barisready, tekan tombol Esc, masukkan:wq!, lalu tekan Enter untuk menyimpan file konfigurasi yang dimodifikasi dan keluar dari mode edit.apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready # Jika baris ini tidak ada, tambahkan. 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
CoreDNS v1.12.1 memperkenalkan plugin multisocket. Anda dapat mengaktifkan plugin ini untuk memungkinkan CoreDNS mendengarkan pada port yang sama menggunakan beberapa soket, yang meningkatkan kinerja CoreDNS dalam skenario CPU tinggi. Untuk informasi lebih lanjut tentang plugin ini, lihat dokumentasi komunitas.
Anda perlu mengaktifkan multisocket dalam 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: Sesuaikan NUM_SOCKETS dengan perkiraan utilisasi CPU, batas resource CPU, dan resource kluster yang tersedia, misalnya:
-
Jika CoreDNS mengonsumsi 4 core selama jam sibuk dan resource yang tersedia adalah 8 core, atur
NUM_SOCKETSke 2. -
Jika CoreDNS mengonsumsi 8 core selama jam sibuk dan 64 core tersedia, atur
NUM_SOCKETSke 8.
Untuk menentukan konfigurasi optimal, kami merekomendasikan Anda menguji QPS dan beban dengan konfigurasi berbeda.
Jika Anda tidak menentukan NUM_SOCKETS, nilai defaultnya adalah GOMAXPROCS, yang sama dengan batas CPU Pod CoreDNS. Jika batas CPU Pod tidak diatur, nilainya sama dengan jumlah core CPU pada node tempat Pod tersebut berjalan.

