הגדרת מאזן עומסים מסוג HTTP

בדף הזה מוסבר איך להגדיר מאזן עומסים של אפליקציות (ALB) ב-AWS.

מידע נוסף על סוגים אחרים של מאזני עומסים שנתמכים ב-GKE on AWS זמין במאמר סקירה כללית על מאזני עומסים.

הדף הזה מיועד למומחי רשת שרוצים להתקין ציוד רשת, להגדיר אותו ולתת לו תמיכה. מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שאנחנו מתייחסים אליהם בתוכן זמין במאמר תפקידים נפוצים של משתמשים ומשימות ב-GKE. Google Cloud

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

כדי ש-GKE ב-AWS יוכל ליצור ALB, צריך:

סקירה כללית

כדי ליצור את ה-ALB הראשון באשכול, צריך לבצע את השלבים הבאים:

  • מזהים את רשתות המשנה ב-VPC שרוצים להקצות בהן את מאזני העומסים של האפליקציות, ומוסיפים להן תגים או הערות.
  • יוצרים תפקיד ב-AWS שנותן לבקר ALB גישה למשאבי AWS.
  • מתקינים את aws-load-balancer-controller בקוד פתוח.
  • יצירה ופריסה של הגדרת ALB.

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

יצירת מאזן עומסים של אפליקציות

תיוג של תת-הרשתות עבור ה-ALB

לפני שיוצרים ALB, צריך לציין ל-AWS באילו רשתות משנה להפעיל אותו. השיטה הרגילה היא לתייג את רשת המשנה בתג שמזהה אותה כזמינה לתהליך הגילוי האוטומטי. אפשרות אחרת היא להוסיף ביאור לאובייקט Ingress כדי לציין במפורש את רשתות המשנה שבהן הוא יפעל.

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

כדי להוסיף הערה לאובייקט Ingress עם רשימה של רשתות משנה, מוסיפים הערה בשם alb.ingress.kubernetes.io/subnets לאובייקט Ingress של Kubernetes. מגדירים את הערך של ההערה כרשימה של מזהי רשתות משנה או שמות רשתות משנה שמופרדים בפסיקים – לדוגמה subnet-012345678abcdef,subnet- abcdef123456789,subnet-123456789abcdef.

יצירת הרשאות AWS IAM

מורידים את מדיניות ה-IAM עבור בקר AWS Load Balancer. במדיניות הזו מפורטות ההרשאות שנדרשות לבקר של מאזן העומסים כדי לפעול. אפשר לעיין במדיניות ב-GitHub. הפקודה הזו שומרת את המדיניות בקובץ בשם iam_policy.json.

  curl -Lo iam_policy.json \
    https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.4/docs/install/iam_policy.json
  1. משתמשים בקובץ הזה כדי ליצור מדיניות IAM בשם AWSLoadBalancerControllerIAMPolicy:

    aws iam create-policy \
      --policy-name AWSLoadBalancerControllerIAMPolicy \
      --policy-document file://iam_policy.json
    

הענקת גישה למאזן העומסים

יוצרים תפקיד AWS IAM לחשבון השירות של בקר הנתונים לפי ההוראות במאמר בנושא יצירת תפקיד AWS IAM. בהוראות האלה, מחליפים את מה שכתוב בשדות הבאים:

  • AWS_POLICY_ARN: ה-ARN של AWSLoadBalancerControllerIAPolicy שנוצר בשלב הקודם
  • KSA_NAME: "aws-load-balancer-controller"
  • K8S_NAMESPACE: ‏"kube-system"
  • AWS_ROLE_NAME: "AWSLBControllerRole"

כדי לאחזר את ה-ARN של המדיניות, מריצים את הפקודה הבאה:

aws iam list-policies \
  --query 'Policies[?PolicyName==`AWSLoadBalancerControllerIAMPolicy`].Arn' \
  --output text

התקנת בקר מאזן העומסים של AWS

  1. כדי לבצע את השלבים האלה, צריך לחלץ ולשמור את הערכים הבאים. תצטרכו אותם בהמשך.

    מריצים את הפקודה הבאה כדי למצוא את ה-UID של האשכול:

      gcloud container aws clusters describe CLUSTER_NAME \
        --location GOOGLE_CLOUD_LOCATION \
        --format "value(uid)"
    

    מריצים את הפקודה הבאה כדי למצוא את מזהה ה-VPC של האשכול:

      gcloud container aws clusters describe CLUSTER_NAME \
        --location GOOGLE_CLOUD_LOCATION \
        --format "value(networking.vpcId)"
    

    מריצים את הפקודה הבאה כדי למצוא את ה-ARN של התפקיד שנקרא AWSLBControllerRole:

    aws iam get-role --role-name AWSLBControllerRole --query Role.Arn --output text
    

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

    gcloud container aws clusters describe CLUSTER_NAME \
      --location GOOGLE_CLOUD_LOCATION \
      --format "value(awsRegion)"
    

    מחליפים את:

    • GOOGLE_CLOUD_LOCATION בשם האזור ב-Google שמשויך לאשכול
    • CLUSTER_NAME בשם של האשכול
  2. מתקינים את cert-manager באמצעות הפקודה הבאה:

    kubectl apply \
      --validate=false \
      -f https://github.com/jetstack/cert-manager/releases/download/v1.10.0/cert-manager.yaml
    
  3. מורידים את קובץ המניפסט של aws-load-balancer-controller ושומרים אותו בקובץ המקומי v2_4_4_full.yaml באמצעות הפקודה הבאה:

    curl -Lo v2_4_4_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.4/v2_4_4_full.yaml
    
  4. עורכים את הקובץ v2_4_4_full.yaml ומחפשים את kind: Deployment. החלפת האובייקט Deployment בגרסה ששונתה:

    kind: Deployment
    metadata:
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/name: aws-load-balancer-controller
      name: aws-load-balancer-controller
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/component: controller
          app.kubernetes.io/name: aws-load-balancer-controller
      template:
        metadata:
          labels:
            app.kubernetes.io/component: controller
            app.kubernetes.io/name: aws-load-balancer-controller
        spec:
          containers:
          - args:
            - --cluster-name=CLUSTER_UID
            - --aws-region=AWS_REGION
            - --aws-vpc-id=AWS_VPC_ID
            - --ingress-class=alb
            - --disable-restricted-sg-rules=true
            image: amazon/aws-alb-ingress-controller:v2.4.4
            env:
            - name: AWS_ROLE_ARN
              value: AWS_ROLE_ARN
            - name: AWS_WEB_IDENTITY_TOKEN_FILE
              value: /var/run/secrets/aws-load-balancer-controller/serviceaccount/token
            livenessProbe:
              failureThreshold: 2
              httpGet:
                path: /healthz
                port: 61779
                scheme: HTTP
              initialDelaySeconds: 30
              timeoutSeconds: 10
            name: controller
            ports:
            - containerPort: 9443
              name: webhook-server
              protocol: TCP
            resources:
              limits:
                cpu: 200m
                memory: 500Mi
              requests:
                cpu: 100m
                memory: 200Mi
            securityContext:
              allowPrivilegeEscalation: false
              readOnlyRootFilesystem: true
              runAsNonRoot: true
            volumeMounts:
            - mountPath: /tmp/k8s-webhook-server/serving-certs
              name: cert
              readOnly: true
            - mountPath: /var/run/secrets/aws-load-balancer-controller/serviceaccount
              name: aws-iam-token
              readOnly: true
          priorityClassName: system-cluster-critical
          securityContext:
            fsGroup: 1337
          serviceAccountName: aws-load-balancer-controller
          terminationGracePeriodSeconds: 10
          volumes:
          - name: cert
            secret:
              defaultMode: 420
              secretName: aws-load-balancer-webhook-tls
          - name: aws-iam-token
            projected:
              defaultMode: 420
              sources:
              - serviceAccountToken:
                  audience: sts.amazonaws.com
                  expirationSeconds: 86400
                  path: token
    ---
    

    מחליפים את מה שכתוב בשדות הבאים:

    • CLUSTER_UID: מזהה ה-UID של האשכול. לדוגמה: bbc7d232-21f6-4bb1-90dd-4b064cf8ccf8
    • AWS_VPC_ID: המזהה של ה-VPC ב-AWS. לדוגמה: vpc-1234567890abc.
    • AWS_ROLE_ARN: ה-ARN של התפקיד שנקרא AWSLBControllerRole
    • AWS_REGION: האזור ב-AWS שבו נמצא האשכול – לדוגמה, us-east-1
  5. מחילים את המניפסט ששיניתם על האשכול באמצעות הפקודה הבאה:

    kubectl apply -f v2_4_4_full.yaml
    
  6. מריצים את הפקודה הבאה כדי לוודא שבקר מאזן העומסים פועל:

    kubectl get deployment -n kube-system aws-load-balancer-controller
    

    הפלט אמור להיראות כך, ולהראות שהפריסה aws-load-balancer-controller זמינה.

    NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
    aws-load-balancer-controller   1/1     1            1           51s
    

יצירת ALB לדוגמה

בקטע הזה מוסבר איך ליצור ALB לדוגמה שמציג גרסה מחודשת של המשחק 2048.

  1. מעתיקים את הגדרות ה-YAML הבאות לקובץ בשם 2048.yaml. ההגדרה יוצרת מרחב שמות, שירות ופריסה של Kubernetes. הפריסה נחשפת דרך Ingress ALB.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: game-2048
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: game-2048
      name: deployment-2048
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: app-2048
      replicas: 5
      template:
        metadata:
          labels:
            app.kubernetes.io/name: app-2048
        spec:
          containers:
          - image: alexwhen/docker-2048
            imagePullPolicy: Always
            name: app-2048
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      namespace: game-2048
      name: service-2048
    spec:
      ports:
        - port: 80
          targetPort: 80
          protocol: TCP
      type: NodePort
      selector:
        app.kubernetes.io/name: app-2048
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      namespace: game-2048
      name: ingress-2048
      annotations:
        alb.ingress.kubernetes.io/scheme: internet-facing
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: service-2048
                    port:
                      number: 80
    
  2. מריצים את הפקודה הבאה כדי להחיל את ההגדרה על האשכול:

    kubectl apply -f 2048.yaml
    
  3. כדי לבדוק את הסטטוס של משאב ה-Ingress, מריצים את הפקודה הבאה:

    kubectl get ingress -n game-2048 ingress-2048
    

    פלט הפקודה אמור להיראות כך: בעמודה ADDRESS מופיע נקודת הקצה של משאב ה-Ingress.

     NAME           CLASS    HOSTS   ADDRESS                                                                   PORTS   AGE
     ingress-2048   <none>   *       k8s-game2048-ingress2-e2c347319a-1195690687.us-west-2.elb.amazonaws.com   80      2m19s
     ```
    
  4. עוברים לנקודת הקצה של ה-ALB בדפדפן – לדוגמה: http://k8s-game2048-ingress2-e2c347319a-1195690687.us-west-2.elb.amazonaws.com. המשחק 2048 מוצג, וזה אומר שפרסתם והגדרתם בהצלחה את מאזן העומסים של ALB.

סידור וארגון

כדי להסיר את ה-ALB ואת הפריסה לדוגמה שנוצרו בשלב הקודם, מוחקים את המניפסט באמצעות הפקודה הבאה:

kubectl delete -f 2048.yaml

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