建立網路負載平衡器

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

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

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

事前準備

選擇負載平衡器類型

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 需要知道要將負載平衡器放在哪個子網路中。根據預設,系統會從虛擬私有雲的子網路中自動探索這些子網路。這項功能需要子網路具有特定標記。如要瞭解子網路自動探索和標記的詳細資料,請參閱「負載平衡器子網路」。

或者,您也可以使用註解指定負載平衡器子網路,方法是在服務中新增 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
    • 內部傳統 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

後續步驟