בדף הזה מוסבר איך להגדיר מאזן עומסים של אפליקציות (ALB) ב-AWS.
מידע נוסף על סוגים אחרים של מאזני עומסים שנתמכים ב-GKE on AWS זמין במאמר סקירה כללית על מאזני עומסים.
הדף הזה מיועד למומחי רשת שרוצים להתקין ציוד רשת, להגדיר אותו ולתת לו תמיכה. מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שאנחנו מתייחסים אליהם בתוכן זמין במאמר תפקידים נפוצים של משתמשים ומשימות ב-GKE. Google Cloud
לפני שמתחילים
כדי ש-GKE ב-AWS יוכל ליצור ALB, צריך:
- יוצרים אשכול GKE ב-AWS ומגדירים גישה אליו באמצעות
kubectl. - רושמים את ספק ה-OIDC של האשכול ב-AWS.
סקירה כללית
כדי ליצור את ה-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
משתמשים בקובץ הזה כדי ליצור מדיניות 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
כדי לבצע את השלבים האלה, צריך לחלץ ולשמור את הערכים הבאים. תצטרכו אותם בהמשך.
מריצים את הפקודה הבאה כדי למצוא את ה-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בשם של האשכול
-
מתקינים את
cert-managerבאמצעות הפקודה הבאה:kubectl apply \ --validate=false \ -f https://github.com/jetstack/cert-manager/releases/download/v1.10.0/cert-manager.yamlמורידים את קובץ המניפסט של
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עורכים את הקובץ
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
-
מחילים את המניפסט ששיניתם על האשכול באמצעות הפקודה הבאה:
kubectl apply -f v2_4_4_full.yamlמריצים את הפקודה הבאה כדי לוודא שבקר מאזן העומסים פועל:
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.
מעתיקים את הגדרות ה-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מריצים את הפקודה הבאה כדי להחיל את ההגדרה על האשכול:
kubectl apply -f 2048.yamlכדי לבדוק את הסטטוס של משאב ה-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 ```עוברים לנקודת הקצה של ה-ALB בדפדפן – לדוגמה:
http://k8s-game2048-ingress2-e2c347319a-1195690687.us-west-2.elb.amazonaws.com. המשחק 2048 מוצג, וזה אומר שפרסתם והגדרתם בהצלחה את מאזן העומסים של ALB.
סידור וארגון
כדי להסיר את ה-ALB ואת הפריסה לדוגמה שנוצרו בשלב הקודם, מוחקים את המניפסט באמצעות הפקודה הבאה:
kubectl delete -f 2048.yaml
המאמרים הבאים
- מידע נוסף על הערות Ingress
- מידע נוסף על AWS Load Balancer Controller