設定 HTTP 負載平衡器

本頁說明如何設定 AWS Application Load Balancer (ALB)。

如要進一步瞭解 GKE on AWS 支援的其他負載平衡器類型,請參閱負載平衡器總覽

本頁內容適用於想要安裝、設定及支援網路設備的網路專家。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。 Google Cloud

事前準備

GKE on AWS 必須先完成下列事項,才能建立 ALB:

總覽

在叢集中建立第一個 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
  1. 使用這個檔案建立名為 AWSLoadBalancerControllerIAMPolicy 的 IAM 政策:

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

授予負載平衡器存取權

按照建立 AWS IAM 角色中的操作說明,為控制器的服務帳戶建立 AWS IAM 角色。在這些操作說明中,請取代下列項目:

  • AWS_POLICY_ARN:在上一個步驟中建立的 AWSLoadBalancerControllerIAPolicy ARN
  • 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 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 替換為叢集名稱
  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:AWS 虛擬私有雲的 ID,例如 vpc-1234567890abc
    • AWS_ROLE_ARN:名為「AWSLBControllerRole」的角色 ARN
    • 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 Deployment 可用。

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

建立範例 ALB

本節將示範如何建立範例 ALB,提供 2048 遊戲的重製版。

  1. 將下列 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
    
  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 和 Deployment,請使用下列指令刪除資訊清單:

kubectl delete -f 2048.yaml

後續步驟