Pod dalam kluster Kubernetes menggunakan nama domain untuk mengakses Layanan di dalam atau luar kluster. Nama domain diubah menjadi alamat IP melalui Sistem Nama Domain (DNS), yang memelihara pemetaan antara nama domain dan alamat IP. Topik ini menjelaskan dasar-dasar DNS, memperkenalkan komponen yang disediakan oleh Container Service for Kubernetes (ACK) untuk mengimplementasikan DNS, serta cara mengonfigurasi resolusi DNS untuk kluster ACK.
Cara kerja resolusi DNS di kluster ACK
Perangkat yang terhubung ke internet menggunakan alamat IP untuk berkomunikasi satu sama lain. Namun, alamat IP sulit diingat. Nama domain lebih mudah diingat karena mengandung informasi semantik. Dalam kebanyakan kasus, klien mengirim permintaan ke nama domain. Gambar berikut menunjukkan prosedur resolusi DNS untuk nama domain example.com ketika menerima permintaan dari klien.
Server tujuan mendaftarkan nama domain dan alamat IP-nya dengan server DNS.
Klien meminta server DNS untuk alamat IP dari nama domain example.com.
Server DNS memeriksa catatan DNS pada server dan mengembalikan alamat IP ke klien.
Klien terhubung ke alamat IP untuk berkomunikasi dengan server tujuan.
Komponen yang disediakan oleh ACK untuk mengimplementasikan DNS
CoreDNS dan NodeLocal DNSCache digunakan untuk mengimplementasikan DNS di kluster ACK dikelola. Sebelum menggunakan CoreDNS dan NodeLocal DNSCache, kami sarankan Anda membaca konten berikut untuk mempelajari dasar-dasar DNS di Kubernetes.
Dalam kebanyakan kasus, Layanan memiliki nama pendek. Selama pencarian DNS, Layanan direpresentasikan oleh nama domain lengkap dalam format <servicename>.<namespace>.svc.<ClusterDomain>. <ClusterDomain> merujuk ke nama domain kluster. Nama domain default kluster Kubernetes adalah cluster.local. Anda dapat menentukan nama domain kustom. Misalnya, nama domain lengkap Layanan database-svc di namespace default adalah database-svc.default.svc.cluster.local.
Selama pembuatan pod, kubelet pada node mengonfigurasi file /etc/resolv.conf untuk pod. Pod mengirim permintaan DNS berdasarkan konfigurasi dalam file ini.
CoreDNS Tidak Dikelola
CoreDNS adalah penyelesai DNS yang disediakan oleh Kubernetes. CoreDNS dapat menyelesaikan nama domain internal kustom dan nama domain eksternal. CoreDNS dihosting oleh Cloud Native Computing Foundation (CNCF). Untuk informasi lebih lanjut tentang CoreDNS, lihat CoreDNS: DNS dan Penemuan Layanan.
ACK menggunakan CoreDNS sebagai server DNS default untuk kluster ACK. CoreDNS diterapkan sebagai Deployment di namespace kube-system. CoreDNS diekspos dalam kluster menggunakan Layanan kube-dns, yang merupakan Layanan ClusterIP. Untuk informasi lebih lanjut tentang cara mengonfigurasi CoreDNS, lihat Konfigurasikan CoreDNS.
Gambar berikut menunjukkan prosedur resolusi DNS ketika pod di namespace default mencoba mengakses Layanan database-svc.
Pod memeriksa file
/etc/resolv.confuntuk mendapatkan alamat IP server DNS (172.0.XX.XX), yang merupakan alamat IP kluster dari Layanan kube-dns. Contoh file konfigurasi:nameserver 172.0.XX.XX # Mendefinisikan alamat IP server DNS. search default.svc.cluster.local svc.cluster.local cluster.local # Mengonfigurasi aturan pencarian akhiran domain. Semakin banyak akhiran meningkatkan upaya kueri DNS. options ndots:5 # Menetapkan opsi resolusi domain (pasangan nilai-kunci). Beberapa pasangan nilai-kunci didukung.Pod mengirim kueri DNS ke Layanan kube-dns. Nama domain ditambahkan dengan akhiran yang ditentukan oleh parameter
searchsecara berurutan sebelum nama domain diselesaikan.database-svc.default.svc.cluster.local: Layanan di namespace yang sama dengan pod.database-svc.svc.cluster.local: Layanan di namespace lain.database-svc.cluster.local: Nama domain internal di kluster.database-svc: Nama domain eksternal.
Pod CoreDNS mengembalikan
172.4.XX.XX.Pod terhubung ke alamat IP untuk berkomunikasi dengan Layanan
database-svc.
CoreDNS Dikelola
CoreDNS Dikelola beroperasi identik dengan CoreDNS tidak dikelola tetapi sepenuhnya dikelola oleh ACK. Ini mengonsumsi nol sumber daya kluster, menghilangkan persyaratan O&M pengguna, dan secara otomatis diskalakan berdasarkan beban kerja.
CoreDNS Dikelola juga didukung di kluster ACK dikelola dengan mode otomatis diaktifkan.
NodeLocal DNSCache
NodeLocal DNSCache menjalankan agen caching DNS pada setiap node pekerja untuk mengurangi beban kerja CoreDNS. Ini membantu meningkatkan stabilitas dan ketersediaan resolusi DNS di kluster. Untuk meningkatkan stabilitas resolusi DNS, kami sarankan Anda menginstal NodeLocal DNSCache di kluster Anda. Untuk informasi lebih lanjut tentang cara menginstal dan menggunakan NodeLocal DNSCache, lihat Konfigurasikan NodeLocal DNSCache.
Gambar berikut menunjukkan prosedur resolusi DNS di kluster ketika pod di namespace default mencoba mengakses Layanan database-svc. NodeLocal DNSCache diinstal di kluster dan label node-local-dns-injection: "enabled" ditambahkan ke namespace default.
Pod pertama kali menanyakan cache DNS di node.
Resolusi dilanjutkan berdasarkan apakah terjadi cache hit:
Jika catatan untuk Layanan
database-svcditemukan di cache, terjadi cache hit. Dalam hal ini, alamat IP yang dicatat di cache dikembalikan. Pod terhubung ke alamat IP.Jika tidak ada catatan untuk Layanan
database-svcditemukan di cache, terjadi cache miss. Dalam hal ini, pod mengirim kueri DNS ke CoreDNS. Hasil yang dikembalikan oleh CoreDNS akan disinkronkan ke cache DNS di node.
Konfigurasikan resolusi DNS untuk kluster ACK
Anda dapat mengonfigurasi resolusi DNS untuk kluster ACK dari perspektif berikut:
Konfigurasikan resolusi DNS dari perspektif kluster
Konfigurasi kubelet sebuah node berisi parameter ClusterDomain. Anda harus memastikan bahwa parameter ClusterDomain dalam konfigurasi kubelet setiap node di kluster disetel ke nilai yang sama. Jika tidak, kesalahan jaringan mungkin terjadi di kluster.
ClusterDomainParameter ClusterDomain menentukan nama domain tingkat atas yang digunakan oleh semua Layanan di kluster. Nilai default:
cluster.local. Jika nama domain diakhiri dengan nilai parameter ClusterDomain, itu adalah nama domain internal. Jika nama domain tidak diakhiri dengan nilai parameter ClusterDomain, itu adalah nama domain eksternal. Anda dapat menentukan parameter ClusterDomain selama pembuatan kluster. Pastikan nilai parameter ClusterDomain tidak tumpang tindih dengan nama domain eksternal yang Anda gunakan.
Konfigurasikan resolusi DNS dari perspektif node
resolveConfParameter
resolveConfdalam konfigurasi kubelet sebuah node menentukan jalur file konfigurasi DNS di node. Jika Anda menyetel parameterdnsPolicydalam konfigurasi pod keDefault, kubelet menyalin isi file (/etc/resolv.confsecara default) yang ditentukan oleh parameterresolveConfkubelet ke file/etc/resolv.confdi pod.
Konfigurasikan resolusi DNS dari perspektif pod
Konfigurasi pod berisi parameter
dnsPolicydandnsConfig, yang dapat digunakan untuk mengonfigurasi kebijakan DNS kustom untuk pod. dnsPolicy menentukan kebijakan resolusi DNS pod. Parameter dnsConfig menentukan server DNS dan domain pencarian DNS untuk resolusi DNS di pod. Untuk informasi lebih lanjut tentang cara mengonfigurasi parameterdnsPolicydandnsConfigdalam skenario berbeda, lihat Kebijakan DNS dan Resolusi Nama Domain.