استخدام عنوان IP عامًا ثابتًا وتسمية DNS مع موازن تحميل Azure Kubernetes Service (AKS)

عند إنشاء مورد موازن تحميل في نظام مجموعة Azure Kubernetes Service (AKS)، يكون عنوان IP العام المعين له صالحا فقط طوال عمر هذا المورد. إذا قمت بحذف خدمة Kubernetes، فسيتم أيضًا حذف موازن التحميل وعنوان IP. إذا كنت ترغب في تعيين عنوان IP محدد أو الاحتفاظ بعنوان IP لخدمات Kubernetes المعاد نشرها، فيمكنك إنشاء واستخدام عنوان IP عام ثابت.

توضح لك هذه المقالة كيفية إنشاء عنوان IP عام ثابت وتعيينه لخدمة Kubernetes الخاصة بك.

قبل البدء

  • تحتاج إلى تثبيت الإصدار 2.0.59 من Azure CLI أو إصدار أحدث وتكوينه. قم بتشغيل az --version للعثور على الإصدار. إذا كنت بحاجة إلى التثبيت أو الترقية، فراجع تثبيت Azure CLI.
  • تتناول هذه المقالة استخدام SKU IP القياسي مع موازن تحميل SKU قياسي . لمزيد من المعلومات، راجع أنواع عناوين IP وطرق التخصيص في Azure .

إنشاء نظام مجموعة AKS

  1. إنشاء مجموعة موارد Azure باستخدام az group create الأمر .

    az group create --name myNetworkResourceGroup --location eastus
    
  2. إنشاء نظام مجموعة AKS باستخدام az aks create الأمر .

    az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
    

إنشاء عنوان IP ثابت

  1. احصل على اسم مجموعة موارد العقدة az aks show باستخدام الأمر والاستعلام للخاصية nodeResourceGroup .

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  2. إنشاء عنوان IP عام ثابت في مجموعة موارد العقدة az network public ip create باستخدام الأمر .

    az network public-ip create \
        --resource-group <node resource group name> \
        --name myAKSPublicIP \
        --sku Standard \
        --allocation-method static
    

    إشعار

    إذا كنت تستخدم موازن تحميل SKU أساسي في نظام مجموعة AKS، فاستخدم Basic للمعلمة --sku عند تعريف IP عام. تعمل عناوين SKU IP الأساسية فقط مع موازن تحميل SKU الأساسي وتعمل عناوين SKU IP القياسية فقط مع موازنات تحميل SKU القياسية .

  3. احصل على عنوان IP العام الثابت باستخدام az network public-ip list الأمر . حدد اسم مجموعة موارد العقدة وعنوان IP العام الذي أنشأته، واستعلم عن ipAddress.

    az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
    

إنشاء خدمة باستخدام عنوان IP ثابت

  1. أولا، حدد نوع الهوية المدارة التي تستخدمها مجموعة AKS الخاصة بك، المعينة من قبل النظام أو المعينة من قبل المستخدم. إذا لم تكن متأكدا، فاستدعي الأمر az aks show والاستعلام عن خاصية نوع الهوية.

    az aks show \
        --name myAKSCluster \
        --resource-group myResourceGroup \
        --query identity.type \
        --output tsv       
    

    إذا كان نظام المجموعة يستخدم هوية مدارة، ستكون قيمة خاصية النوع إما SystemAssigned أو UserAssigned.

    إذا كان نظام المجموعة يستخدم كيان خدمة، ستكون قيمة خاصية النوع فارغة. ضع في اعتبارك ترقية نظام المجموعة لاستخدام هوية مدارة.

  2. إذا كان نظام مجموعة AKS الخاص بك يستخدم هوية مدارة معينة من قبل النظام، ثم الاستعلام عن المعرف الأساسي للهوية المدارة كما يلي:

    # Get the principal ID for a system-assigned managed identity.
    CLIENT_ID=$(az aks show \
        --name myAKSCluster \
        --resource-group myNetworkResourceGroup \
        --query identity.principalId \
        --output tsv)
    

    إذا كان نظام مجموعة AKS يستخدم هوية مدارة معينة من قبل المستخدم، فسيكون المعرف الأساسي فارغا. الاستعلام عن معرف عميل الهوية المدارة المعين من قبل المستخدم بدلا من ذلك:

    # Get the client ID for a user-assigned managed identity.
    CLIENT_ID=$(az aks show \
        --name myAKSCluster \
        --resource-group myNetworkResourceGroup \
        --query identity.userAssignedIdentities.*.clientId \
        --output tsv    
    
  3. تعيين أذونات مفوضة للهوية المدارة المستخدمة من قبل نظام مجموعة AKS لمجموعة موارد IP العامة عن طريق استدعاء az role assignment create الأمر .

    # Get the resource ID for the node resource group.
    RG_SCOPE=$(az group show \
        --name <node resource group> \
        --query id \
        --output tsv)
    
    # Assign the Network Contributor role to the managed identity,
    # scoped to the node resource group.
    az role assignment create \
        --assignee ${CLIENT_ID} \
        --role "Network Contributor" \
        --scope ${RG_SCOPE}
    

    هام

    إذا قمت بتخصيص عنوان IP الصادر، فتأكد من أن هوية نظام المجموعة الخاصة بك لديها أذونات لكل من IP العام الصادر وعنوان IP العام الوارد.

  4. أنشئ ملفا باسم load-balancer-service.yaml وانسخه في محتويات ملف YAML التالي، مع توفير عنوان IP العام الذي تم إنشاؤه في الخطوة السابقة واسم مجموعة موارد العقدة.

    هام

    تؤدي إضافة الخاصية loadBalancerIP إلى بيان YAML لموازن التحميل إلى إهمال متابعة Kubernetes المصدر. بينما يظل الاستخدام الحالي كما هو ومن المتوقع أن تعمل الخدمات الحالية دون تعديل، نوصي بشدة بتعيين التعليقات التوضيحية للخدمة بدلا من ذلك. لتعيين التعليقات التوضيحية للخدمة، يمكنك إما استخدام service.beta.kubernetes.io/azure-pip-name لاسم IP العام، أو استخدام service.beta.kubernetes.io/azure-load-balancer-ipv4 لعنوان IPv4 ولعنوان service.beta.kubernetes.io/azure-load-balancer-ipv6 IPv6، كما هو موضح في مثال YAML.

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
        service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
      name: azure-load-balancer
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-load-balancer
    

    إشعار

    تضمن إضافة التعليق التوضيحي service.beta.kubernetes.io/azure-pip-name إنشاء LoadBalancer الأكثر كفاءة ويوصى به بشدة لتجنب التقييد المحتمل.

  5. قم بتعيين تسمية DNS ذات الواجهة العامة إلى الخدمة باستخدام التعليق التوضيحي للخدمة service.beta.kubernetes.io/azure-dns-label-name . يؤدي هذا إلى نشر اسم مجال مؤهل بالكامل (FQDN) للخدمة الخاصة بك باستخدام خوادم DNS العامة ومجال المستوى الأعلى في Azure. يجب أن تكون قيمة التعليق التوضيحي فريدة داخل موقع Azure، لذلك نوصي باستخدام تسمية مؤهلة بشكل كاف. يقوم Azure تلقائيا بإلحاق لاحقة افتراضية في الموقع الذي حددته، مثل <location>.cloudapp.azure.com، بالاسم الذي تقدمه، وإنشاء FQDN.

    إشعار

    إذا كنت ترغب في نشر الخدمة على مجالك الخاص، فشاهد Azure DNS ومشروع dns الخارجي.

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
        service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
        service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
      name: azure-load-balancer
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-load-balancer
    
  6. إنشاء الخدمة والنشر باستخدام kubectl apply الأمر .

    kubectl apply -f load-balancer-service.yaml
    
  7. لمشاهدة تسمية DNS لموازن التحميل الخاص بك، استخدم kubectl describe service الأمر .

    kubectl describe service azure-load-balancer
    

    سيتم سرد تسمية DNS ضمن Annotations، كما هو موضح في إخراج المثال المكثف التالي:

    Name:                    azure-load-balancer
    Namespace:               default
    Labels:                  <none>
    Annotations:             service.beta.kuberenetes.io/azure-dns-label-name: <unique-service-label>
    

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

إذا لم يكن عنوان IP الثابت المحدد في loadBalancerIP خاصية بيان خدمة Kubernetes موجودا أو لم يتم إنشاؤه في مجموعة موارد العقدة ولم يتم تكوين تفويضات أخرى، يفشل إنشاء خدمة موازن التحميل. لاستكشاف الأخطاء وإصلاحها، راجع أحداث إنشاء الخدمة باستخدام kubectl describe الأمر . أدخل اسم الخدمة المحددة في بيان YAML، كما هو موضح في المثال التالي:

kubectl describe service azure-load-balancer

يظهر لك الإخراج معلومات حول مورد خدمة Kubernetes. يظهر Warning إخراج المثال التالي في Events: "user supplied IP address was not found." في هذا السيناريو، تأكد من إنشاء عنوان IP العام الثابت في مجموعة موارد العقدة ومن صحة عنوان IP المحدد في بيان خدمة Kubernetes.

Name:                     azure-load-balancer
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=azure-load-balancer
Type:                     LoadBalancer
IP:                       10.0.18.125
IP:                       40.121.183.52
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32582/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason                      Age               From                Message
  ----     ------                      ----              ----                -------
  Normal   CreatingLoadBalancer        7s (x2 over 22s)  service-controller  Creating load balancer
  Warning  CreatingLoadBalancerFailed  6s (x2 over 12s)  service-controller  Error creating load balancer (will retry): Failed to create load balancer for service default/azure-load-balancer: user supplied IP Address 40.121.183.52 was not found

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

لمزيد من التحكم في حركة مرور الشبكة إلى التطبيقات الخاصة بك، استخدم ملحق توجيه التطبيق ل AKS. لمزيد من المعلومات حول ملحق توجيه التطبيق، راجع دخول NGINX المدار مع الوظيفة الإضافية لتوجيه التطبيق.