חשיפת שער כניסה באמצעות מאזן עומסים חיצוני

סקירה כללית

באמצעות Cloud Service Mesh אפשר לפרוס ולנהל שערים של תעבורת נכנסת כחלק מ-Service Mesh. אפשר להגדיר עוד איזון עומסים לאשכול באמצעות Cloud Service Mesh, על ידי שימוש במאזני עומסים חיצוניים (פיזיים או תוכנתיים, מחוץ לאשכול) כדי לשלוח תעבורה לשער הכניסה.

בדף הזה מוסבר איך להגדיר מאזן עומסים חיצוני באמצעות Cloud Service Mesh. אפשרות אחרת היא להגדיר כניסה עם כמה הגדרות של קצה עורפי.

לפני שמתחילים

כדי לבצע את השלבים במאמר הזה, אתם צריכים את המשאבים הבאים:

  • אשכול Kubernetes שמותקן בו Cloud Service Mesh.

  • מאזן עומסים חיצוני שיכול לגשת לצמתים שבהם האשכול פועל. מגדירים את מאזן העומסים החיצוני הזה כך שישמש כקצה קדמי של שער הכניסה (ingress) של האשכול באמצעות כתובת ה-IP החיצונית של מאזן העומסים.

מגדירים את הסביבה

מריצים את הפקודות הבאות מתחנת עבודה שיש לה גישה לאשכול שרוצים להשתמש בו. חשוב לוודא שהכלי kubectl מוגדר לשימוש בהקשר של האשכול שספציפי לאשכול שלכם.

  1. מגדירים את משתני הסביבה.

    export ASM_INGRESSGATEWAY_NAMESPACE=asm-ingressgateway
    export ASM_INGRESSGATEWAY_DEPLOYMENT_NAME=asm-ingressgateway
    export ASM_INGRESSGATEWAY_SERVICE_NAME=asm-ingressgateway
    export ASM_INGRESSGATEWAY_NODE_LABEL=asm-ingressgateway
    
  2. מגדירים את IP address של מאזן העומסים החיצוני.

    export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
    
  3. ‫[\Optional/] מתייגים את הצמתים של שער הכניסה. כך מוודאים שהשער יופעל בצמתים ספציפיים באשכול.

    kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
    
    • INGRESSGATEWAY_NODE_IP: הצמתים באשכול Kubernetes שמארחים את שער הכניסה. מריצים את הפקודה kubectl לכל צומת כניסה שיש לכם.

יצירת שער הכניסה

לפני שמבצעים את ההוראות שבקטע הזה, צריך לקבוע את היישום של מישור הבקרה. כדי לעשות את זה, פועלים לפי ההוראות במאמר זיהוי ההטמעה של מישור הבקרה.

  1. יוצרים את מרחב השמות. מרחב השמות הזה משמש לפריסת שער הכניסה (ingress).

    kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
    
  1. מפעילים את מרחב השמות להחדרה. השלבים תלויים בהטמעה של מישור הבקרה.

    מנוהל (TD)

    1. מחילים את תווית ההזרקה שמוגדרת כברירת מחדל על מרחב השמות:
    kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
        istio.io/rev- istio-injection=enabled --overwrite
    

    מנוהל (Istiod)

    מומלץ: מריצים את הפקודה הבאה כדי להחיל את תווית ברירת המחדל של הזרקה על מרחב השמות:

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio.io/rev- istio-injection=enabled --overwrite
    

    אם אתם משתמשים קיימים במישור הבקרה המנוהל של Istiod: מומלץ להשתמש בהזרקה שמוגדרת כברירת מחדל, אבל יש תמיכה גם בהזרקה מבוססת-עדכון. פועלים לפי ההוראות הבאות:

    1. מריצים את הפקודה הבאה כדי לאתר את ערוצי ההפצה הזמינים:

      kubectl -n istio-system get controlplanerevision
      

      הפלט אמור להיראות כך:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      הערה: אם ברשימה שלמעלה מופיעות שתי גרסאות של מישור הבקרה, צריך להסיר אחת מהן. אין תמיכה בכמה ערוצי מישור בקרה באשכול.

      בפלט, הערך בעמודה NAME הוא תווית הגרסה שתואמת לערוץ ההפצה שזמין לגרסה של Cloud Service Mesh.

    2. החלת תווית הגרסה על מרחב השמות:

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    באשכול

    מומלץ: מריצים את הפקודה הבאה כדי להחיל את תווית ברירת המחדל של הזרקה על מרחב השמות:

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio.io/rev- istio-injection=enabled --overwrite
    

    מומלץ להשתמש בהחדרה שמוגדרת כברירת מחדל, אבל יש תמיכה גם בהחדרה שמבוססת על עדכון: פועלים לפי ההוראות הבאות:

    1. משתמשים בפקודה הבאה כדי לאתר את תווית הגרסה ב-istiod:

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. מחילים את תווית הגרסה על מרחב השמות. בפקודה הבאה, REVISION_LABEL הוא הערך של התווית istiod revision שרשמתם בשלב הקודם.

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  2. מחילים את קובץ המניפסט של שער הכניסה.

    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} apply --filename https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/ingress-gateway-external-lb/ingress-gateway.yaml
    

    הפלט אמור להיראות כך:

    serviceaccount/asm-ingressgateway created
    role.rbac.authorization.k8s.io/asm-ingressgateway created
    rolebinding.rbac.authorization.k8s.io/asm-ingressgateway created
    deployment.apps/asm-ingressgateway created
    service/asm-ingressgateway created
    poddisruptionbudget.policy/asm-ingressgateway created
    horizontalpodautoscaler.autoscaling/asm-ingressgateway created
    
  3. מבצעים תיקון (patch) בשירות ingressgateway באמצעות כתובת ה-IP של מאזן העומסים החיצוני.

    cat <<EOF > asm-external-ip-patch.yaml
    spec:
      externalIPs:
        - ${EXTERNAL_LB_IP_ADDRESS}
      loadBalancerIP: ${EXTERNAL_LB_IP_ADDRESS}
    EOF
    
    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --patch "$(cat asm-external-ip-patch.yaml)"
    
  4. ‫[Optional] תיקון הפריסה של ingressgateway בשביל שיוך תוויות לצמתי שער הכניסה.

    cat <<EOF > asm-ingress-node-label-patch.yaml
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ${ASM_INGRESSGATEWAY_NODE_LABEL}
                    operator: Exists
    EOF
    
    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch deployment/${ASM_INGRESSGATEWAY_DEPLOYMENT_NAME} --patch "$(cat asm-ingress-node-label-patch.yaml)"
    

הגדרת מאזן עומסים חיצוני

בקטע הזה מגדירים את מאזן העומסים החיצוני כדי להתחבר לשער הכניסה מהאשכול.

שליפת פרטי היציאה של שער הכניסה Service

  1. קבלת NodePorts.

    export HTTP_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
    export HTTPS_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
    export STATUS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
    
  2. להציג את NodePorts.

    echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT}
    echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT}
    echo STATUS_PORT=${STATUS_PORT}
    

הגדרת מאזן העומסים החיצוני

משתמשים ב-NodePorts שמוצג בשלב הקודם כדי להגדיר קישוריות בין מאזן העומסים החיצוני לבין שער הכניסה.

  1. מגדירים את בדיקת התקינות בהגדרות של מאזן העומסים.

    hosts:    CLUSTER_NODE_IP
    Protocol: HTTP
    Port:     STATUS_PORT
    Path:     /healthz/ready
    
    • CLUSTER_NODE_IP: כתובת ה-IP של הצמתים באשכול Kubernetes שמארח את שער הכניסה. צריך להיות אפשר להגיע לכתובת ה-IP הזו ממאזן העומסים החיצוני. יכול להיות שתצטרכו להגדיר את ההגדרה הזו כמה פעמים, פעם אחת לכל צומת באשכול.

    • STATUS_PORT: הוא NodePort שדרכו נחשף ה-API של סטטוס התקינות של שער הכניסה. אפשר להעתיק את המידע הזה מהשלב הקודם. הערך זהה לכל צומת באשכול.

  2. מגדירים מאגרי צמתים במאזן העומסים לניתוב תנועה של HTTP ו-HTTPS. משתמשים בהגדרה הבאה IP:PORT לתנועה ביציאה 80 (HTTP) וביציאה 443 (HTTPS).

    80  ->  CLUSTER_NODE_IP:HTTP_INGRESS_PORT
    443 ->  CLUSTER_NODE_IP:HTTPS_INGRESS_PORT
    
    • CLUSTER_NODE_IP: כתובת ה-IP של הצמתים באשכול Kubernetes שמארח את שער הכניסה. צריך להיות אפשר להגיע לכתובת ה-IP הזו ממאזן העומסים החיצוני. יכול להיות שתצטרכו להגדיר את ההגדרה הזו כמה פעמים, פעם אחת לכל צומת באשכול.

    • HTTP_INGRESS_PORT: הוא NodePort שדרכו נחשפת תנועת ה-HTTP של שער הכניסה. אפשר להעתיק את המידע הזה מהשלב הקודם. הערך זהה לכל צומת באשכול.

    • HTTPS_INGRESS_PORT: הוא NodePort שדרכו נחשפת תנועת ה-HTTPS של שער הכניסה. אפשר להעתיק את המידע הזה מהשלב הקודם. הערך זהה לכל צומת באשכול.

כדי לוודא שההגדרה תקינה, צריך לוודא שבדיקות התקינות במאזן העומסים עוברות.

המאמרים הבאים