DNS merupakan layanan kritis dalam kluster Kubernetes. Dalam kondisi tertentu, seperti konfigurasi klien yang tidak tepat atau pada kluster berskala besar, DNS dapat mengalami timeout dan kegagalan resolusi. Topik ini menyediakan praktik terbaik untuk DNS di kluster Kubernetes guna membantu Anda menghindari masalah tersebut.
Catatan
Topik ini tidak berlaku untuk edisi terkelola CoreDNS atau kluster ACK yang telah mengaktifkan Auto Mode. Edisi terkelola CoreDNS secara otomatis melakukan scaling berdasarkan beban, sehingga tidak memerlukan penyesuaian manual.
Dalam topik ini
Praktik terbaik DNS mencakup optimasi sisi klien dan sisi server:
-
Pada sisi klien, Anda dapat mengoptimalkan permintaan resolusi nama domain untuk mengurangi latensi dan meminimalkan kegagalan resolusi dengan menggunakan gambar kontainer, sistem operasi node, dan NodeLocal DNSCache yang sesuai.
-
Pada sisi server CoreDNS, Anda dapat mengidentifikasi anomali DNS dan segera menemukan akar penyebabnya dengan memantau status operasional CoreDNS. Anda juga dapat menyesuaikan penerapan CoreDNS untuk meningkatkan ketersediaan tinggi dan throughput permintaan per detik (QPS).
Untuk informasi lebih lanjut tentang CoreDNS, lihat dokumentasi resmi CoreDNS.
Optimalkan permintaan resolusi nama domain
Resolusi DNS merupakan salah satu operasi jaringan paling sering dilakukan dalam kluster Kubernetes. Banyak dari permintaan ini dapat dioptimalkan atau dihindari untuk mengurangi latensi dan beban pada infrastruktur DNS. Anda dapat mengoptimalkan permintaan resolusi nama domain dengan cara berikut:
-
(Direkomendasikan) Gunakan kolam koneksi: Ketika aplikasi dalam kontainer sering meminta layanan lain, gunakan kolam koneksi untuk menyimpan koneksi aktif ke layanan hulu dalam memori. Hal ini menghilangkan overhead resolusi DNS dan handshake TCP untuk setiap permintaan.
-
Gunakan mode asinkron atau long-polling untuk mendapatkan alamat IP suatu nama domain.
-
Gunakan cache DNS:
-
(Direkomendasikan) Jika aplikasi Anda tidak dapat dimodifikasi untuk menggunakan kolam koneksi, pertimbangkan untuk menyimpan hasil resolusi DNS di sisi aplikasi. Untuk informasi lebih lanjut, lihat Gunakan NodeLocal DNSCache.
-
Jika Anda tidak dapat menggunakan NodeLocal DNSCache, Anda dapat menggunakan cache Name Service Cache Daemon (NSCD) bawaan dalam kontainer Anda. Untuk informasi lebih lanjut, lihat Gunakan NSCD dalam kluster Kubernetes.
-
-
Optimalkan file resolv.conf: Karena mekanisme parameter ndots dan search dalam file resolv.conf, cara Anda menulis nama domain dalam kontainer menentukan efisiensi resolusi nama domain. Untuk informasi lebih lanjut tentang mekanisme parameter ndots dan search, lihat Konfigurasi Kebijakan DNS dan Resolusi Nama Domain.
-
Optimalkan konfigurasi nama domain: Saat aplikasi dalam kontainer mengakses nama domain, konfigurasikan sebagai berikut untuk meminimalkan upaya resolusi dan mengurangi latensi resolusi.
-
Untuk mengakses layanan dalam namespace yang sama dari sebuah Pod, gunakan
<service-name>, di manaservice-nameadalah nama layanan tersebut. -
Untuk mengakses layanan dalam namespace berbeda dari sebuah Pod, gunakan
<service-name>.<namespace-name>, di mananamespace-nameadalah namespace tempat layanan tersebut berada. -
Saat sebuah Pod mengakses nama domain eksternal, gunakan Fully Qualified Domain Name (FQDN), yang diakhiri dengan titik (.), untuk mencegah beberapa pencarian DNS tidak valid yang disebabkan oleh penambahan domain dari daftar
search. Misalnya, untuk mengakses www.aliyun.com, gunakan FQDN-nya www.aliyun.com..-
Pada kluster yang menjalankan Kubernetes 1.22 atau lebih baru, Anda dapat mengonfigurasi domain pencarian sebagai satu titik (.) untuk mencapai efek serupa (lihat Issue 125883):
dnsPolicy: None dnsConfig: nameservers: ["192.168.0.10"] ## Ganti dengan ClusterIP aktual layanan CoreDNS Anda. searches: - . - default.svc.cluster.local ## Catatan: Ganti default dengan namespace aktual. - svc.cluster.local - cluster.localSetelah menerapkan konfigurasi di atas, file /etc/resolv.conf dalam Pod dikonfigurasi sebagai berikut:
search . default.svc.cluster.local svc.cluster.local cluster.local nameserver 192.168.0.10Domain pencarian pertama adalah ".", yang membuat resolver memperlakukan domain target sebagai FQDN. Resolver pertama kali mencoba menyelesaikan nama domain apa adanya, melewati ekspansi domain pencarian yang tidak perlu.
PentingAnda harus mengatur
dnsPolicykeNoneagar konfigurasi di atas berlaku.
-
-
Pahami konfigurasi DNS dalam kontainer
-
Resolver DNS yang berbeda dapat berperilaku berbeda karena variasi implementasi. Anda mungkin menemui kasus di mana
dig <domain>berhasil tetapiping <domain>gagal. -
Hindari penggunaan Alpine sebagai gambar dasar. Gunakan gambar dasar lain, seperti Debian atau CentOS. Pustaka
musl libcyang dibangun dalam gambar kontainer Alpine memiliki beberapa perbedaan implementasi dibandingkan glibc standar, yang dapat menyebabkan masalah termasuk namun tidak terbatas pada hal berikut:-
Fallback TCP: Alpine 3.18 dan versi sebelumnya tidak mendukung fallback ke TCP ketika flag truncated (TC) dikembalikan.
-
Domain pencarian: Alpine 3.3 dan versi sebelumnya tidak mendukung parameter search, yang mengganggu penemuan layanan.
-
Konflik optimasi: Alpine melakukan kueri secara konkuren ke semua server DNS yang dikonfigurasi dalam /etc/resolv.conf, yang dapat mem-bypass dan membatalkan optimasi NodeLocal DNSCache.
-
Kondisi race conntrack: Permintaan rekaman A dan AAAA secara konkuren yang menggunakan soket yang sama dapat memicu konflik port sumber conntrack pada kernel Linux lama, yang mengakibatkan kehilangan paket.
Untuk informasi lebih lanjut tentang masalah ini, lihat musl libc.
-
-
Jika Anda menggunakan aplikasi Go, waspadai perbedaan antara resolver DNS dalam implementasi CGO dan Pure GO.
Hindari timeout DNS yang disebabkan oleh cacat IPVS
Saat kluster menggunakan IPVS sebagai mode load balancing kube-proxy, Anda mungkin mengalami timeout resolusi DNS probabilistik saat CoreDNS diskalakan turun atau direstart. Masalah ini disebabkan oleh cacat pada kernel Linux komunitas. Untuk informasi lebih lanjut, lihat IPVS.
Anda dapat menggunakan salah satu metode berikut untuk mengurangi dampak cacat IPVS:
-
Gunakan NodeLocal DNSCache. Untuk informasi lebih lanjut, lihat Gunakan NodeLocal DNSCache.
-
Ubah periode timeout persistensi sesi UDP IPVS dalam kube-proxy. Untuk informasi lebih lanjut, lihat Bagaimana cara mengubah periode timeout persistensi sesi UDP IPVS dalam kube-proxy?.
Gunakan NodeLocal DNSCache
CoreDNS mungkin mengalami masalah berikut:
-
Dalam kasus langka, kueri A dan AAAA secara konkuren dapat menyebabkan kehilangan paket, yang mengarah pada kegagalan resolusi DNS.
-
Tabel
conntrackpenuh pada sebuah node dapat menyebabkan kehilangan paket, yang mengarah pada kegagalan resolusi DNS.
Untuk meningkatkan stabilitas dan performa DNS dalam kluster Anda, instal komponen NodeLocal DNSCache. Komponen ini meningkatkan performa DNS kluster dengan menjalankan cache DNS pada setiap node kluster. Untuk informasi lebih lanjut tentang NodeLocal DNSCache dan cara menerapkannya dalam kluster ACK, lihat Gunakan komponen NodeLocal DNSCache.
Setelah Anda menginstal NodeLocal DNSCache, Anda harus menyuntikkan konfigurasi cache DNS ke dalam Pod Anda. Anda dapat menjalankan perintah berikut untuk menambahkan label ke namespace tertentu. 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 yang dirujuk pada paragraf sebelumnya.
kubectl label namespace default node-local-dns-injection=enabled
Gunakan versi CoreDNS yang sesuai
CoreDNS menawarkan kompatibilitas mundur yang baik dengan versi Kubernetes. Selalu perbarui CoreDNS ke versi stabil terbaru. Halaman Add-ons di konsol ACK memungkinkan Anda menginstal, meningkatkan, dan mengonfigurasi CoreDNS. Periksa status komponen CoreDNS di halaman Add-ons. Jika tersedia pembaruan, jadwalkan pembaruan tersebut selama jam sepi.
-
Untuk informasi lebih lanjut tentang cara meningkatkan CoreDNS, lihat Peningkatan otomatis untuk CoreDNS yang tidak dikelola.
-
Untuk catatan rilis CoreDNS, lihat CoreDNS.
Versi CoreDNS sebelum v1.7.0 memiliki beberapa risiko potensial, termasuk:
-
Saat konektivitas antara CoreDNS dan server API tidak normal, misalnya karena restart, migrasi, atau fluktuasi jaringan server API, CoreDNS mungkin 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 mungkin memicu masalah kehabisan memori (OOM) pada kluster berskala besar. Dalam kasus parah, hal ini dapat menyebabkan Pod CoreDNS masuk ke loop restart dan gagal pulih. Untuk informasi lebih lanjut, lihat CoreDNS uses a lot memory during initialization phase.
-
CoreDNS memiliki beberapa masalah yang dapat memengaruhi resolusi nama domain layanan 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.
-
Jika sebuah node kluster menjadi abnormal, kebijakan toleransi default pada beberapa versi CoreDNS sebelumnya mungkin menyebabkan Pod CoreDNS dijadwalkan ke node abnormal tersebut. Pod ini tidak dapat dievakuasi secara otomatis, yang mengarah pada kegagalan resolusi DNS.
Versi minimum CoreDNS yang direkomendasikan bervariasi tergantung pada versi Kubernetes kluster.
|
Versi kluster |
Versi CoreDNS minimum |
|
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 dan lebih baru |
v1.11.3.2-f57ea7ed6-aliyun |
Pantau status operasional CoreDNS
Metrik
CoreDNS mengekspos metrik kesehatan, termasuk hasil resolusi, melalui antarmuka Prometheus standar. Hal ini membantu mendeteksi anomali pada server CoreDNS bahkan server DNS hulu.
Managed Service for Prometheus menyediakan dasbor pemantauan metrik bawaan dan aturan peringatan 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 yang relevan di Prometheus dan menyiapkan peringatan untuk indikator kunci. Untuk informasi lebih lanjut, lihat dokumentasi resmi CoreDNS untuk Prometheus.
Log
Jika terjadi anomali DNS, log CoreDNS dapat membantu Anda mendiagnosis akar penyebabnya dengan cepat. Kami merekomendasikan Anda mengaktifkan logging resolusi nama domain CoreDNS dan mengumpulkan log-nya dengan Log Service. Untuk informasi lebih lanjut, lihat Analisis dan pantau log CoreDNS.
Pengiriman event Kubernetes
Pada CoreDNS v1.9.3.6-32932850-aliyun dan versi lebih baru, Anda dapat mengaktifkan plugin k8s_event untuk mengirimkan log CoreDNS kritis sebagai event Kubernetes ke Pusat Insiden. Untuk informasi lebih lanjut tentang plugin k8s_event, lihat k8s_event.
Fitur ini diaktifkan secara default pada penerapan CoreDNS baru. Jika Anda meningkatkan dari versi sebelumnya ke CoreDNS v1.9.3.6-32932850-aliyun atau lebih baru, Anda perlu memodifikasi file konfigurasi secara manual untuk mengaktifkannya.
-
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 // Kirim log kritis dengan status info, error, dan warning. } // Akhir penambahan. kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } // ... (konten sisanya dihilangkan) } -
Periksa status operasional dan log Pod CoreDNS. Jika log berisi kata
reload, modifikasi berhasil.
Pastikan ketersediaan tinggi CoreDNS
CoreDNS adalah otoritas DNS untuk kluster. Kegagalan CoreDNS dapat menyebabkan kegagalan akses layanan dalam kluster, yang berpotensi menyebabkan ketidaktersediaan layanan secara luas. Anda dapat mengambil langkah-langkah berikut untuk memastikan ketersediaan tinggi CoreDNS:
Evaluasi tekanan komponen CoreDNS
Anda dapat melakukan uji stres DNS dalam kluster untuk mengevaluasi tekanan komponen. Banyak alat open-source, termasuk DNSPerf, dapat membantu Anda dalam hal ini. Jika Anda tidak dapat mengevaluasi tekanan DNS dalam kluster Anda secara akurat, ikuti rekomendasi berikut.
-
Selalu atur jumlah Pod CoreDNS minimal 2, dengan batas resource minimal 1 core dan 1 GiB untuk satu Pod.
-
QPS resolusi nama domain CoreDNS berkorelasi positif dengan konsumsi CPU-nya. Dengan NodeLocal DNSCache diaktifkan, setiap core CPU dapat mendukung lebih dari 10.000 QPS. Permintaan QPS untuk permintaan nama domain sangat bervariasi tergantung jenis layanan. Anda dapat mengamati penggunaan CPU puncak setiap Pod CoreDNS. Jika sebuah Pod menggunakan lebih dari satu core CPU selama jam sibuk, kami merekomendasikan Anda melakukan scale out replika CoreDNS. Jika Anda tidak dapat menentukan penggunaan CPU puncak, Anda dapat secara konservatif menggunakan rasio 1:8 antara Pod dan node kluster. Artinya, untuk setiap 8 node kluster yang Anda tambahkan, tambahkan satu Pod CoreDNS.
Sesuaikan jumlah Pod CoreDNS
Jumlah Pod CoreDNS secara langsung menentukan sumber daya komputasi yang dapat digunakan CoreDNS. Anda dapat menyesuaikan jumlah Pod CoreDNS berdasarkan evaluasi Anda.
Karena kurangnya mekanisme pengiriman ulang pada paket UDP, jika ada risiko kehilangan paket pada node kluster akibat cacat UDP IPVS, scaling in atau restart Pod CoreDNS dapat menyebabkan timeout atau anomali resolusi DNS di seluruh kluster hingga lima menit. Untuk solusi anomali resolusi yang disebabkan oleh cacat IPVS, lihat Pemecahan masalah resolusi DNS.
-
Menyesuaikan secara otomatis berdasarkan kebijakan yang direkomendasikan
Anda dapat menerapkan
dns-autoscalerberikut. Alat ini secara otomatis menyesuaikan jumlah Pod CoreDNS secara real-time berdasarkan kebijakan yang direkomendasikan (rasio 1:8 antara Pod dan node kluster). Jumlah Pod dihitung menggunakan rumus berikut: replicas = max(ceil(cores × 1/coresPerReplica), ceil(nodes × 1/nodesPerReplica)), dan dibatasi oleh parametermaxdanmin. -
Menyesuaikan secara manual
Anda dapat menjalankan perintah berikut untuk menyesuaikan jumlah Pod CoreDNS secara manual.
kubectl scale --replicas={target} deployment/coredns -n kube-system # Ganti {target} dengan jumlah Pod yang diinginkan. -
Jangan gunakan auto-scaling beban kerja
Meskipun fitur auto-scaling beban kerja seperti Horizontal Pod Autoscaler (HPA) dan CronHPA juga dapat menyesuaikan jumlah Pod secara otomatis, fitur ini melakukan operasi scaling yang sering. Karena anomali resolusi yang terjadi saat Pod diskalakan turun, jangan gunakan auto-scaling beban kerja untuk mengontrol jumlah Pod CoreDNS.
Sesuaikan spesifikasi Pod CoreDNS
Cara lain untuk menyesuaikan resource CoreDNS adalah dengan memodifikasi spesifikasi Pod. Pada kluster ACK managed Pro, batas memori default untuk Pod CoreDNS adalah 2Gi, tanpa batas CPU. Atur 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 mengarah pada kegagalan CoreDNS. Sebelum melakukan operasi ini, pastikan Anda memahami penjadwalan.
Kami merekomendasikan Anda menerapkan Pod CoreDNS di berbagai zona ketersediaan dan node kluster untuk menghindari kegagalan single-node atau single-zona ketersediaan. Versi komponen CoreDNS sebelum v1.8.4.3 memiliki kebijakan anti-afinitas lunak default di tingkat node, yang dapat menyebabkan beberapa atau semua Pod diterapkan pada node yang sama jika sumber daya tidak mencukupi. Jika hal ini terjadi, hapus Pod untuk memicu penjadwalan ulang, atau tingkatkan komponen ke versi terbaru. Versi komponen CoreDNS sebelum v1.8 tidak lagi dipelihara dan harus segera ditingkatkan.
Node kluster tempat CoreDNS berjalan sebaiknya tidak memiliki CPU atau memori yang sepenuhnya terpakai, karena hal ini memengaruhi QPS dan latensi respons resolusi nama domain. Saat kondisi node kluster memungkinkan, pertimbangkan untuk menggunakan parameter khusus untuk menjadwalkan CoreDNS ke node kluster khusus guna menyediakan layanan resolusi nama domain yang stabil.
Optimalkan konfigurasi CoreDNS
ACK menyediakan konfigurasi default untuk CoreDNS. Anda harus meninjau dan mengoptimalkan parameter ini untuk memastikan CoreDNS dapat menyediakan layanan DNS yang tepat untuk kontainer bisnis Anda. 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 kluster Kubernetes sebelumnya mungkin memiliki beberapa risiko. Periksa dan optimalkan sebagai berikut:
Anda juga dapat menggunakan fitur inspeksi terjadwal dan diagnosis kesalahan dari Container Intelligence Service untuk memeriksa file konfigurasi CoreDNS. Jika hasil inspeksi dari Container Intelligence Service menunjukkan pengecualian konfigurasi ConfigMap CoreDNS, periksa setiap item di atas.
CoreDNS mungkin mengonsumsi memori ekstra saat menyegarkan konfigurasinya. Setelah Anda memodifikasi ConfigMap CoreDNS, amati status Pod. Jika sebuah Pod kehabisan memori, segera tingkatkan batas memori kontainer dalam Penyebaran CoreDNS. Sesuaikan batas memori menjadi 2 GB.
Nonaktifkan afinitas sesi untuk kube-dns
Afinitas sesi dapat menyebabkan ketidakseimbangan beban signifikan antara replika CoreDNS. Nonaktifkan dengan mengikuti langkah-langkah berikut:
Konsol
Masuk ke Konsol ACK atau . 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, tidak diperlukan tindakan lebih lanjut. -
Jika bidang sessionAffinity diatur ke
ClientIP, lanjutkan dengan langkah-langkah berikut.
-
-
Hapus bidang sessionAffinity dan sessionAffinityConfig beserta 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 dan verifikasi bahwa bidang sessionAffinity diatur ke
None. NilaiNonemenunjukkan bahwa layanan Kube-DNS berhasil dimodifikasi.
CLI
-
Jalankan perintah berikut untuk melihat informasi konfigurasi layanan kube-dns.
kubectl -n kube-system get svc kube-dns -o yaml-
Jika bidang sessionAffinity diatur ke
None, tidak diperlukan tindakan lebih lanjut. -
Jika bidang sessionAffinity diatur ke
ClientIP, lanjutkan dengan 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 diatur ke
None. Jika nilainyaNone, perubahan pada layanan Kube-DNS berhasil.kubectl -n kube-system get svc kube-dns -o yaml
Nonaktifkan plugin autopath
Beberapa versi CoreDNS sebelumnya mengaktifkan plugin autopath, yang dapat menyebabkan error resolusi dalam beberapa kasus tepi. Periksa apakah plugin tersebut diaktifkan dan edit file konfigurasi untuk menonaktifkannya. Untuk informasi lebih lanjut, lihat Autopath.
Setelah Anda menonaktifkan plugin autopath, QPS 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 dampak bisnisnya.
-
Jalankan perintah
kubectl -n kube-system edit configmap corednsuntuk membuka file konfigurasi CoreDNS. -
Hapus baris
autopath @kubernetesdan simpan file tersebut. -
Periksa status operasional dan log Pod CoreDNS. Jika log berisi kata
reload, modifikasi berhasil.
Konfigurasikan shutdown yang mulus
lameduck adalah mekanisme dalam CoreDNS yang memungkinkan shutdown yang mulus. Mekanisme ini memastikan bahwa saat CoreDNS perlu berhenti atau restart, permintaan yang sedang berlangsung diselesaikan tanpa terputus secara tiba-tiba. lameduck bekerja sebagai berikut:
-
Saat proses CoreDNS akan dihentikan, proses tersebut memasuki mode Lameduck.
-
Dalam mode
lameduck, CoreDNS berhenti menerima permintaan baru tetapi terus memproses permintaan yang ada hingga semuanya selesai atau periode timeoutlameduckterlampaui.
Konsol
Masuk ke Konsol ACK atau . 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.
-
Dalam file konfigurasi CoreDNS, pastikan plugin health diaktifkan dan atur timeout lameduck ke
15s. Lalu, klik OK.
.:53 {
errors
# Plugin health mungkin memiliki pengaturan berbeda di berbagai versi CoreDNS.
# Skenario 1: Plugin health tidak diaktifkan secara default.
# Skenario 2: Plugin health diaktifkan, tetapi durasi lameduck tidak diatur.
# health
# Skenario 3: Plugin health diaktifkan, dan durasi lameduck diatur ke 5s.
# health {
# lameduck 5s
# }
# Untuk ketiga skenario tersebut, 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 normal, perubahan berhasil. Jika sebuah Pod CoreDNS menjadi abnormal, Anda dapat mengidentifikasi penyebabnya dengan melihat event dan log-nya.
CLI
-
Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS.
-
Dalam Corefile, pastikan plugin
healthdiaktifkan dan atur parameter lameduck ke15s. -
Simpan dan keluar setelah memodifikasi file konfigurasi CoreDNS.
-
Jika CoreDNS berjalan normal, perubahan berhasil. Jika sebuah Pod CoreDNS menjadi abnormal, Anda dapat mengidentifikasi penyebabnya dengan melihat event dan log-nya.
kubectl -n kube-system edit configmap/coredns
.:53 {
errors
# Plugin health mungkin memiliki pengaturan berbeda di berbagai versi CoreDNS.
# Skenario 1: Plugin health tidak diaktifkan secara default.
# Skenario 2: Plugin health diaktifkan, tetapi durasi lameduck tidak diatur.
# health
# Skenario 3: Plugin health diaktifkan, dan durasi lameduck diatur ke 5s.
# health {
# lameduck 5s
# }
# Untuk ketiga skenario tersebut, modifikasi konfigurasi sebagai berikut untuk mengatur parameter lameduck ke 15s.
health {
lameduck 15s
}
# Plugin lain tidak perlu dimodifikasi dan dihilangkan di sini.
}
Konfigurasikan protokol default untuk plugin forward
NodeLocal DNSCache menggunakan TCP untuk berkomunikasi dengan CoreDNS. CoreDNS kemudian berkomunikasi dengan server DNS hulu menggunakan protokol yang sama dengan permintaan masuk. Oleh karena itu, secara default, permintaan dari kontainer bisnis untuk menyelesaikan nama domain di luar kluster melewati NodeLocal DNSCache dan CoreDNS, lalu mencapai server DNS VPC (secara default, 100.100.2.136 dan 100.100.2.138 pada Instance ECS) melalui TCP.
Server DNS VPC memiliki dukungan terbatas untuk TCP. Jika Anda menggunakan NodeLocal DNSCache, Anda perlu memodifikasi konfigurasi CoreDNS untuk memprioritaskan UDP dalam berkomunikasi dengan server DNS hulu guna menghindari anomali resolusi. Kami merekomendasikan Anda memodifikasi file konfigurasi CoreDNS, yaitu ConfigMap bernama coredns di namespace kube-system. Untuk informasi lebih lanjut, lihat Kelola ConfigMaps. Dalam plugin forward, tentukan protokol untuk permintaan hulu sebagai prefer_udp. Setelah modifikasi ini, CoreDNS memprioritaskan UDP untuk berkomunikasi dengan server hulu. Modifikasinya sebagai berikut:
# Sebelum modifikasi
forward . /etc/resolv.conf
# Setelah modifikasi
forward . /etc/resolv.conf {
prefer_udp
}
Konfigurasikan plugin ready
Versi CoreDNS setelah 1.5.0 harus memiliki plugin ready dikonfigurasi untuk mengaktifkan pemeriksaan kesiapan.
-
Jalankan perintah berikut untuk membuka file konfigurasi CoreDNS.
kubectl -n kube-system edit configmap/coredns -
Periksa apakah file berisi baris
ready. Jika tidak, tambahkan barisready, tekan 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 operasional dan log Pod CoreDNS. Jika log berisi kata
reload, modifikasi berhasil.
Tingkatkan performa dengan plugin multisocket
CoreDNS v1.12.1 memperkenalkan plugin multisocket. Mengaktifkan plugin ini memungkinkan CoreDNS menggunakan beberapa soket untuk mendengarkan pada port yang sama, meningkatkan performa CoreDNS dalam skenario CPU tinggi. Untuk deskripsi detail plugin, lihat dokumentasi komunitas.
Anda perlu mengaktifkan multisocket menggunakan ConfigMap coredns:
.:53 {
...
prometheus :9153
multisocket [NUM_SOCKETS]
forward . /etc/resolv.conf
...
}
NUM_SOCKETS menentukan jumlah soket yang mendengarkan pada port yang sama.
Konfigurasi yang direkomendasikan: Sesuaikan NUM_SOCKETS dengan perkiraan pemanfaatan CPU, batas resource CPU, dan sumber daya kluster yang tersedia. 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, kami merekomendasikan Anda menguji QPS dan beban dengan pengaturan 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.