创建网络负载均衡器

本页面介绍如何使用 AWS Elastic Load Balancer (ELB) 或网络负载均衡器 (NLB) 端点设置 L4 负载均衡器

如需详细了解可与 GKE on AWS 配合使用的其他类型的负载平衡器,请参阅负载平衡器概览

准备工作

选择负载均衡器类型

GKE on AWS 会创建一个 Service 负载均衡器,并将其作为 AWS 传统 Elastic Load Balancer(传统 ELB)或 NLB。默认情况下,GKE on AWS 会创建一个传统 ELB。如需创建 NLB,请将 service.beta.kubernetes.io/aws-load-balancer-type 注解设置为 nlb。如需详细了解负载均衡器类型之间的差异,请参阅 AWS 文档中的负载均衡器类型

选择面向互联网的负载均衡器或内部负载均衡器

服务负载均衡器可以是面向互联网的(具有可公开解析的 DNS 名称),也可以是内部的(仅在 VPC 内可访问)。

默认情况下,新创建的负载均衡器是面向互联网的。如需创建内部负载均衡器,请在清单中将 service.beta.kubernetes.io/aws-load-balancer-internal 注解设置为 "true"

您不能将 aws-load-balancer-internal 注解应用于现有 Service。如需在面向互联网配置和内部配置之间更改,您必须删除并重新创建现有的 LoadBalancer。

选择您的子网

创建负载均衡器时,AWS 需要知道将其放入哪些子网。默认情况下,系统会自动从 VPC 的子网中发现这些子网。这要求子网具有特定标记。如需详细了解子网自动发现和标记,请参阅负载均衡器子网

或者,您也可以通过向 Service 添加 service.beta.kubernetes.io/aws-load-balancer-subnets 注解来指定负载均衡器子网。此注解的值是以英文逗号分隔的子网 ID 或子网名称列表,例如 subnet-012345678abcdef,subnet-abcdef123456789,subnet-123456789abcdef

创建示例负载均衡器

您可以通过创建部署并使用 Service 公开该部署来创建 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:

    kubectl apply -f my-deployment-50001.yaml
    
  3. 确认三个 Pod 是否正在运行:

    kubectl get pods --selector=app=products
    
  4. 为您的部署创建 LoadBalancer 类型的 Service。

  5. 确定所需的负载均衡器类型:

    • 面向互联网的传统 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
    
  6. 使用 kubectl apply 创建 Service:

    kubectl apply -f my-lb-service.yaml
    
  7. 使用 kubectl get service 查看 Service 的地址。

    kubectl get service my-lb-service
    

    输出将包含列 EXTERNAL-IP 的负载均衡器地址(公共或专用),具体取决于负载均衡器的创建方式。

  8. 如果您已创建面向互联网的负载均衡器,则可以使用以下命令通过 curl 连接到该负载均衡器:

    curl http://EXTERNAL_IP:60000
    

    EXTERNAL_IP 替换为上一步中 EXTERNAL-IP 列中的地址。

输出类似以下内容:

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

清理

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

kubectl delete -f my-lb-service.yaml
kubectl delete -f my-deployment-50001.yaml

后续步骤