本主题介绍如何在 AWS(AWS 上的 GKE)上通过 Anthos 集群设置 AWS 应用负载平衡器 (ALB)。
准备工作
在使用 Anthos clusters on AWS 之前,请确保您已执行以下任务:
- 完成前提条件。
- 有权为负载平衡器创建 AWS IAM 用户。
- 安装管理服务。
- 创建用户集群。
- 在
anthos-aws
目录中,使用anthos-gke
将上下文切换到用户集群。cd anthos-aws env HTTP_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
- 安装
curl
命令行工具或类似工具。 - 在 ALB 的两个或两个以上的可用性区域中创建或选择子网。
在 Anthos clusters on AWS 上设置 ALB
在创建 ALB 之前,您可以通过设置 AWS IAM 权限并提供访问密钥来配置 Anthos clusters on AWS。
创建 AWS IAM 权限
如需为用户集群创建 ALB,您必须设置一个拥有创建和操作 ALB 权限的 AWS IAM 用户。
下载适用于 APB Ingress 控制器的 IAM 政策。您可以在 GitHub 上查看该政策。
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/iam-policy.json
使用
aws
工具根据您下载的政策创建名为ALBIngressControllerIAMPolicy
的 IAM 政策。aws iam create-policy \ --policy-name ALBIngressControllerIAMPolicy \ --policy-document file://iam-policy.json
响应中会显示 IAM 政策的 Amazon 资源名称 (ARN)。保存 ARN 供日后使用。
使用
aws
工具为 ADB Ingress 控制器创建 IAM 用户。aws iam create-user \ --user-name ALB_CONTROLLER_USER_NAME
将 ALB_CONTROLLER_USER_NAME 替换为您要为 ALB Ingress 控制器创建的用户名。
将
ALBIngressControllerIAMPolicy
附加到用户名。aws iam attach-user-policy \ --user-name ALB_CONTROLLER_USER_NAME \ --policy-arn ALB_IAM_POLICY_ARN
您需要将其中的:
- 将 ALB_CONTROLLER_USER_NAME 替换为您要为 ALB Ingress 控制器创建的用户名。
- 将 ALB_IAM_POLICY_ARN 替换为您之前创建的 IAM 政策的 ARN。
为 ALB Ingress 控制器用户创建 AWS IAM 访问密钥。
aws iam create-access-key --user-name ALB_CONTROLLER_USER_NAME
将 ALB_CONTROLLER_USER_NAME 替换为您要为 ALB Ingress 控制器创建的用户名。
aws
命令行工具会输出访问密钥的详细信息。{ "AccessKey": { "UserName": ALB_CONTROLLER_USER_NAME "AccessKeyId": "AKIAIOSFODNN7EXAMPLE", "Status": "Active", "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "CreateDate": "2020-07-23T17:53:58Z" } }
将访问密钥和私有访问密钥保存到环境变量中。您将使用它们来配置您的用户集群。
ALB_ACCESS_KEY_ID=ACCESS_KEY_ID ALB_SECRET_ACCESS_KEY=SECRET_ACCESS_KEY
配置 Anthos clusters on AWS
如需配置 ALB,请将 AWS IAM 凭据保存为 Kubernetes Secret。
使用访问密钥和私有访问密钥对创建 Secret。ALB Ingress 控制器使用此 Secret 向 AWS 进行身份验证和管理 ALB。
env HTTP_PROXY=http://localhost:8118 \ kubectl create secret generic alb-ingress-controller-creds \ -n kube-system \ --from-literal=access_key_id=$ALB_ACCESS_KEY_ID \ --from-literal=secret_access_key=$ALB_SECRET_ACCESS_KEY
部署 ALB Ingress 控制器
将以下 YAML 复制到名为
aws-alb-ingress-controller.yaml
的文件中。# Original from GitHub: https://github.com/kubernetes-sigs/aws-alb-ingress-controller apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/name: alb-ingress-controller name: alb-ingress-controller namespace: kube-system spec: selector: matchLabels: app.kubernetes.io/name: alb-ingress-controller template: metadata: labels: app.kubernetes.io/name: alb-ingress-controller spec: containers: - name: alb-ingress-controller args: - --ingress-class=alb - --cluster-name=CLUSTER_ID - --aws-vpc-id=AWS_VPC_ID - --aws-region=AWS_REGION env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: alb-ingress-controller-creds key: access_key_id - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: alb-ingress-controller-creds key: secret_access_key image: docker.io/amazon/aws-alb-ingress-controller:v1.1.8 serviceAccountName: alb-ingress-controller --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: app.kubernetes.io/name: alb-ingress-controller name: alb-ingress-controller rules: - apiGroups: - "" - extensions resources: - configmaps - endpoints - events - ingresses - ingresses/status - services - pods/status verbs: - create - get - list - update - watch - patch - apiGroups: - "" - extensions resources: - nodes - pods - secrets - services - namespaces verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: app.kubernetes.io/name: alb-ingress-controller name: alb-ingress-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: alb-ingress-controller subjects: - kind: ServiceAccount name: alb-ingress-controller namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/name: alb-ingress-controller name: alb-ingress-controller namespace: kube-system
请替换以下内容:
将 CLUSTER_ID 替换为用户集群的名称。例如
gke-abcdef12
。将 AWS_VPC_ID 替换为 AWS VPC 的 ID。例如
vpc-1234567890abc
。将 AWS_REGION 替换为用户集群的 AWS 地区。例如
us-east-1
。
如需详细了解此配置,请参阅
aws-alb-ingress-controller
GitHub 代码库中的alb-ingress-controller
清单。将清单应用到您的集群。
env HTTP_PROXY=http://localhost:8118 \ kubectl apply -f aws-alb-ingress-controller.yaml
创建 ALB
在本节中,您将创建一个提供游戏 2048 重制版的 ALB。
将以下 YAML 配置复制到名为
2048.yaml
的文件中。该配置会创建一个 Kubernetes Namespace、Service 和 Deployment。使用 Ingress 公开 Deployment。apiVersion: v1 kind: Namespace metadata: name: "2048-game" --- apiVersion: v1 kind: Service metadata: name: "service-2048" namespace: "2048-game" spec: ports: - port: 80 targetPort: 80 protocol: TCP type: NodePort selector: app: "2048" --- apiVersion: apps/v1 kind: Deployment metadata: name: "2048-deployment" namespace: "2048-game" spec: selector: matchLabels: app: "2048" replicas: 5 template: metadata: labels: app: "2048" spec: containers: - image: alexwhen/docker-2048 imagePullPolicy: Always name: "2048" ports: - containerPort: 80 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: "2048-ingress" namespace: "2048-game" annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing labels: app: 2048-ingress spec: rules: - http: paths: - path: /* backend: serviceName: "service-2048" servicePort: 80
使用
kubectl
将配置应用到您的集群。env HTTP_PROXY=http://localhost:8118 \ kubectl apply -f 2048.yaml
使用
kubectl
查看 Ingress 资源的状态。env HTTP_PROXY=http://localhost:8118 \ kubectl get ingress -n 2048-game 2048-ingress
此时会显示 Ingress 的状态。
ADDRESS
列包含 Ingress 的端点。NAME HOSTS ADDRESS PORTS AGE 2048-ingress * 123456-2048game-2048ingr-6fa0-abcdefg.us-east-1.elb.amazonaws.com 80 2m19s
在浏览器中导航到 ALB 端点。例如:
http://123456-2048game-2048ingr-6fa0-abcdefg.us-east-1.elb.amazonaws.com
。此时会显示 2048 游戏。