本頁說明如何設定 AWS Application Load Balancer (ALB)。
如要進一步瞭解 GKE on AWS 支援的其他負載平衡器類型,請參閱負載平衡器總覽。
本頁內容適用於想要安裝、設定及支援網路設備的網路專家。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。 Google Cloud
事前準備
GKE on AWS 必須先完成下列事項,才能建立 ALB:
- 建立 GKE on AWS 叢集,並使用
kubectl
設定叢集的存取權。 - 向 AWS 註冊叢集的 OIDC 供應商。
總覽
在叢集中建立第一個 ALB 時,請按照下列步驟操作:
- 找出並標記或註解 VPC 內的子網路,以供佈建 ALB。
- 建立 AWS 角色,授予 ALB 控制器存取 AWS 資源的權限。
- 安裝開放原始碼的
aws-load-balancer-controller
。 - 建立及部署 ALB 設定。
如要建立後續的 ALB,只需建立並部署另一個 ALB 設定即可。
建立應用程式負載平衡器
為 ALB 加上子網路標記
建立 ALB 前,您必須告知 AWS 要在哪些子網路中執行 ALB。一般方法是為子網路加上標記,將其識別為可供自動探索程序使用。或者,您也可以在 Ingress 物件中新增註解,明確列出要執行的子網路。
如要將所選子網路標示為可供自動探索,請參閱為服務負載平衡器子網路加上標記。
如要使用子網路清單註解 Ingress 物件,請在 Kubernetes Ingress 物件中新增名為 alb.ingress.kubernetes.io/subnets
的註解。將註解的值設為子網路 ID 或子網路名稱的清單 (以半形逗號分隔),例如 subnet-012345678abcdef,subnet-
abcdef123456789,subnet-123456789abcdef
。
建立 AWS IAM 權限
下載 AWS Load Balancer Controller 的 IAM 政策。這項政策會列舉負載平衡器控制器運作所需的權限。您可以在 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
使用這個檔案建立名為
AWSLoadBalancerControllerIAMPolicy
的 IAM 政策:aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
授予負載平衡器存取權
按照建立 AWS IAM 角色中的操作說明,為控制器的服務帳戶建立 AWS IAM 角色。在這些操作說明中,請取代下列項目:
AWS_POLICY_ARN
:在上一個步驟中建立的 AWSLoadBalancerControllerIAPolicy ARNKSA_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 ID:
gcloud container aws clusters describe CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION \ --format "value(networking.vpcId)"
執行下列指令,找出名為
AWSLBControllerRole
的角色 ARN: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
:AWS 虛擬私有雲的 ID,例如vpc-1234567890abc
。AWS_ROLE_ARN
:名為「AWSLBControllerRole
」的角色 ARNAWS_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
Deployment 可用。NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 1/1 1 1 51s
建立範例 ALB
本節將示範如何建立範例 ALB,提供 2048 遊戲的重製版。
將下列 YAML 設定複製到名為
2048.yaml
的檔案中。這項設定會建立 Kubernetes 命名空間、服務和部署作業。Deployment 會透過 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 和 Deployment,請使用下列指令刪除資訊清單:
kubectl delete -f 2048.yaml
後續步驟
- 瞭解 Ingress 註解
- 請參閱 AWS Load Balancer Controller 說明文件。