الدخول الخارجي أو الداخلي لخدمة Azure Kubernetes (AKS) لنشر الوظيفة الإضافية لشبكة خدمة Istio

توضح لك هذه المقالة كيفية نشر تجاوزات خارجية أو داخلية للوظيفة الإضافية لشبكة خدمة Istio لنظام مجموعة Azure Kubernetes Service (AKS).

إشعار

عند إجراء ترقية مراجعة ثانوية للوظيفة الإضافية Istio، سيتم إنشاء نشر آخر للبوابات الخارجية / الداخلية لمراجعة وحدة التحكم الجديدة.

المتطلبات الأساسية

يفترض هذا الدليل أنك اتبعت الوثائق لتمكين الوظيفة الإضافية Istio على نظام مجموعة AKS، ونشر نموذج تطبيق، وتعيين متغيرات البيئة.

تمكين بوابة الدخول الخارجية

استخدم az aks mesh enable-ingress-gateway لتمكين دخول Istio الذي يمكن الوصول إليه خارجيا على مجموعة AKS الخاصة بك:

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external

استخدم kubectl get svc للتحقق من الخدمة المعينة إلى بوابة الدخول:

kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress

لاحظ من الإخراج أن عنوان IP الخارجي للخدمة هو عنوان يمكن الوصول إليه بشكل عام:

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-external   LoadBalancer   10.0.10.249   <EXTERNAL_IP>   15021:30705/TCP,80:32444/TCP,443:31728/TCP   4m21s

إشعار

التخصيصات لعنوان IP على البوابات الداخلية والخارجية غير مدعومة حتى الآن. يتم إرجاع تخصيصات عنوان IP على مواصفات الدخول مرة أخرى بواسطة الوظيفة الإضافية Istio. من المخطط السماح بهذه التخصيصات في تنفيذ واجهة برمجة تطبيقات البوابة للوظيفة الإضافية Istio في المستقبل.

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

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway-external
spec:
  selector:
    istio: aks-istio-ingressgateway-external
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-external
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway-external
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

إشعار

يشير المحدد المستخدم في كائن Gateway إلى istio: aks-istio-ingressgateway-external، والذي يمكن العثور عليه كتسمية على الخدمة المعينة إلى الدخول الخارجي الذي تم تمكينه سابقا.

تعيين متغيرات البيئة لمضيف الدخول الخارجي والمنافذ:

export INGRESS_HOST_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_EXTERNAL=$INGRESS_HOST_EXTERNAL:$INGRESS_PORT_EXTERNAL

استرداد العنوان الخارجي لنموذج التطبيق:

echo "http://$GATEWAY_URL_EXTERNAL/productpage"

انتقل إلى عنوان URL من إخراج الأمر السابق وتأكد من عرض صفحة منتج نموذج التطبيق. بدلا من ذلك، يمكنك أيضا استخدام curl لتأكيد إمكانية الوصول إلى نموذج التطبيق. على سبيل المثال:

curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"

تأكد من إمكانية الوصول إلى صفحة منتج نموذج التطبيق. الإخراج المتوقع هو:

<title>Simple Bookstore App</title>

تمكين بوابة الدخول الداخلية

استخدم az aks mesh enable-ingress-gateway لتمكين دخول Istio داخلي على مجموعة AKS الخاصة بك:

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal

استخدم kubectl get svc للتحقق من الخدمة المعينة إلى بوابة الدخول:

kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress

لاحظ من الإخراج أن عنوان IP الخارجي للخدمة ليس عنوانا يمكن الوصول إليه بشكل عام، وبدلا من ذلك يمكن الوصول إليه محليا فقط:

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-internal   LoadBalancer   10.0.182.240  <IP>      15021:30764/TCP,80:32186/TCP,443:31713/TCP   87s

بعد تمكين بوابة الدخول، يجب كشف التطبيقات من خلال البوابة ويجب تكوين قواعد التوجيه وفقا لذلك. استخدم البيان التالي لتعيين دخول توزيع العينة إلى بوابة دخول Istio:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-internal-gateway
spec:
  selector:
    istio: aks-istio-ingressgateway-internal
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-internal
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-internal-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

إشعار

يشير المحدد المستخدم في كائن Gateway إلى istio: aks-istio-ingressgateway-internal، والذي يمكن العثور عليه كتسمية على الخدمة المعينة إلى الدخول الداخلي الذي تم تمكينه سابقا.

تعيين متغيرات البيئة لمضيف الدخول الداخلي والمنافذ:

export INGRESS_HOST_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_INTERNAL=$INGRESS_HOST_INTERNAL:$INGRESS_PORT_INTERNAL

استرداد عنوان نموذج التطبيق:

echo "http://$GATEWAY_URL_INTERNAL/productpage"

انتقل إلى عنوان URL من إخراج الأمر السابق وتأكد من عدم عرض صفحة منتج نموذج التطبيق. بدلا من ذلك، يمكنك أيضا استخدام curl لتأكيد أن نموذج التطبيق غير قابل للوصول. على سبيل المثال:

curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"

استخدم kubectl exec لتأكيد إمكانية الوصول إلى التطبيق من داخل الشبكة الظاهرية لنظام المجموعة:

kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS  "http://$GATEWAY_URL_INTERNAL/productpage"  | grep -o "<title>.*</title>"

تأكد من إمكانية الوصول إلى صفحة منتج نموذج التطبيق. الإخراج المتوقع هو:

<title>Simple Bookstore App</title>

تخصيص التعليق التوضيحي لخدمة بوابة الدخول

يمكن إضافة التعليقات التوضيحية التالية إلى خدمة Kubernetes لبوابات الدخول الخارجية والداخلية:

  • service.beta.kubernetes.io/azure-load-balancer-internal-subnet: لربط بوابة دخول داخلية بشبكة فرعية معينة.
  • service.beta.kubernetes.io/azure-shared-securityrule: لكشف بوابة الدخول من خلال قاعدة أمان معززة.
  • service.beta.kubernetes.io/azure-allowed-service-tags: لتحديد علامات الخدمة التي يمكن لبوابة الدخول تلقي الطلبات منها.
  • service.beta.kubernetes.io/azure-load-balancer-ipv4: لتكوين عنوان IPv4 ثابت.
  • service.beta.kubernetes.io/azure-load-balancer-resource-group: لتحديد مجموعة الموارد الخاصة ب IP عام في مجموعة موارد مختلفة عن المجموعة.
  • service.beta.kubernetes.io/azure-pip-name: لتحديد اسم عنوان IP عام.

حذف الموارد

إذا كنت ترغب في تنظيف بوابات الدخول الخارجية أو الداخلية Istio، ولكن اترك الشبكة ممكنة على نظام المجموعة، فقم بتشغيل الأمر التالي:

az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP}

إذا كنت ترغب في تنظيف شبكة خدمة Istio والدخول (تاركا وراءها نظام المجموعة)، فقم بتشغيل الأمر التالي:

az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

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

az group delete --name ${RESOURCE_GROUP} --yes --no-wait

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

إشعار

في حالة مواجهة أي مشكلات في نشر بوابة دخول Istio أو تكوين توجيه حركة مرور الدخول، راجع مقالة حول استكشاف أخطاء بوابات دخول Istio الإضافية وإصلاحها