設定多叢集 Ingress

總覽

如果您在多個 Google Kubernetes Engine 叢集上執行您的應用程式,而這些叢集位於不同的地區時,您可以將流量轉送到最接近使用者所在地區中的叢集。

本頁透過 Kubernetes Ingress 使用 kubemci 指令列工具來設定 Cloud HTTP 負載平衡器,以在不同地區的多個叢集間轉送流量。

事前準備

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

  • 確認您已安裝 Cloud SDK
  • 使用下列命令初始化 gcloud

    gcloud init
    • 選擇您要使用的帳戶或以新帳戶登入。
    • 輸入您的專案 ID 或建立新專案。
    • 設定預設運算地區和區域。
  • 驗證並允許 Google Cloud SDK 查看及管理您在 Google Cloud Platform 服務中的資料:

    gcloud auth login
  • 驗證並允許 Google 驗證程式庫查看及管理您在 Google Cloud Platform 服務中的資料:

    gcloud auth application-default login
  • 安裝 kubectl 指令列工具:

    gcloud components install kubectl
  • 確認您有兩個以上的 GKE 叢集在同一個 GCP 專案和網路上執行。

下載 kubemci 指令列工具。

kubemci 是建立和設定多叢集 Ingress 所用的主要指令列工具。

請下載其中一個二進位檔,並存放在可執行的路徑中:

確認該二進位檔可執行。您可以在該二進位檔的目錄中,透過下列指令來確認檔案是否可以執行:

chmod +x ./kubemci

建立多叢集 Ingress

準備您的叢集

對於您打算在多叢集 Ingress 中使用的各項 Service,都必須在所有叢集中進行相同設定。具體而言 Service 必須:

  • 在所有叢集中使用相同的名稱。
  • 位於所有叢集的同一個命名空間。
  • 屬於 NodePort 類型。
  • 在所有叢集中使用同一個通訊埠號碼。

    例如,假設您的 Ingress 需要兩項服務 (service-fooservice-bar),則:

    • service-foo 是 nodePort,在所有叢集中都位於通訊埠 30016。
    • service-bar 是 nodePort,在所有叢集中都位於通訊埠 30017。

如需詳細指示,請參閱將 nodePort 服務部署到每個叢集一節。

建立 kubeconfig 檔案

kubemci 指令列工具需要使用 kubeconfig 檔案,檔案中包含將接收流量的 GKE 叢集的叢集連線資訊。

對每個叢集執行下列指令以建立 kubeconfig 檔案,檔案中包含用於所有叢集的憑證。

KUBECONFIG=[PATH/TO/MCI_KUBECONFIG_FILE]
gcloud container clusters get-credentials \
    --zone=[ZONE_NAME] [CLUSTER_NAME]

例如:

KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=us-east4-a  cluster-us-east
KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=europe-west1-c  cluster-eu-west
KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=asia-east1-b  cluster-apac-east

將 nodePort 服務部署到每個叢集

如要簡化部署,可以將服務和應用程式部署資訊清單檔案放在同一個目錄中。例如,可以將下列檔案都放在 app/ 目錄中:

範例部署資訊清單檔案

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: my-app
  replicas: 2
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: hello-app
        image: gcr.io/google-samples/hello-app:1.0

範例服務資訊清單檔案

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-app
  name: service-foo
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
    name: http
    nodePort: 30061
  selector:
    app: my-app
  type: NodePort

您可以執行以下迴圈:反覆處理所有叢集,並取得結構定義來部署應用程式及 nodePort 服務:

KUBECONFIG=[PATH/TO/MCI_KUBECONFIG_FILE]
for ctx in $(kubectl config get-contexts -o name); do
  kubectl --context="${ctx}" create -f [PATH/TO/APP/FILES]
done

預留靜態 IP

在 Google Cloud Platform 上執行下列指令,來要求提供靜態 IP 給多叢集 Ingress 使用:

gcloud compute addresses create --global [IP_RESOURCE_NAME]

例如,如果您將 IP 資源命名為 my-mci-ip,則會變成:

gcloud compute addresses create --global my-mci-ip

準備 Ingress 資源

在每個叢集中,Ingress 資源規則必須有中繼資料 annotations 欄位和 backend 欄位,其中含有設定用於多叢集 Ingress 的值。

以下是 Ingress 資源檔案 mcingress.yaml 的範例:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-foo
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-mci-ip
    kubernetes.io/ingress.class: gce-multi-cluster
spec:
  backend:
    serviceName: service-foo
    servicePort: 80

新增或修改 annotations

  • kubernetes.io/ingress.global-static-ip-name 的值設定為 [IP_RESOURCE_NAME]
  • kubernetes.io/ingress.class 的值設定為 gce-multi-cluster

設定 backend 服務:

  • serviceName 的值設定為預設服務的名稱。
  • servicePort 的值設定為預設服務的通訊埠。

部署多叢集 Ingress

使用 kubemci 透過下列指令建立多叢集 Ingress:

kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[optional PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]
例如:
kubemci create my-mci \
    --ingress=mcingress.yaml \
    --gcp-project=my-gcp-project \
    --kubeconfig=~/mcikubeconfig

這會輸出一連串確認建立程序的訊息,例如:

Ensuring health checks
...
Health check mci1-hc-30061--my-mci created successfully
...
Backend service mci1-be-30061--my-mci created successfully
...
URL Map mci1-um--my-mci created successfully
...
Target http proxy mci1-tp--my-mci created successfully
...
Forwarding rule mci1-fw--my-mci created successfully
...
Firewall rule mci1-fr--my-mci created successfully

Success.

取得多叢集 Ingress 的狀態

您可以執行下列指令,列出已使用 kubemci 建立的所有現有多叢集 Ingress:

kubemci list --gcp-project=[PROJECT_ID]

這會輸出類似以下內容的多叢集輸入清單:

NAME           IP              CLUSTERS
my-mci   1.2.3.4   gke_my-gcp-project_asia-east1-b_cluster-asia-east, gke_my-gcp-project_europe-west1-c_cluster-eu-west, gke_my-gcp-project_us-east4-a_cluster-us-east

然後您可以透過下列指令,取得特定多叢集輸入的狀態:

kubemci get-status [INGRESS_NAME] --gcp-project=[PROJECT_ID]

這會輸出類似以下內容的狀態訊息:

Load balancer my-mci has IPAddress 1.2.3.4 and is spread across 3 clusters
(gke_project-name_asia-east1-b_cluster-asia-east, gke_project-name_europe-west1-c_cluster-eu-west,
gke_project-name_us-east4-a_cluster-us-east)

更新現有的多叢集 Ingress

使用 --force 標記

如要更新現有的多叢集 Ingress,請執行 kubemci create 指令並加上 --force 標記:

kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE] \
    --force

刪除並重新建立

或者,如要更新多叢集 Ingress,您可以先刪除多叢集 Ingress,再重新建立:

kubemci delete [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]
kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]

從現有多叢集 Ingress 中移除叢集

如要移除現有多叢集 Ingress 中的叢集,請先建立 kubeconfig 並包含要從叢集中移除的叢集清單,然後執行 kubemci remove-clusters 指令:

kubemci remove-clusters [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/REMOVAL_KUBECONFIG_FILE]

刪除多叢集 Ingress

如要刪除多叢集 Ingress,請使用 kubemci delete 指令:

kubemci delete [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]

這會輸出一連串確認刪除程序的訊息,例如:

Deleting Ingress from cluster: gke_project-name_asia-east1-b_cluster-asia-east...
...
firewall rule mci1-fr--my-mci deleted successfully
...
http forwarding rule mci1-fw--my-mci deleted successfully
...
target HTTPS proxy mci1-tps--my-mci deleted successfully
...
ssl cert mci1-ssl--my-mci deleted successfully
...
url map mci1-um--my-mci deleted successfully
...
Successfully deleted all backend services
...
Successfully deleted all health checks

後續步驟

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

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

這個網頁
Kubernetes Engine 說明文件