ACK menggunakan CoreDNS sebagai server DNS default. Topik ini menjelaskan plugin umum untuk CoreDNS dan memberikan petunjuk konfigurasi untuk berbagai skenario.
Prasyarat
Sebuah Kluster ACK yang dikelola atau Kluster ACK Serverless telah dibuat. Untuk informasi selengkapnya, lihat Buat Kluster ACK yang dikelola dan Panduan cepat ACK Serverless.
File kubeconfig klaster Anda telah diperoleh dan klien kubectl terhubung ke klaster Anda.
Deskripsi skenario
Topik ini menjelaskan skenario di mana CoreDNS dalam klaster ACK digunakan untuk resolusi nama domain. Dalam skenario ini, kebijakan dnsPolicy: ClusterFirst digunakan, seperti yang ditunjukkan dalam contoh konfigurasi berikut:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: ClusterFirstUntuk informasi selengkapnya mengenai konfigurasi dnsPolicy dan skenarionya, lihat Konfigurasi kebijakan DNS dan resolusi nama domain.
Konfigurasi CoreDNS default
Sebuah klaster ACK mencakup item konfigurasi CoreDNS item konfigurasi di namespace kube-system. CoreDNS mengaktifkan dan mengonfigurasi plugin berdasarkan item konfigurasi ini. Item konfigurasi tersebut dapat sedikit berbeda antar versi CoreDNS. Sebelum memodifikasi konfigurasi, rujuk ke dokumentasi resmi CoreDNS. Kode berikut menunjukkan file konfigurasi default untuk CoreDNS 1.6.2:
Corefile: |
.:53 {
errors
log
health {
lameduck 15s
}
ready
kubernetes {{.ClusterDomain}} in-addr.arpa ip6.arpa {
pods verified
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf {
prefer_udp
}
cache 30
loop
reload
loadbalance
}Dalam file konfigurasi, ClusterDomain merujuk pada nama domain klaster yang Anda tentukan saat membuat klaster. Nilai default-nya adalah cluster.local.
Parameter | Deskripsi |
| Mengirim pesan kesalahan ke standar output. |
| Menampilkan status kesehatan CoreDNS. Port pendengar default adalah 8080. Ini biasanya digunakan untuk pemeriksaan kesehatan. Anda dapat memeriksa status kesehatan di |
| Menampilkan status plugin CoreDNS. Port pendengar default adalah 8181. Ini biasanya digunakan untuk pemeriksaan kesiapan. Anda dapat memeriksa status kesiapan di |
| Plugin Kubernetes CoreDNS. Plugin ini menyediakan resolusi layanan di dalam klaster. |
| Antarmuka data metrik untuk CoreDNS. Anda dapat memperoleh data pemantauan dalam format Prometheus di |
| Meneruskan permintaan kueri nama domain ke server DNS yang telah ditentukan sebelumnya. Dalam konfigurasi default, jika sebuah nama domain tidak berada dalam domain Kubernetes, permintaan akan diteruskan ke resolver yang telah ditentukan (/etc/resolv.conf). Secara default, konfigurasi /etc/resolv.conf dari host digunakan. |
| Cache DNS. |
| Mendeteksi loop. Jika loop terdeteksi, CoreDNS berhenti. |
| Memungkinkan pemuatan ulang otomatis file Corefile yang berubah. Setelah Anda mengedit konfigurasi ConfigMap, tunggu dua menit agar perubahan berlaku. |
| Pemimbang beban DNS round-robin. Plugin ini dapat mengacak urutan rekaman A, AAAA, dan MX dalam tanggapan. |
| CoreDNS v1.12.1 menambahkan plugin multisocket. Mengaktifkan plugin ini memungkinkan CoreDNS menggunakan beberapa soket untuk mendengarkan port yang sama secara bersamaan. Hal ini meningkatkan kinerja CoreDNS dalam skenario penggunaan CPU tinggi. Untuk informasi selengkapnya, lihat Konfigurasi plugin multisocket untuk meningkatkan kinerja penguraian CoreDNS. |
Konfigurasi CoreDNS yang diperluas
Anda dapat memperluas konfigurasi CoreDNS untuk mendukung skenario berikut:
Skenario 1: Aktifkan layanan log
Untuk mencatat setiap permintaan resolusi nama domain yang diproses oleh CoreDNS, aktifkan plugin log. Tambahkan log ke Corefile, seperti yang ditunjukkan dalam contoh konfigurasi berikut:
Corefile: | .:53 { errors log health { lameduck 15s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { prefer_udp } cache 30 loop reload loadbalance }Skenario 2: Gunakan server DNS kustom untuk nama domain tertentu
Untuk menyelesaikan nama domain dengan akhiran example.com menggunakan server DNS yang dikelola sendiri (alamat IP 10.10.0.10), Anda dapat mengonfigurasi blok server terpisah untuk nama domain tersebut. Contoh konfigurasi berikut menunjukkan contohnya:
example.com:53 { errors cache 30 forward . 10.10.0.10 { prefer_udp } }Konfigurasi lengkapnya adalah sebagai berikut:
Corefile: | .:53 { errors health { lameduck 15s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { prefer_udp } cache 30 loop reload loadbalance } example.com:53 { errors cache 30 forward . 10.10.0.10 { prefer_udp } }Skenario 3: Gunakan server DNS yang dikelola sendiri untuk semua nama domain eksternal
Jika nama domain yang diselesaikan oleh DNS lokal Anda tidak memiliki akhiran yang sama, Anda dapat mengonfigurasi CoreDNS untuk menggunakan server DNS yang dikelola sendiri untuk semua nama domain eksternal. Dalam kasus ini, Anda harus meneruskan permintaan untuk nama domain yang tidak dapat diselesaikan oleh DNS lokal Anda ke DNS Alibaba Cloud. Jangan langsung memodifikasi file /etc/resolv.conf pada instance ECS klaster. Misalnya, jika server DNS yang dikelola sendiri Anda berada di alamat IP 10.10.0.10 dan 10.10.0.20, Anda dapat memodifikasi parameter forward, seperti yang ditunjukkan dalam contoh konfigurasi berikut:
Corefile: | .:53 { errors health { lameduck 15s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . 10.10.0.10 10.10.0.20 { prefer_udp } cache 30 loop reload loadbalance }Skenario 4: Sesuaikan hosts
Untuk memetakan nama domain tertentu ke alamat IP, seperti menetapkan alamat IP 127.0.0.1 ke www.example.com, Anda dapat menggunakan plugin hosts, seperti yang ditunjukkan dalam contoh konfigurasi berikut:
Corefile: | .:53 { errors health { lameduck 15s } ready hosts { 127.0.0.1 www.example.com fallthrough } kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { prefer_udp } cache 30 loop reload loadbalance }PentingAnda harus mengonfigurasi fallthrough. Jika tidak, resolusi nama domain untuk host yang tidak disesuaikan akan gagal.
Skenario 5: Akses layanan di dalam klaster dari luar klaster
Untuk memungkinkan proses yang berjalan pada node klaster (instance ECS) mengakses layanan di dalam klaster, Anda dapat mengatur
nameserverdalam file /etc/resolv.conf setiap instance ECS ke ClusterIP kube-dns. Namun, kami sangat menyarankan agar Anda tidak langsung memodifikasi file /etc/resolv.conf pada instance ECS.Untuk skenario jaringan internal, pendekatan yang lebih baik adalah mengekspos layanan di dalam klaster menggunakan SLB internal-facing. Kemudian, di Konsol Alibaba Cloud DNS PrivateZone, tambahkan rekaman A yang menyelesaikan nama domain layanan ke alamat IP internal SLB.
Skenario 6: Gunakan nama domain terpadu untuk mengakses layanan atau lakukan resolusi CNAME untuk nama domain di dalam klaster
Anda dapat menggunakan nama domain terpadu, seperti foo.example.com, untuk mengakses layanan Anda dari Internet, jaringan internal, dan dari dalam klaster. Hal ini dicapai sebagai berikut:
Layanan
foo.default.svc.cluster.localdi dalam klaster diekspos menggunakan SLB yang menghadap internet. Nama domainfoo.example.comdikonfigurasi untuk diselesaikan ke alamat IP publik SLB ini.Layanan
foo.default.svc.cluster.localdi dalam klaster diekspos melalui SLB internal-facing. Di VPC, Anda dapat menggunakan Alibaba Cloud DNS PrivateZone untuk menyelesaikanfoo.example.comke alamat IP SLB internal-facing ini. Untuk informasi selengkapnya, lihat Skenario 4: Sesuaikan hosts.Di dalam klaster, Anda dapat menggunakan plugin rewrite untuk membuat rekaman CNAME yang memetakan
foo.example.comkefoo.default.svc.cluster.local, seperti yang ditunjukkan dalam contoh konfigurasi berikut:Corefile: | .:53 { errors health { lameduck 15s } ready rewrite stop { name exact foo.example.com foo.default.svc.cluster.local answer name foo.default.svc.cluster.local foo.example.com } kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { prefer_udp } cache 30 loop reload loadbalance }
Skenario 7: Cegah CoreDNS mengembalikan tanggapan terhadap kueri untuk rekaman AAAA (IPv6)
Jika kontainer aplikasi tidak memerlukan rekaman AAAA, Anda dapat mengonfigurasi CoreDNS untuk mencegat kueri untuk rekaman AAAA dan mengembalikan tanggapan kosong (NODATA). Hal ini mengurangi lalu lintas jaringan yang tidak perlu. Contoh konfigurasi berikut menunjukkan cara melakukannya:
Corefile: | .:53 { errors health { lameduck 15s } # Tambahkan baris berikut untuk plugin Template. Biarkan data lainnya tidak berubah. template IN AAAA . }Skenario 8: Aktifkan fitur layanan multi-klaster ACK One
CatatanFitur layanan multi-klaster ACK One didukung di CoreDNS 1.9.3 dan versi yang lebih baru. Jika komponen CoreDNS Anda berada di versi sebelum 1.9.3, Anda harus melakukan peningkatan CoreDNS sebelum dapat mengaktifkan fitur ini. Untuk informasi selengkapnya, lihat Tingkatkan CoreDNS yang tidak dikelola secara otomatis dan Tingkatkan CoreDNS yang tidak dikelola secara manual.
Jalankan perintah berikut untuk mengedit item konfigurasi CoreDNS:
kubectl edit configmap/coredns -n kube-systemTambahkan baris
multicluster clusterset.localdi atas baris yang berisikubernetes. Hal ini mengaktifkan plugin multicluster dan menetapkan akhiran nama domain untuk layanan multi-klaster menjadiclusterset.local.Corefile: | .:53 { # Konten lainnya dihilangkan. # Tambahkan baris berikut. multicluster clusterset.local kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } # Konten lainnya dihilangkan. }Setelah melakukan perubahan, tekan tombol Esc, masukkan :wq!, lalu tekan tombol Enter untuk menyimpan file konfigurasi dan keluar dari mode edit.
Skenario 9: Tentukan server DNS hulu yang berbeda untuk nama domain eksternal yang berbeda
Prasyarat:
CoreDNS v1.11.3 atau yang lebih baru.
Metode konfigurasi:
Dalam satu blok server, Anda dapat menggunakan plugin
forwarduntuk mengonfigurasi server DNS hulu yang berbeda untuk nama domain yang berbeda. Untuk informasi selengkapnya mengenai parameter pluginforward, lihat forward.Contoh konfigurasi:
Corefile: | .:53 { # Konten lainnya dihilangkan. kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } # Tentukan 10.20.0.1 sebagai server DNS untuk foo.com. forward foo.com 10.20.0.1 # Tentukan 10.30.0.1 sebagai server DNS untuk bar.com. forward bar.com 10.30.0.1 # Untuk nama domain lainnya, gunakan server DNS yang ditentukan dalam /etc/resolv.conf pada node. forward . /etc/resolv.conf # Konten lainnya dihilangkan. }