獨立網路端點群組

此頁面顯示如何建立由網路端點群組支援的 Kubernetes 服務。

總覽

Google Cloud Platform 具有各種負載平衡元件,您可以透過不同方式將這些元件組合在一起,為您的應用程式提供負載平衡功能。本主題中的步驟結合了以下元件,以便為 Kubernetes 服務提供負載平衡:

下圖說明了元件之間的連結:

網路端點群組的負載平衡元件圖表

以下是您在本主題中執行步驟的概述:

  1. 建立具有三個 Pod 的部署。每個 Pod 都有一個監聽 TCP 通訊埠 50000 的容器。

  2. 建立 Service。在 Service 資訊清單中,請納入 cloud.google.com/neg 註解。這會導致 GKE 控制器建立網路端點群組。

  3. 建立健康狀態檢查。

  4. 建立後端服務。將後端服務連接到健康狀態檢查和網路端點群組。

  5. 建立 TCP proxy。將 TCP proxy 連接到後端服務。

  6. 建立轉送規則。將轉送規則連接到 TCP proxy。

  7. 測試轉送規則。

事前準備

您必須擁有執行 Google Kubernetes Engine 1.10 或更高版本的叢集。

您的叢集必須為虛擬私人雲端原生的。詳情請參閱使用別名 IP 建立虛擬私人雲端原生叢集

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

建立網路端點群組

以下是部署的資訊清單。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      purpose: demo
      topic: standalone-neg
  replicas: 3
  template:
    metadata:
      labels:
        purpose: demo
        topic: standalone-neg
    spec:
      containers:
      - name: hello
        image: debian
        command: ["/bin/bash"]
        args:
        - "-c"
        - "apt-get update && apt-get install -y netcat && while true; do echo Hello TCP | nc -l -p 50000; done"

該部署包含三個 Pod,每個 Pod 都有一個容器。

部署資訊清單中的 cmdargs 欄位使用了 netcat (nc) 來實作在通訊埠 50000 上監聽連線的簡易 TCP 伺服器。

將資訊清單複製到名為 my-deployment.yaml 的檔案,然後建立部署:

kubectl apply -f my-deployment.yaml

以下是 Service 的資訊清單:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  annotations:
    cloud.google.com/neg: '{"exposed_ports": {"80":{}}}'
spec:
  type: ClusterIP
  selector:
    purpose: demo
    topic: standalone-neg
  ports:
  - name: my-service-port
    protocol: TCP
    port: 80
    targetPort: 50000

針對本練習的目的,以下是 Service 需要瞭解的重要事項:

  • 任何具有 purpose: demo 標籤和 topic: standalone-neg 標籤的 Pod 都是 Service 的成員。

  • Service 有一個名為 my-service-portservicePort 結構。cloud.googe.com/neg 註解表示 my-service-port 將與網路端點群組關聯。

  • 每個成員 Pod 都必須有一個正在監聽 TCP 通訊埠 50000 的容器。

將資訊清單儲存到名為 my-service.yaml 的檔案,然後建立 Service:

kubectl apply -f my-service.yaml

建立 Service 時,GKE 控制器會建立網路端點群組。

請稍等網路端點群組建立。然後,您可以使用 gcloud 或 Google Cloud Platform 主控台檢查網路端點群組。

gcloud

列出網路端點群組

gcloud beta compute network-endpoint-groups list

該輸出顯示您的網路端點群組有三個端點:

NAME                                          LOCATION       ENDPOINT_TYPE   SIZE
k8s1-70aa83a6-default-my-service-80-c9710a6f  us-central1-a  GCE_VM_IP_PORT  3

檢視端點:

gcloud beta compute network-endpoint-groups list-network-endpoints \
    [NETWORK_ENDPOINT_GROUP_NAME]

其中 [NETWORK_ENDPOINT_GROUP_NAME] 是網路端點群組的名稱。

該輸出顯示三個端點。每個端點都是 (Pod IP 位址、通訊埠) 的配對。

INSTANCE                                           IP_ADDRESS  PORT
gke-standard-cluster-3-default-pool-4cc71a15-qlpf  10.12.1.43  50000
gke-standard-cluster-3-default-pool-4cc71a15-qlpf  10.12.1.44  50000
gke-standard-cluster-3-default-pool-4cc71a15-w9nk  10.12.2.26  50000
````

主控台

  1. 造訪 GCP 主控台 Google Kubernetes Engine 的「Workloads」(工作負載) 選單。

    前往工作負載選單

  2. 按一下 [Deploy] (部署)

  3. 在「Container Image」(容器映像檔) 中填入容器映像檔及其版本 (例如 nginx:latest),或是按一下 [Select existing Google Container Registry image] (選取現有的 Google Container Registry 映像檔),然後選擇映像檔。

  4. 根據需要設定容器:新增環境變數、初始指令、應用程式名稱、命名空間和標籤。

  5. 從「Cluster」(叢集) 下拉式選單中,選擇需要的叢集。

  6. 按一下 [Deploy] (部署)

建立防火牆規則

在本練習的後面部分,您將建立一個健康狀態檢查和 TCP proxy。

建立防火牆規則,以允許來自 TCP proxy 和健康狀態檢查的 TCP 流量:

gcloud compute firewall-rules create my-fwr --network default \
    --source-ranges 130.211.0.0/22,35.191.0.0/16 --allow tcp

建立健康狀態檢查和後端服務

建立健康狀態檢查:

gcloud beta compute health-checks create tcp my-hc --use-serving-port

建立後端服務:

gcloud compute backend-services create my-bes --global \
    --protocol tcp --health-checks my-hc

將網路端點群組新增到後端服務。

gcloud beta compute backend-services add-backend my-bes --global \
   --network-endpoint-group [NETWORK_ENDPOINT_GROUP_NAME] \
   --network-endpoint-group-zone [NETWORK_ENDPOINT_GROUP_ZONE] \
   --balancing-mode CONNECTION --max-connections-per-endpoint 5

其中:

  • [NETWORK_ENDPOINT_GROUP_NAME] 是網路端點群組的名稱。
  • [NETWORK_ENDPOINT_GROUP_ZONE] 是網路端點群組的區域。

描述您的後端服務:

gcloud compute backend-services describe my-bes --global

該輸出顯示後端服務與您的健康狀態檢查和網路端點群組有關聯。

...
backends:
- balancingMode: CONNECTION
  capacityScaler: 1.0
  group: ... /networkEndpointGroups/k8s1-70aa83a6-default-my-service-80-c9710a6f
...
healthChecks:
- ... /healthChecks/my-hc
...
name: my-bes
...

請等待五分鐘,以讓您的後端服務設定完成。

檢查後端服務的健康狀態:

gcloud beta compute backend-services get-health my-bes --global

顯示每個端點健康狀態的輸出:

...
status:
  healthStatus:
  - healthState: HEALTHY
    instance: ... gke-standard-cluster-3-default-pool-4cc71a15-qlpf
    ipAddress: 10.12.1.43
    port: 50000
  - healthState: HEALTHY
    instance: ... gke-standard-cluster-3-default-pool-4cc71a15-qlpf
    ipAddress: 10.12.1.44
    port: 50000
  - healthState: HEALTHY
    instance: ... gke-standard-cluster-3-default-pool-4cc71a15-w9nk
    ipAddress: 10.12.2.26
    port: 50000

建立 TCP proxy 和轉送規則

建立 TCP proxy:

gcloud compute target-tcp-proxies create my-tp --backend-service my-bes

建立轉送規則:

gcloud compute forwarding-rules create my-for --global \
    --ip-protocol tcp --ports 25 --target-tcp-proxy my-tp

檢視轉送規則:

gcloud compute forwarding-rules describe my-for --global

輸出顯示轉送規則的外部 IP 位址:

IPAddress: 203.0.113.1
IPProtocol: TCP
...
kind: compute#forwardingRule
loadBalancingScheme: EXTERNAL
name: my-for
...
portRange: 25 - 25

等待十分鐘以設定轉發規則。

使用 netcat 來測試轉送規則:

nc -v [EXTERNAL_IP_ADDRESS] 25

其中 [EXTERNAL_IP_ADDRESS] 是轉送規則的外部 IP 位址。

該輸出顯示您其中一個容器的回覆:

Connection to 203.0.113.1 25 port [tcp/smtp] succeeded!
Hello TCP

清除所用資源

完成本頁面的工作之後,為避免您的帳戶中產生不必要的費用,請按照下列步驟移除資源:

gcloud compute forwarding-rules delete my-for --global --quiet
gcloud compute target-tcp-proxies delete my-tp --quiet
gcloud compute backend-services delete my-bes --quiet --global
gcloud compute firewall-rules delete my-fwr --quiet
gcloud compute health-checks delete my-hc --quiet
kubectl delete service my-service
kubectl delete deployment my-deployment

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件