设置 HTTP 负载均衡器

本页面介绍如何设置 AWS 应用负载均衡器 (ALB)。

如需详细了解 GKE on AWS 支持的其他类型的负载均衡器,请参阅负载均衡器概览

准备工作

您必须先完成以下任务,以使 GKE on AWS 能够创建 ALB:

概览

在集群中创建第一个 ALB 包括以下步骤:

  • 确定并标记或注解 VPC 中您希望在其中预配 ALB 的子网。
  • 创建一个 AWS 角色,以向 ALB 控制器授予 AWS 资源的访问权限。
  • 安装开源 aws-load-balancer-controller
  • 创建和部署 ALB 配置。

如需创建后续 ALB,您只需创建和部署另一个 ALB 配置即可。

创建应用负载均衡器

标记 ALB 的子网

在创建 ALB 之前,您必须告诉 AWS 要在哪个子网中运行它。常用方法是使用一个标记来标记子网,表明该子网在自动发现过程中可用。或者,您可以向 Ingress 对象添加注解,以明确列出要在其中运行该对象的子网。

如需将所选子网标记为可用于自动发现,请参阅标记服务负载均衡器子网

如需使用子网列表为 Ingress 对象添加注解,请将名为 alb.ingress.kubernetes.io/subnets 的注解添加到 Kubernetes Ingress 对象。将注解的值设置为子网 ID 或子网名称的逗号分隔列表,例如 subnet-012345678abcdef,subnet- abcdef123456789,subnet-123456789abcdef

创建 AWS IAM 权限

下载 AWS 负载均衡器控制器的 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 VPC 的 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

本部分演示如何创建一个提供游戏 2048 重制版的示例 ALB。

  1. 将以下 YAML 配置复制到名为 2048.yaml 的文件中。该配置会创建一个 Kubernetes Namespace、Service 和 Deployment。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

后续步骤