مشاركة عبر


قم بتخصيص CoreDNS مع Azure Kubernetes Service

تستخدم Azure Kubernetes Service (AKS) مشروع CoreDNS لإدارة نظام المجموعات الخاصة ب DNS وحله مع نظام المجموعة 1.12.x والأحدث. لمزيد من المعلومات حول تخصيص CoreDNS و Kubernetes، راجع الوثائق الرسمية للمصدر.

AKS هي خدمة مدارة، لذلك لا يمكنك تعديل التكوين الرئيسي ل CoreDNS ( CoreFile). بدلا من ذلك، يمكنك استخدام Kubernetes ConfigMap لتجاوز الإعدادات الافتراضية. لمشاهدة الإعدادات الافتراضية الخاصة ب AKS CoreDNS ConfigMaps، استخدم kubectl get configmaps --namespace=kube-system coredns -o yaml الأمر.

توضح لك هذه المقالة كيفية استخدام ConfigMaps لخيارات تخصيص CoreDNS الأساسية في AKS. يختلف هذا الأسلوب عن تكوين CoreDNS في سياقات أخرى، مثل CoreFile.

إشعار

في السابق، تم استخدام kube-dns لإدارة نظام مجموعة DNS ودقته، ولكن تم إهماله الآن. kube-dns تم عرض خيارات التخصيص المختلفة عبر خريطة التكوين الخاصة ب Kubernetes. يعد CoreDNS غير متوافق مع kube-dns. يجب تحديث أي تخصيصات استخدمتها مسبقا ل CoreDNS.

قبل البدء

  • تفترض هذه المقالة أن لديك تجمع AKS قائمًا. إذا كنت بحاجة إلى نظام مجموعة AKS، يمكنك إنشاء مجموعة باستخدام Azure CLI أو Azure PowerShell أو مدخل Azure.
  • تحقق من إصدار CoreDNS الذي تقوم بتشغيله. قد تتغير قيم التكوين بين الإصدارات.
  • عند إنشاء تكوينات مثل الأمثلة أدناه، يجب أن تنتهي الأسماء في قسم البيانات ب .server أو .override. يتم تعريف اصطلاح التسمية هذا في AKS CoreDNS ConfigMap الافتراضي، والذي يمكنك عرضه باستخدام kubectl get configmaps --namespace=kube-system coredns -o yaml الأمر .

دعم المكون الإضافي

يتم دعم جميع المكونات الإضافية الخاصة ب CoreDNS المدمجة. لا يتم دعم أي إضافات أو مكونات إضافية تابعة للغير.

أعد كتابة DNS

يمكنك تخصيص CoreDNS باستخدام AKS لإجراء إعادة كتابة اسم DNS أثناء التنقل.

  1. إنشاء ملف باسم corednsms.yaml ولصق تكوين المثال التالي. تأكد من استبدال <domain to be rewritten> باسم المجال المؤهل بالكامل الخاص بك.

    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
        }
    

    هام

    إذا قمت بإعادة التوجيه إلى خادم DNS، مثل CoreDNS service IP، التي يجب أن يكون الخادم الخاص ب DNS يمكنه حل اسم المجال المعاد كتابته.

  2. قم بإنشاء ConfigMap باستخدام kubectl apply configmap الأمر وحدد اسم بيان YAML الخاص بك.

    kubectl apply -f corednsms.yaml
    
  3. تحقق من تطبيق التخصيصات باستخدام kubectl get configmaps وحدد ConfigMap المخصص coredns.

    kubectl get configmaps --namespace=kube-system coredns-custom -o yaml
    
  4. لإعادة تحميل ConfigMap وتمكين Kubernetes Scheduler من إعادة تشغيل CoreDNS دون وقت تعطل، قم بإجراء إعادة تشغيل متجدد باستخدام kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

الخادم الخاص بإعادة التوجيه المخصصة

إذا كنت بحاجة إلى تحديد الخادم الخاص بإعادة توجيه حركة مرور الشبكة، يمكنك إنشاء ConfigMap لتخصيص DNS.

  1. إنشاء ملف باسم corednsms.yaml ولصق تكوين المثال التالي. تأكد من استبدال forward الاسم والعنوان بقيم البيئة الخاصة بك.

    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. قم بإنشاء ConfigMap باستخدام kubectl apply configmap الأمر وحدد اسم بيان YAML الخاص بك.

    kubectl apply -f corednsms.yaml
    
  3. لإعادة تحميل ConfigMap وتمكين Kubernetes Scheduler من إعادة تشغيل CoreDNS دون وقت تعطل، قم بإجراء إعادة تشغيل متجدد باستخدام kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

استخدم المجالات المخصصة

قد تحتاج إلى تهيئة المجالات المخصصة التي يمكن حلها داخليا فقط. على سبيل المثال، قد تحتاج إلى إعادة حل المجال المخصص puglife.local، وهو ليس مجال مناسب للمستوى الأعلى. بدون تكوين مجال مخصص، لا يمكن لنظام المجموعات الخاص ب AKS إعادة حل العنوان.

  1. أنشئ ملفا جديدا باسم corednsms.yaml والصق تكوين المثال التالي. تأكد من تحديث المجال المخصص وعنوان IP بالقيم الخاصة بالبيئة الخاصة بك.

    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. قم بإنشاء ConfigMap باستخدام kubectl apply configmap الأمر وحدد اسم بيان YAML الخاص بك.

    kubectl apply -f corednsms.yaml
    
  3. لإعادة تحميل ConfigMap وتمكين Kubernetes Scheduler من إعادة تشغيل CoreDNS دون وقت تعطل، قم بإجراء إعادة تشغيل متجدد باستخدام kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns 
    

المجالات الخاصة ب Stub

يمكن أيضا استخدام CoreDNS لتكوين المجالات الخاصة ب Stub.

  1. إنشاء ملف باسم corednsms.yaml ولصق تكوين المثال التالي. تأكد من تحديث المجالات المخصصة وعناوين IP بقيم البيئة الخاصة بك.

    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. قم بإنشاء ConfigMap باستخدام kubectl apply configmap الأمر وحدد اسم بيان YAML الخاص بك.

    kubectl apply -f corednsms.yaml
    
  3. لإعادة تحميل ConfigMap وتمكين Kubernetes Scheduler من إعادة تشغيل CoreDNS دون وقت تعطل، قم بإجراء إعادة تشغيل متجدد باستخدام kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

المكون الإضافي الخاص ب Hosts

يتم دعم جميع المكونات الإضافية المضمنة، لذلك يتوفر المكون الإضافي لمضيفي CoreDNS لتخصيص /etc/hosts أيضا.

  1. إنشاء ملف باسم corednsms.yaml ولصق تكوين المثال التالي. تأكد من تحديث عناوين IP وأسماء المضيفين بالقيم الخاصة بالبيئة الخاصة بك.

    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. قم بإنشاء ConfigMap باستخدام kubectl apply configmap الأمر وحدد اسم بيان YAML الخاص بك.

    kubectl apply -f corednsms.yaml
    
  3. لإعادة تحميل ConfigMap وتمكين Kubernetes Scheduler من إعادة تشغيل CoreDNS دون وقت تعطل، قم بإجراء إعادة تشغيل متجدد باستخدام kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

إكمال مجال البحث غير صحيح internal.cloudapp.net reddog.microsoft.com

يقوم Azure DNS بتكوين مجال بحث افتراضي في <vnetId>.<region>.internal.cloudapp.net الشبكات الظاهرية باستخدام Azure DNS و كعب الروتين reddog.microsoft.com غير الوظيفي في الشبكات الظاهرية باستخدام خوادم DNS المخصصة (راجع تحليل الاسم لوثائق الموارد لمزيد من التفاصيل). يقوم Kubernetes بتكوين إعدادات pod DNS مع ndots: 5 لدعم دقة اسم مضيف خدمة نظام المجموعة بشكل صحيح. يجمع هذان التكوينان لينتج عنهما استعلامات إكمال مجال بحث غير صالحة لا تنجح أبدا في إرسالها إلى خوادم الأسماء الأولية أثناء معالجة النظام من خلال قائمة البحث في المجال. تتسبب هذه الاستعلامات غير الصالحة في تأخير تحليل الاسم ويمكن أن تضع حملا إضافيا على خوادم DNS المصدر.

اعتبارا من إصدار AKS v20241025، تقوم AKS بتكوين CoreDNS للاستجابة باستخدام NXDOMAIN في الحالتين التاليتين لمنع إعادة توجيه استعلامات إكمال مجال البحث غير الصالحة هذه إلى DNS المصدر:

  • أي استعلام للمجال الجذر أو مجال فرعي ل reddog.microsoft.com.
  • يحتوي أي استعلام لمجال فرعي له internal.cloudapp.net سبعة أو أكثر من التسميات في اسم المجال.
    • يسمح هذا التكوين لدقة الجهاز الظاهري حسب اسم المضيف بنجاح. على سبيل المثال، يرسل aks12345.myvnetid.myregion.internal.cloudapp.net CoreDNS (6 تسميات) إلى Azure DNS، ولكنه يرفض mcr.microsoft.com.myvnetid.myregion.internal.cloudapp.net (8 تسميات)

يتم تنفيذ هذه الكتلة في كتلة الخادم الافتراضية في Corefile للمجموعة. إذا لزم الأمر، يمكن تعطيل تكوين الرفض هذا عن طريق إنشاء كتل خادم مخصصة للمجال المناسب مع تمكين مكون إضافي للأمام:

  1. إنشاء ملف باسم corednsms.yaml ولصق تكوين المثال التالي. تأكد من تحديث عناوين IP وأسماء المضيفين بالقيم الخاصة بالبيئة الخاصة بك.

    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. قم بإنشاء ConfigMap باستخدام kubectl apply configmap الأمر وحدد اسم بيان YAML الخاص بك.

    kubectl apply -f corednsms.yaml
    
  3. لإعادة تحميل ConfigMap وتمكين Kubernetes Scheduler من إعادة تشغيل CoreDNS دون وقت تعطل، قم بإجراء إعادة تشغيل متجدد باستخدام kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

استكشاف الأخطاء وإصلاحها

للحصول على خطوات استكشاف أخطاء CoreDNS وإصلاحها، مثل التحقق من نقاط النهاية أو الدقة، راجع تصحيح دقة DNS.

تكوين تحجيم جراب CoreDNS

تعد الارتفاعات المفاجئة في حركة مرور DNS داخل مجموعات AKS تكرارا شائعا بسبب المرونة التي توفرها AKS لأحمال العمل. يمكن أن تؤدي هذه الارتفاعات إلى زيادة في استهلاك الذاكرة بواسطة pods CoreDNS. في بعض الحالات، قد تتسبب Out of memory زيادة استهلاك الذاكرة هذه في حدوث مشكلات. لاستباق هذه المشكلة، تحجيم مجموعات AKS تلقائيا لقرون CoreDNS لتقليل استخدام الذاكرة لكل جراب. يتم تخزين الإعدادات الافتراضية لمنطق التحجيم التلقائي هذا في coredns-autoscaler ConfigMap. ومع ذلك، قد تلاحظ أن التحجيم التلقائي الافتراضي لقرون CoreDNS ليس دائما عدوانيا بما يكفي لمنع Out of memory حدوث مشكلات لوحدات جراب CoreDNS. في هذه الحالة، يمكنك تعديل coredns-autoscaler ConfigMap مباشرة. يرجى ملاحظة أن مجرد زيادة عدد جرابات CoreDNS دون معالجة السبب الجذري للمشكلة Out of memory قد توفر إصلاحا مؤقتا فقط. إذا لم تكن هناك ذاكرة كافية متاحة عبر العقد حيث يتم تشغيل جرابات CoreDNS، فلن تساعد زيادة عدد جرابات CoreDNS. قد تحتاج إلى مزيد من التحقيق وتنفيذ الحلول المناسبة مثل تحسين استخدام الموارد، أو ضبط طلبات الموارد وحدودها، أو إضافة المزيد من الذاكرة إلى العقد.

يستخدم CoreDNS مقياسا تلقائيا متناسبا للمجموعة الأفقية للتحجيم التلقائي للجراب. coredns-autoscaler يمكن تحرير ConfigMap لتكوين منطق التحجيم لعدد pods CoreDNS. coredns-autoscaler يدعم ConfigMap حاليا قيمتين مختلفتين لمفتاح ConfigMap: linear والتي ladder تتوافق مع وضعي تحكم مدعومين. linear تنتج وحدة التحكم عددا من النسخ المتماثلة في نطاق [min,max] مكافئا ل max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) ). تحسب ladder وحدة التحكم عدد النسخ المتماثلة عن طريق استشارة دالتين مختلفتين للخطوة، واحدة للتحجيم الأساسي وأخرى لتحجيم العقدة، ما ينتج عنه الحد الأقصى لقيمتي النسخ المتماثلة. لمزيد من المعلومات حول أوضاع التحكم وتنسيق ConfigMap، يرجى مراجعة وثائق المصدر.

هام

يوصى بحد أدنى من نسختين متماثلتين من جراب CoreDNS لكل مجموعة. قد يؤدي تكوين نسخة متماثلة 1 CoreDNS pod كحد أدنى إلى فشل أثناء العمليات التي تتطلب استنزاف العقدة، مثل عمليات ترقية نظام المجموعة.

لاسترداد coredns-autoscaler ConfigMap، يمكنك تشغيل kubectl get configmap coredns-autoscaler -n kube-system -o yaml الأمر الذي سيعيد ما يلي:

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

تمكين تسجيل استعلام DNS

  1. أضف التكوين التالي إلى ConfigMap المخصص coredns:

    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. تطبيق تغييرات التكوين وإجبار CoreDNS على إعادة تحميل ConfigMap باستخدام الأوامر التالية:

    # Apply configuration changes
    kubectl apply -f corednsms.yaml
    
    # Force CoreDNS to reload the ConfigMap
    kubectl -n kube-system rollout restart deployment coredns
    
  3. عرض تسجيل تتبع أخطاء CoreDNS باستخدام kubectl logs الأمر .

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

الخطوات التالية

أظهرت هذه المقالة بعض نماذج السيناريوهات لتخصيص CoreDNS. للحصول على معلومات بخصوص مشروع CoreDNS، راجع صفحة مشروع CoreDNS في المصدر.

لمعرفة المزيد بخصوص مفاهيم الشبكة الأساسية، راجع مفاهيم الشبكة للتطبيقات في AKS.