建立網路負載平衡器

本頁說明如何使用 AWS Elastic Load Balancer (ELB) 或 Network Load Balancer (NLB) 端點,設定 L4 負載平衡器

如要進一步瞭解可搭配 GKE on AWS 使用的其他負載平衡器類型,請參閱負載平衡器總覽

本頁內容適用於想要安裝、設定及支援網路設備的網路專家。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。 Google Cloud

事前準備

選擇負載平衡器類型

GKE on AWS 會建立 Service 負載平衡器,做為 AWS Classic Elastic Load Balancer (Classic ELB) 或 NLB。根據預設,GKE on AWS 會建立 Classic ELB。如要建立 NLB,請將 service.beta.kubernetes.io/aws-load-balancer-type 註解設為 nlb。如要進一步瞭解負載平衡器類型的差異,請參閱 AWS 說明文件中的「負載平衡器類型」。

選擇連結網際網路或內部負載平衡器

服務負載平衡器可以是面向網際網路 (具有可公開解析的 DNS 名稱),也可以是內部負載平衡器 (只能在虛擬私有雲內存取)。

根據預設,新的負載平衡器會連結網際網路。如要建立內部負載平衡器,請在資訊清單中將 service.beta.kubernetes.io/aws-load-balancer-internal 註解設為 "true"

您無法將 aws-load-balancer-internal 註解套用至現有服務。如要在連結網路和內部設定之間切換,您必須刪除並重新建立現有的 LoadBalancer。

選擇子網路

建立負載平衡器時,AWS 需要知道要將負載平衡器放在哪個子網路中。根據預設,系統會從 VPC 的子網路中自動探索這些子網路。這項作業需要子網路具有特定標記。如要瞭解子網路自動探索和標記的詳細資料,請參閱負載平衡器子網路

或者,您也可以使用註解指定負載平衡器子網路,方法是在服務中新增 service.beta.kubernetes.io/aws-load-balancer-subnets 註解。這項註解的值是以半形逗號分隔的子網路 ID 或子網路名稱清單,例如 subnet-012345678abcdef,subnet-abcdef123456789,subnet-123456789abcdef

建立範例負載平衡器

建立 Deployment 物件並使用 Service 將其公開,即可建立 LoadBalancer 類型的 Service。在下列範例中,您會建立範例負載平衡器。

  1. 建立部署作業。這個部署中的容器會監聽通訊埠 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 類型的服務。

  5. 決定所需的負載平衡器類型:

    • 連至網際網路的傳統 ELB
    • 連結網際網路的 NLB
    • 內部 Classic 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-typenlb,建立 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
    

    Internal Classic

    您可以將註解 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-typenlb

    下列 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 建立服務:

    kubectl apply -f my-lb-service.yaml
    
  7. 使用 kubectl get 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

後續步驟