创建负载平衡器

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

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

您还可以按照快速入门通过 Google Cloud 控制台创建面向外部的传统 ELB 或创建 AWS 应用负载均衡器 (ALB)

准备工作

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

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

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

GKE on AWS 会根据 LoadBalancer 资源的注释,创建外部负载平衡器(在公共子网中)或内部负载平衡器(在专用子网中)。

如果选择外部负载平衡器,该节点池的安全群组和子网的网络访问控制列表 (ACL) 允许的 IP 地址可以访问该负载平衡器。

选择负载平衡器类型

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

创建 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 HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f my-deployment-50001.yaml
    
  3. 验证三个 pod 是否正在运行:

    env HTTPS_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
    

    Classic Private

    您可以通过将注释 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 Private

    您可以通过设置注释来创建专用 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 HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f my-lb-service.yaml
    
  6. 使用 kubectl get service 查看 Service 的主机名。

    env HTTPS_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
    

清理

如需移除 Service 和 Deployment,请使用 kubectl delete

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

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

问题排查

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

后续步骤