新版 GKE on AWS 已于 11 月 2 日发布。如需了解详情,请参阅版本说明

创建负载平衡器

本主题介绍如何使用 GKE on AWS 设置 AWS Elastic Load Balancer (ELB)。

当您创建类型为 LoadBalancer 的 Service 时,GKE on AWS 控制器会在 AWS 上配置传统网络 ELB。

准备工作

在开始使用 GKE on AWS 之前,请确保您已执行以下任务:

  • 安装管理服务
  • 创建用户集群
  • anthos-aws 目录中,使用 anthos-gke 将上下文切换到用户集群。
    cd anthos-aws
    env HTTP_PROXY=http://localhost:8118 \
    anthos-gke aws clusters get-credentials CLUSTER_NAME
  • 安装 curl 命令行工具或类似工具。

选择外部或内部负载平衡器

GKE on AWS 会根据对象中的注释创建公共或专用负载平衡器。

如果子网是公共子网,则负载平衡器可供子网的安全群组网络访问控制列表 (ACL) 允许的地址访问。

选择负载平衡器类型

选择您是要创建传统负载平衡器(传统 ELB)还是网络负载平衡器 (NLB)。如需详细了解负载平衡器类型之间的差异,请参阅 AWS 文档中的负载平衡器类型

准备您的 AWS 网络

若要让 GKE on AWS 在正确的子网上配置负载平衡器,您需要使用集群 ID 标记您的 VPC 和子网。如果您已标记 VPC 和子网,请跳到下一部分

创建 LoadBalancer

您可以通过创建部署并使用 Service 公开该部署来创建负载平衡器。

  1. 创建您的部署。此 Deployment 中的容器会侦听端口 50001。将以下 YAML 保存到名为 my-deployment-50001.yaml 的文件:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment-50001
    spec:
      selector:
        matchLabels:
          app: products
          department: sales
      replicas: 3
      template:
        metadata:
          labels:
            app: products
            department: sales
        spec:
          containers:
          - name: hello
            image: "gcr.io/google-samples/hello-app:2.0"
            env:
            - name: "PORT"
              value: "50001"
    
  2. 使用 kubectl apply 创建 Deployment:

    env HTTP_PROXY=http://localhost:8118 \
    kubectl apply -f my-deployment-50001.yaml
    
  3. 验证三个 pod 是否正在运行:

    env HTTP_PROXY=http://localhost:8118 \
    kubectl get pods --selector=app=products
    
  4. 为您的部署创建类型为 LoadBalancer 的 Service。您可以在公共子网或专用子网上创建传统网络或网络 ELB。选择下列其中一个选项:

    • 公共子网上的传统 ELB
    • 公共子网上的 NLB
    • 专用子网上的传统 ELB
    • 专用子网上的 NLB

    然后,将以下清单复制到名为 my-lb-service.yaml 的文件。

    传统公共

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    NLB 公共

    您可以通过将注释 service.beta.kubernetes.io/aws-load-balancer-type 设置为 nlb 来创建 NLB。以下 YAML 包含此注释。

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    传统专用

    您可以通过将注释 service.beta.kubernetes.io/aws-load-balancer-internal 设置为 "true" 来创建专用 LoadBalancer。以下 YAML 包含此注释。

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    NLB 专用

    您可以通过设置注释来创建专用 NLB:

    • service.beta.kubernetes.io/aws-load-balancer-internal 设置为 "true"
    • service.beta.kubernetes.io/aws-load-balancer-type 设置为 nlb

    以下 YAML 包含这两个注释。

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: "true"
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    
  5. 使用 kubectl apply 创建 Service:

    env HTTP_PROXY=http://localhost:8118 \
    kubectl apply -f my-lb-service.yaml
    
  6. 使用 kubectl get service 查看 Service 的主机名。

    env HTTP_PROXY=http://localhost:8118 \
    kubectl get service my-lb-service \
    --output jsonpath="{.status.loadBalancer.ingress..hostname}{'\n'}"
    

    输出类似于 elb-id.elb.aws-region.amazonaws.com

  7. 如果您已创建面向外部的负载平衡器并且有权访问公共 VPC 子网,则可以使用 curl 连接到负载平衡器。将 external-ip 替换为上一步的 kubectl get service 输出中的 IP。

    curl external-ip:60000
    

    输出类似以下内容:

    Hello, world!
    Version: 2.0.0
    Hostname: my-deployment-50001-84b6dc5555-zmk7q
    

清理

使用 kubectl delete 移除 Service 和 Deployment。

env HTTP_PROXY=http://localhost:8118 \
kubectl delete -f my-lb-service.yaml

env HTTP_PROXY=http://localhost:8118 \
kubectl delete -f my-deployment-50001.yaml

问题排查

如果您无法访问负载平衡器端点,请尝试标记您的子网

后续步骤

阅读在 Google Cloud 上运行 GKE 文档中的使用 Service 公开应用