本页面介绍如何设置 AWS 应用负载均衡器 (ALB)。
如需详细了解 GKE on AWS 支持的其他类型的负载均衡器,请参阅负载均衡器概览。
准备工作
您必须先完成以下任务,以使 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 要在哪个子网中运行它。常用方法是使用一个标记来标记子网,表明该子网在自动发现过程中可用。或者,您可以向 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
使用此文件创建名为
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 VPC 的 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
本部分演示如何创建一个提供游戏 2048 重制版的示例 ALB。
将以下 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
使用以下命令将配置应用于您的集群:
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 负载均衡器控制器文档。