Baca dalam bahasa Inggris

Bagikan melalui


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.

Sebelum Anda mulai

  • 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 .

Dukungan plugin

Semua plugin CoreDNS bawaan didukung. Tidak ada add-on/plugin pihak ketiga yang didukung.

Regenerasi DNS

Anda dapat menyesuaikan CoreDNS dengan AKS untuk melakukan penulisan ulang nama DNS on-the-fly.

  1. 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.

  2. Buat ConfigMap menggunakan kubectl apply configmap perintah dan tentukan nama manifes YAML Anda.

    kubectl apply -f corednsms.yaml
    
  3. 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
    
  4. 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
    

Server penerusan kustom

Jika Anda perlu menentukan server penerusan untuk lalu lintas jaringan Anda, Anda dapat membuat ConfigMap untuk menyesuaikan DNS.

  1. Buat file bernama corednsms.yaml dan tempelkan contoh konfigurasi berikut. Pastikan untuk mengganti forward 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
        }
    
  2. Buat ConfigMap menggunakan kubectl apply configmap perintah dan tentukan nama manifes YAML Anda.

    kubectl apply -f corednsms.yaml
    
  3. 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
    

Menggunakan domain kustom

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.

  1. 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
        }
    
  2. Buat ConfigMap menggunakan kubectl apply configmap perintah dan tentukan nama manifes YAML Anda.

    kubectl apply -f corednsms.yaml
    
  3. 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 
    

Domain stub

CoreDNS juga dapat digunakan untuk mengonfigurasi domain stub.

  1. 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
        }
    
    
  2. Buat ConfigMap menggunakan kubectl apply configmap perintah dan tentukan nama manifes YAML Anda.

    kubectl apply -f corednsms.yaml
    
  3. 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
    

Plugin host

Semua plugin bawaan didukung, sehingga plugin host CoreDNS juga tersedia untuk menyesuaikan /etc/hosts.

  1. 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
              }
    
  2. Buat ConfigMap menggunakan kubectl apply configmap perintah dan tentukan nama manifes YAML Anda.

    kubectl apply -f corednsms.yaml
    
  3. 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
    

Penyelesaian domain pencarian tidak valid untuk internal.cloudapp.net dan reddog.microsoft.com

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 menolak mcr.microsoft.com.myvnetid.myregion.internal.cloudapp.net (8 label)

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:

  1. 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
           }
    
  2. Buat ConfigMap menggunakan kubectl apply configmap perintah dan tentukan nama manifes YAML Anda.

    kubectl apply -f corednsms.yaml
    
  3. 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
    

Pemecahan Masalah

Untuk langkah-langkah pemecahan masalah CoreDNS umum, seperti memeriksa titik akhir atau resolusi, lihat Men-debug resolusi DNS.

Mengonfigurasi penskalakan pod CoreDNS

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: "..."

Mengaktifkan pengelogan kueri DNS

  1. 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
    
  2. 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
    
  3. Lihat pengelogan debug CoreDNS menggunakan kubectl logs perintah .

    kubectl logs --namespace kube-system -l k8s-app=kube-dns
    

Langkah berikutnya

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.