新版 AWS 上的 Anthos 集群 (GKE on AWS) 已于 2 月 25 日发布。如需了解详情,请参阅版本说明

创建应用负载平衡器 (ALB)

本主题介绍如何在 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 用户。

  1. 下载适用于 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
    
  2. 使用 aws 工具根据您下载的政策创建名为 ALBIngressControllerIAMPolicy 的 IAM 政策。

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

    响应中会显示 IAM 政策的 Amazon 资源名称 (ARN)。保存 ARN 供日后使用。

  3. 使用 aws 工具为 ADB Ingress 控制器创建 IAM 用户。

    aws iam create-user \
    --user-name ALB_CONTROLLER_USER_NAME
    

    ALB_CONTROLLER_USER_NAME 替换为您要为 ALB Ingress 控制器创建的用户名。

  4. 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。
  5. 为 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"
      }
    }
    
  6. 将访问密钥和私有访问密钥保存到环境变量中。您将使用它们来配置您的用户集群。

    ALB_ACCESS_KEY_ID=ACCESS_KEY_ID
    ALB_SECRET_ACCESS_KEY=SECRET_ACCESS_KEY
    

配置 Anthos clusters on AWS

如需配置 ALB,请将 AWS IAM 凭据保存为 Kubernetes Secret

  1. 使用访问密钥和私有访问密钥对创建 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 控制器

  1. 将以下 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 清单。

  2. 将清单应用到您的集群。

    env HTTP_PROXY=http://localhost:8118 \
      kubectl apply -f aws-alb-ingress-controller.yaml
    

创建 ALB

在本节中,您将创建一个提供游戏 2048 重制版的 ALB。

  1. 将以下 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
    
  2. 使用 kubectl 将配置应用到您的集群。

    env HTTP_PROXY=http://localhost:8118 \
    kubectl apply -f 2048.yaml
    
  3. 使用 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
    
  4. 在浏览器中导航到 ALB 端点。例如:http://123456-2048game-2048ingr-6fa0-abcdefg.us-east-1.elb.amazonaws.com。此时会显示 2048 游戏。