建立負載平衡器

本主題說明如何使用 GKE on AWS 設定 AWS Elastic Load Balancer (ELB)。

建立 LoadBalancer 類型的 Service 時,AWS 上的 GKE 控制器會在 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

您會建立部署,並透過服務公開該部署,藉此建立負載平衡器。

  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:

    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 類型的服務。您可以在公開或私人的子網路上建立傳統或網路 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 Public

    您可以透過設定註解 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
    

    傳統私人

    您可以將註解 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-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
    
  5. 使用 kubectl apply 建立服務:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f my-lb-service.yaml
    
  6. 使用 kubectl get 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. 如果您已建立面向外部的負載平衡器,且有權存取公開虛擬私有雲子網路,即可使用 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

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

疑難排解

如果無法存取負載平衡器端點,請嘗試標記子網路

後續步驟