Menyesuaikan CoreDNS dengan Azure Kubernetes Service
Azure Kubernetes Service (AKS) menggunakan proyek CoreDNS untuk manajemen dan resolusi DNS kluster dengan semua kluster 1.12.x dan yang lebih tinggi. Untuk informasi lebih lanjut tentang penyesuaian CoreDNS dan Kube, lihat dokumentasi resmi upstram.
AKS adalah layanan terkelola, sehingga Anda tidak dapat memodifikasi konfigurasi utama untuk CoreDNS ( CoreFile). Sebagai gantinya, gunakan ConfigMap Kube untuk mengambil alih pengaturan default. Untuk melihat AKS CoreDNS ConfigMaps default, gunakan perintah kubectl get configmaps --namespace=kube-system coredns -o yaml
.
Artikel ini memperlihatkan kepada Anda cara menggunakan ConfigMaps untuk opsi kustomisasi CoreDNS dasar di AKS. Pendekatan ini berbeda dari mengonfigurasi CoreDNS dalam konteks lain, seperti CoreFile.
Catatan
Sebelumnya, kube-dns digunakan untuk manajemen dan resolusi DNS kluster, tetapi sekarang tidak digunakan lagi. kube-dns
menawarkan opsi penyesuaian yang berbeda melalui peta konfigurasi Kube. CoreDNS tidak kompatibel versi lama dengan kube-dns. Kustomisasi apa pun yang sebelumnya Anda gunakan harus diperbarui untuk CoreDNS.
- Artikel ini mengasumsikan bahwa Anda memiliki kluster AKS yang ada. Jika Anda memerlukan kluster AKS, Anda dapat membuatnya menggunakan Azure CLI, Azure PowerShell, atau portal Azure.
- Verifikasi versi CoreDNS yang Anda jalankan. Nilai konfigurasi dapat berubah antar versi.
- Saat Anda membuat konfigurasi seperti contoh di bawah ini, nama Anda di bagian data harus berakhir di .server atau .override. Konvensi penamaan ini didefinisikan dalam AKS CoreDNS ConfigMap default, yang dapat Anda lihat menggunakan
kubectl get configmaps --namespace=kube-system coredns -o yaml
perintah .
Semua plugin CoreDNS bawaan didukung. Tidak ada add-on/plugin pihak ketiga yang didukung.
Anda dapat menyesuaikan CoreDNS dengan AKS untuk melakukan penulisan ulang nama DNS on-the-fly.
Buat file bernama
corednsms.yaml
dan tempelkan contoh konfigurasi berikut. Pastikan untuk mengganti<domain to be rewritten>
dengan nama domain Anda yang sepenuhnya memenuhi syarat.apiVersion: v1 kind: ConfigMap metadata: name: coredns-custom namespace: kube-system data: test.server: | <domain to be rewritten>.com:53 { log errors rewrite stop { name regex (.*)\.<domain to be rewritten>\.com {1}.default.svc.cluster.local answer name (.*)\.default\.svc\.cluster\.local {1}.<domain to be rewritten>.com } forward . /etc/resolv.conf # you can redirect this to a specific DNS server such as 10.0.0.10, but that server must be able to resolve the rewritten domain name }
Penting
Jika Anda mengalihkan ke server DNS, seperti IP layanan CoreDNS, server DNS tersebut harus bisa mengatasi nama domain yang ditulis ulang.
Buat ConfigMap menggunakan
kubectl apply configmap
perintah dan tentukan nama manifes YAML Anda.kubectl apply -f corednsms.yaml
Verifikasi bahwa penyesuaian telah diterapkan menggunakan
kubectl get configmaps
dan tentukan ConfigMap coredns-custom Anda.kubectl get configmaps --namespace=kube-system coredns-custom -o yaml
Untuk memuat ulang ConfigMap dan mengaktifkan Kubernetes Scheduler untuk memulai ulang CoreDNS tanpa waktu henti, lakukan mulai ulang bergulir menggunakan
kubectl rollout restart
.kubectl -n kube-system rollout restart deployment coredns
Jika Anda perlu menentukan server penerusan untuk lalu lintas jaringan Anda, Anda dapat membuat ConfigMap untuk menyesuaikan DNS.
Buat file bernama
corednsms.yaml
dan tempelkan contoh konfigurasi berikut. Pastikan untuk menggantiforward
nama dan alamat dengan nilai untuk lingkungan Anda sendiri.apiVersion: v1 kind: ConfigMap metadata: name: coredns-custom namespace: kube-system data: test.server: | # you may select any name here, but it must end with the .server file extension <domain to be rewritten>.com:53 { forward foo.com 1.1.1.1 }
Buat ConfigMap menggunakan
kubectl apply configmap
perintah dan tentukan nama manifes YAML Anda.kubectl apply -f corednsms.yaml
Untuk memuat ulang ConfigMap dan mengaktifkan Kubernetes Scheduler untuk memulai ulang CoreDNS tanpa waktu henti, lakukan mulai ulang bergulir menggunakan
kubectl rollout restart
.kubectl -n kube-system rollout restart deployment coredns
Anda mungkin ingin mengonfigurasi domain kustom yang hanya dapat diatasi secara internal. Misalnya, Anda mungkin ingin mengatasi domain kustom puglife.local, yang bukan domain tingkat atas yang valid. Tanpa domain kustom ConfigMap, kluster AKS tidak dapat mengatasi alamat tersebut.
Buat file baru bernama
corednsms.yaml
dan tempelkan contoh konfigurasi berikut. Pastikan untuk memperbarui domain kustom dan alamat IP dengan nilai untuk lingkungan Anda sendiri.apiVersion: v1 kind: ConfigMap metadata: name: coredns-custom namespace: kube-system data: puglife.server: | # you may select any name here, but it must end with the .server file extension puglife.local:53 { errors cache 30 forward . 192.11.0.1 # this is my test/dev DNS server }
Buat ConfigMap menggunakan
kubectl apply configmap
perintah dan tentukan nama manifes YAML Anda.kubectl apply -f corednsms.yaml
Untuk memuat ulang ConfigMap dan mengaktifkan Kubernetes Scheduler untuk memulai ulang CoreDNS tanpa waktu henti, lakukan mulai ulang bergulir menggunakan
kubectl rollout restart
.kubectl -n kube-system rollout restart deployment coredns
CoreDNS juga dapat digunakan untuk mengonfigurasi domain stub.
Buat file bernama
corednsms.yaml
dan tempelkan contoh konfigurasi berikut. Pastikan untuk memperbarui domain kustom dan alamat IP dengan nilai untuk lingkungan Anda sendiri.apiVersion: v1 kind: ConfigMap metadata: name: coredns-custom namespace: kube-system data: test.server: | # you may select any name here, but it must end with the .server file extension abc.com:53 { errors cache 30 forward . 1.2.3.4 } my.cluster.local:53 { errors cache 30 forward . 2.3.4.5 }
Buat ConfigMap menggunakan
kubectl apply configmap
perintah dan tentukan nama manifes YAML Anda.kubectl apply -f corednsms.yaml
Untuk memuat ulang ConfigMap dan mengaktifkan Kubernetes Scheduler untuk memulai ulang CoreDNS tanpa waktu henti, lakukan mulai ulang bergulir menggunakan
kubectl rollout restart
.kubectl -n kube-system rollout restart deployment coredns
Semua plugin bawaan didukung, sehingga plugin host CoreDNS juga tersedia untuk menyesuaikan /etc/hosts.
Buat file bernama
corednsms.yaml
dan tempelkan contoh konfigurasi berikut. Pastikan untuk memperbarui alamat IP dan nama host dengan nilai untuk lingkungan Anda sendiri.apiVersion: v1 kind: ConfigMap metadata: name: coredns-custom # this is the name of the configmap you can overwrite with your changes namespace: kube-system data: test.override: | # you may select any name here, but it must end with the .override file extension hosts { 10.0.0.1 example1.org 10.0.0.2 example2.org 10.0.0.3 example3.org fallthrough }
Buat ConfigMap menggunakan
kubectl apply configmap
perintah dan tentukan nama manifes YAML Anda.kubectl apply -f corednsms.yaml
Untuk memuat ulang ConfigMap dan mengaktifkan Kubernetes Scheduler untuk memulai ulang CoreDNS tanpa waktu henti, lakukan mulai ulang bergulir menggunakan
kubectl rollout restart
.kubectl -n kube-system rollout restart deployment coredns
Azure DNS mengonfigurasi domain <vnetId>.<region>.internal.cloudapp.net
pencarian default di jaringan virtual menggunakan Azure DNS dan stub reddog.microsoft.com
non-fungsional di jaringan virtual menggunakan server DNS kustom (lihat resolusi nama untuk dokumentasi sumber daya untuk detail selengkapnya). Kubernetes mengonfigurasi pengaturan DNS pod dengan untuk mendukung resolusi nama host layanan kluster dengan ndots: 5
benar. Kedua konfigurasi ini digabungkan untuk menghasilkan kueri penyelesaian domain pencarian yang tidak valid yang tidak pernah berhasil dikirim ke server nama upstream saat sistem memproses melalui daftar pencarian domain. Kueri yang tidak valid ini menyebabkan penundaan resolusi nama dan dapat menempatkan beban tambahan di server DNS upstream.
Pada rilis AKS v20241025, AKS mengonfigurasi CoreDNS untuk merespons dengan NXDOMAIN dalam dua kasus berikut untuk mencegah kueri penyelesaian domain pencarian yang tidak valid ini diteruskan ke DNS upstram:
- Setiap kueri untuk domain akar atau subdomain .
reddog.microsoft.com
- Setiap kueri untuk subdomain
internal.cloudapp.net
yang memiliki tujuh label atau lebih dalam nama domain.- Konfigurasi ini memungkinkan resolusi komputer virtual berdasarkan nama host masih berhasil. Misalnya, CoreDNS mengirim
aks12345.myvnetid.myregion.internal.cloudapp.net
(6 label) ke Azure DNS, tetapi menolakmcr.microsoft.com.myvnetid.myregion.internal.cloudapp.net
(8 label)
- Konfigurasi ini memungkinkan resolusi komputer virtual berdasarkan nama host masih berhasil. Misalnya, CoreDNS mengirim
Blok ini diimplementasikan di blok server default di Corefile untuk kluster. Jika diperlukan, konfigurasi penolakan ini dapat dinonaktifkan dengan membuat blok server kustom untuk domain yang sesuai dengan plugin penerusan diaktifkan:
Buat file bernama
corednsms.yaml
dan tempelkan contoh konfigurasi berikut. Pastikan untuk memperbarui alamat IP dan nama host dengan nilai untuk lingkungan Anda sendiri.apiVersion: v1 kind: ConfigMap metadata: name: coredns-custom # this is the name of the configmap you can overwrite with your changes namespace: kube-system data: override-block.server: internal.cloudapp.net:53 { errors cache 30 forward . /etc/resolv.conf } reddog.microsoft.com:53 { errors cache 30 forward . /etc/resolv.conf }
Buat ConfigMap menggunakan
kubectl apply configmap
perintah dan tentukan nama manifes YAML Anda.kubectl apply -f corednsms.yaml
Untuk memuat ulang ConfigMap dan mengaktifkan Kubernetes Scheduler untuk memulai ulang CoreDNS tanpa waktu henti, lakukan mulai ulang bergulir menggunakan
kubectl rollout restart
.kubectl -n kube-system rollout restart deployment coredns
Untuk langkah-langkah pemecahan masalah CoreDNS umum, seperti memeriksa titik akhir atau resolusi, lihat Men-debug resolusi DNS.
Lonjakan mendadak dalam lalu lintas DNS dalam kluster AKS adalah kejadian umum karena elastisitas yang disediakan AKS untuk beban kerja. Lonjakan ini dapat menyebabkan peningkatan konsumsi memori oleh pod CoreDNS. Dalam beberapa kasus, peningkatan konsumsi memori ini dapat menyebabkan Out of memory
masalah. Untuk mengatasi masalah ini, kluster AKS menskalakan pod CoreDNS secara otomatis untuk mengurangi penggunaan memori per pod. Pengaturan default untuk logika penskalaan otomatis ini disimpan di coredns-autoscaler
ConfigMap. Namun, Anda dapat mengamati bahwa penskalaan otomatis default pod CoreDNS tidak selalu cukup agresif untuk mencegah Out of memory
masalah untuk pod CoreDNS Anda. Dalam hal ini, Anda dapat langsung memodifikasi coredns-autoscaler
ConfigMap. Harap dicatat bahwa hanya meningkatkan jumlah pod CoreDNS tanpa mengatasi akar penyebab Out of memory
masalah hanya dapat memberikan perbaikan sementara. Jika tidak ada cukup memori yang tersedia di seluruh simpul tempat pod CoreDNS berjalan, meningkatkan jumlah pod CoreDNS tidak akan membantu. Anda mungkin perlu menyelidiki lebih lanjut dan menerapkan solusi yang sesuai seperti mengoptimalkan penggunaan sumber daya, menyesuaikan permintaan dan batas sumber daya, atau menambahkan lebih banyak memori ke simpul.
CoreDNS menggunakan autoscaler proporsional kluster horizontal untuk penskalaan otomatis pod. coredns-autoscaler
ConfigMap dapat diedit untuk mengonfigurasi logika penskalaan untuk jumlah pod CoreDNS. coredns-autoscaler
ConfigMap saat ini mendukung dua nilai kunci ConfigMap yang berbeda: linear
dan ladder
yang sesuai dengan dua mode kontrol yang didukung. Pengontrol linear
menghasilkan sejumlah replika dalam rentang [min,maks] yang setara max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) )
dengan . Pengontrol ladder
menghitung jumlah replika dengan berkonsultasi dengan dua fungsi langkah yang berbeda, satu untuk penskalaan inti dan satu lagi untuk penskalaan simpul, menghasilkan maks dari dua nilai replika. Untuk informasi selengkapnya tentang mode kontrol dan format ConfigMap, silakan lihat dokumentasi upstream.
Penting
Disarankan minimal 2 replika pod CoreDNS per kluster. Mengonfigurasi minimal 1 replika pod CoreDNS dapat mengakibatkan kegagalan selama operasi yang memerlukan pengurasan simpul, seperti operasi peningkatan kluster.
Untuk mengambil coredns-autoscaler
ConfigMap, Anda dapat menjalankan kubectl get configmap coredns-autoscaler -n kube-system -o yaml
perintah yang akan mengembalikan hal berikut:
apiVersion: v1
data:
ladder: '{"coresToReplicas":[[1,2],[512,3],[1024,4],[2048,5]],"nodesToReplicas":[[1,2],[8,3],[16,4],[32,5]]}'
kind: ConfigMap
metadata:
name: coredns-autoscaler
namespace: kube-system
resourceVersion: "..."
creationTimestamp: "..."
Tambahkan konfigurasi berikut ke ConfigMap kustom coredns Anda:
apiVersion: v1 kind: ConfigMap metadata: name: coredns-custom namespace: kube-system data: log.override: | # you may select any name here, but it must end with the .override file extension log
Terapkan perubahan konfigurasi dan paksa CoreDNS untuk memuat ulang ConfigMap menggunakan perintah berikut:
# Apply configuration changes kubectl apply -f corednsms.yaml # Force CoreDNS to reload the ConfigMap kubectl -n kube-system rollout restart deployment coredns
Lihat pengelogan debug CoreDNS menggunakan
kubectl logs
perintah .kubectl logs --namespace kube-system -l k8s-app=kube-dns
Artikel ini memperlihatkan beberapa contoh skenario untuk penyesuaian CoreDNS. Untuk informasi tentang proyek CoreDNS, lihat halaman proyek upstram CoreDNS.
Untuk mempelajari selengkapnya tentang konsep jaringan inti, lihat Konsep jaringan untuk aplikasi di AKS.
Umpan balik Azure Kubernetes Service
Azure Kubernetes Service adalah proyek sumber terbuka. Pilih tautan untuk memberikan umpan balik: