使用手動 Envoy 插入來設定 Google Kubernetes Engine Pod
本指南說明如何設定 Google Kubernetes Engine 或 Kubernetes Pod 主機,以及 Cloud Service Mesh 所需的負載平衡元件。
請先完成「準備使用 Envoy 和無 Proxy 工作負載設定服務路由 API」一文中所述的先決作業,再按照本指南中的說明操作。
您可以使用 Compute Engine 負載平衡 SDK 或 REST API 設定 Cloud Service Mesh。請參閱 負載平衡 API 和 gcloud 參考資料。
為 Cloud Service Mesh 設定 GKE/Kubernetes 叢集
本節說明啟用 GKE/Kubernetes 叢集的必要步驟,以便與 Cloud Service Mesh 搭配使用。
建立 GKE 叢集
GKE 叢集必須符合下列要求:
- 必須啟用網路端點群組支援功能。如需詳細資訊和範例,請參閱「獨立網路端點群組」。獨立 NEG 功能已在 Cloud Service Mesh 正式版中推出。
- 叢集節點執行個體服務帳戶必須具有存取 Cloud Service Mesh API 的權限。
- 如要瞭解所需權限,請參閱「啟用服務帳戶以存取 Traffic Director API」。
- 如要瞭解如何啟用 Cloud Service Mesh API,請參閱「啟用 Cloud Service Mesh API」。
- 容器必須具有存取 Cloud Service Mesh API 的權限,並受 OAuth 驗證保護。詳情請參閱主機設定。
下列範例示範如何在 us-central1-a
區域中建立名為 traffic-director-cluster
的 GKE 叢集。
控制台
如要使用 Google Cloud 主控台建立叢集,請執行下列步驟:
前往 Google Cloud 控制台的「Kubernetes Engine」選單。
按一下 [Create cluster] (建立叢集)。
填寫下列欄位:
- 名稱:輸入
traffic-director-cluster
。 - 位置類型:
Zonal
。 - 可用區:
us-central1-a
。
- 名稱:輸入
在導覽窗格的「節點集區」下方,按一下「default-pool」。
「Size」欄位表示要在叢集中建立的節點數量。您必須要有可用於節點及其資源 (例如防火牆路徑) 的資源配額。
在導覽窗格的「default-pool」下方,按一下「Nodes」。
「Machine type」欄位會指出用於執行個體的 Compute Engine 機器類型。每種機器類型的定價方式不同。如需機器類型的定價資訊,請參閱 Compute Engine 定價頁面。
在導覽窗格的「default-pool」下方,按一下「Security」。
在「Access scopes」(存取權範圍) 下方,按一下「Allow full access to all Cloud APIs」(允許所有 Cloud API 的完整存取權)。
視需要自訂叢集。
按一下 [建立]。
在 Google Cloud 主控台中建立叢集之後,您必須設定 kubectl
以與叢集互動。如要進一步瞭解,請參閱「產生 kubeconfig
項目」。
gcloud
gcloud container clusters create traffic-director-cluster \ --zone us-central1-a \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --enable-ip-alias
取得所需的 GKE 叢集權限
若為 GKE,請發出下列指令,切換至您剛建立的叢集(2)。這會將 kubectl 指向正確的叢集。
gcloud container clusters get-credentials traffic-director-cluster \ --zone us-central1-a
設定 GKE/Kubernetes 服務
本節說明如何準備 Kubernetes 部署規格,以便與 Cloud Service Mesh 搭配使用。此程序包含設定 NEG 服務,以及在需要存取由 Cloud Service Mesh 管理的服務的 Pod 中插入補充 Proxy。
設定防火牆規則
如要驗證後端 Pod 是否正在執行,您必須設定防火牆規則,允許健康檢查工具的 IP 位址範圍。
主控台
- 前往 Google Cloud 控制台的「防火牆政策」頁面。
前往「防火牆政策」頁面 - 按一下「建立防火牆規則」。
- 在「Create a firewall rule」(建立防火牆規則) 頁面上,提供下列資訊:
- 「Name」(名稱):提供規則的名稱。在這個範例中,請使用
fw-allow-health-checks
。 - 「Network」(網路):選擇虛擬私人雲端網路。
- 「Priority」(優先順序):輸入代表優先順序的數字。數字越小,優先順序越高。請確保該防火牆規則的優先順序,高於其他可能會拒絕輸入流量的規則。
- 「Direction of traffic」(流量方向):選擇 [ingress] (輸入)。
- 「Action on match」(相符時執行的動作):選擇 [allow] (允許)。
- 目標:選擇「網路中的所有執行個體」。
- 來源篩選器:選擇正確的 IP 範圍類型。
- Source IP ranges (來源 IP 範圍):
35.191.0.0/16,130.211.0.0/22
- 目的地篩選器:選取 IP 類型。
- Protocols and ports (通訊協定和通訊埠):按一下「Specified ports and protocols」(指定的通訊埠和通訊協定),然後勾選
tcp
。TCP 是適用於所有健康狀態檢查通訊協定的基本通訊協定。 - 按一下 [建立]。
- 「Name」(名稱):提供規則的名稱。在這個範例中,請使用
gcloud
使用下列
gcloud
指令建立名為fw-allow-health-checks
的防火牆規則,該規則會允許傳入的連線抵達您網路中有allow-health-checks
標記的執行個體。請將 NETWORK_NAME 替換成您網路的名稱。gcloud compute firewall-rules create fw-allow-health-checks \ --network NETWORK_NAME \ --action ALLOW \ --direction INGRESS \ --source-ranges 35.191.0.0/16,130.211.0.0/22 \ --rules tcp
詳情請參閱「設定健康檢查的防火牆規則」。
設定 NEG 適用的 GKE / Kubernetes 服務
GKE 服務必須透過網路端點群組 (NEG) 公開,才能將這些服務設為 Cloud Service Mesh 後端服務的後端。將 NEG 註解新增至 Kubernetes 服務規格,並選擇名稱 (取代下方範例中的 NEG-NAME
),方便日後查詢。您需要在將 NEG 連結至 Cloud Service Mesh 後端服務時提供名稱。如要進一步瞭解如何為 NEG 加上註解,請參閱「命名 NEG」。
... metadata: annotations: cloud.google.com/neg: '{"exposed_ports": {"80":{"name": "NEG-NAME"}}}' spec: ports: - port: 80 name: service-test protocol: TCP targetPort: 8000
每個服務都會建立包含 Pod IP 位址和通訊埠的獨立 NEG。如需詳細資訊和範例,請參閱「獨立網路端點群組」。
如需用於示範,您可以部署範例服務,其會透過通訊埠 80 上的 HTTP 提供本身的主機名稱:
wget -q -O - \ https://storage.googleapis.com/traffic-director/demo/trafficdirector_service_sample.yaml \ | kubectl apply -f -
確認已建立新服務主機名稱且應用程式 Pod 運作中:
kubectl get svc
這會傳回:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service-test ClusterIP 10.71.9.71 none 80/TCP 41m [..skip..]
kubectl get pods
這會傳回:
NAME READY STATUS RESTARTS AGE app1-6db459dcb9-zvfg2 1/1 Running 0 6m [..skip..]
儲存 NEG 的名稱
從上方範例找出建立的 NEG 並記錄下該 NEG 名稱。
控制台
如要查看網路端點群組清單,請前往 Google Cloud 控制台的「Network Endpoint Groups」(網路端點群組) 頁面。
前往「Network Endpoint Groups」頁面
gcloud
gcloud compute network-endpoint-groups list
這會傳回以下內容:
NAME LOCATION ENDPOINT_TYPE SIZE NEG-NAME us-central1-a GCE_VM_IP_PORT 1
在 NEG_NAME
變數中儲存 NEG 名稱,例如:
NEG_NAME=$(gcloud compute network-endpoint-groups list \ | grep service-test | awk '{print $1}')
設定 Cloud Service Mesh 的 Google Cloud 負載平衡器元件
本節的操作說明可確保 Cloud Service Mesh 可透過與其他 Google Cloud Load Balancing 產品類似的負載平衡設定,在服務 VIP 上存取 GKE 服務。
您必須設定下列元件:
- 健康狀態檢查。如要進一步瞭解健康狀態檢查,請參閱「健康狀態檢查概念」和「建立健康狀態檢查」。
- 後端服務。如要進一步瞭解後端服務,請參閱「後端服務」一文。
- 轉送規則。包括建立轉送規則和網址對應。詳情請參閱「使用轉送規則」和「使用網址對應」。
以下的 Cloud Service Mesh 設定範例假設如下:
- NEG 和其他所有的資源都在在
us-central1-a
區域中以自動模式建立在default
網路。 - 叢集的 NEG 名稱儲存在
${NEG_NAME}
變數。
建立健康狀態檢查
建立健康狀態檢查。
主控台
- 前往 Google Cloud 控制台的「Health checks」(健康狀態檢查) 頁面。
前往「Health checks」(健康狀態檢查) 頁面 - 按一下 [Create Health Check] (建立健康狀態檢查)。
- 輸入
td-gke-health-check
做為名稱。 - 選取 [HTTP] 做為通訊協定。
- 按一下 [建立]。
gcloud
gcloud compute health-checks create http td-gke-health-check \ --use-serving-port
建立後端服務
使用 INTERNAL_SELF_MANAGED 負載平衡機制建立全球後端服務。在 Google Cloud 控制台中,負載平衡機制為間接設定。將健康狀態檢查新增到後端服務。
主控台
前往 Google Cloud 控制台的「Cloud Service Mesh」頁面。
在「Services」(服務) 分頁中,按一下 [Create Service] (建立服務)。
按一下「繼續」。
輸入
td-gke-service
做為服務名稱。在「Backend type」(後端類型) 下方,選取 [Network endpoint groups] (網路端點群組)。
選取您建立的網路端點群組。
將「Maximum RPS」(每秒要求數上限) 設為
5
。按一下 [完成]。
在「健康狀態檢查」下方,選取您建立的健康狀態檢查
td-gke-health-check
。按一下「繼續」。
gcloud
建立後端服務,並將健康狀態檢查與後端服務建立關聯。
gcloud compute backend-services create td-gke-service \ --global \ --health-checks td-gke-health-check \ --load-balancing-scheme INTERNAL_SELF_MANAGED
將後端 NEG 新增至後端服務。
gcloud compute backend-services add-backend td-gke-service \ --global \ --network-endpoint-group ${NEG_NAME} \ --network-endpoint-group-zone us-central1-a \ --balancing-mode RATE \ --max-rate-per-endpoint 5
建立轉送規則對應關係
請按照這些操作說明,為 Cloud Service Mesh 設定建立路由規則、轉送規則和內部 IP 位址。
傳送至內部 IP 位址的流量會由 Envoy Proxy 攔截,並根據主機和路徑規則傳送至相關的服務。
轉送規則會以通用轉送規則的形式建立,並將 load-balancing-scheme
設為 INTERNAL_SELF_MANAGED
。
您可以將轉送規則的地址設為 0.0.0.0
。如此一來,系統會根據網址對應中設定的 HTTP 主機名稱和路徑資訊,將流量路由,而不會考量主機名稱解析到的實際 IP 位址。在這種情況下,服務的網址 (主機名稱加上網址路徑) 必須在服務中繼網格設定中保持不重複。也就是說,您無法同時擁有兩個使用不同後端的服務,且兩者都使用相同的主機名稱和路徑組合。
或者,您也可以根據服務的實際目的地 VIP 啟用轉送。如果您將服務的 VIP 設為轉寄規則的 address
參數,系統只會根據網址對應中指定的 HTTP 參數,將目的地為此 IP 位址的要求轉送。
主控台
在主控台中,目標 Proxy 會搭配使用轉送規則。當您建立轉寄規則時, Google Cloud 會自動建立目標 HTTP Proxy,並將 Proxy 附加至網址對應。
轉送規則包含轉寄規則和主機和路徑規則 (又稱為網址對應)。
前往 Google Cloud 控制台的「Cloud Service Mesh」頁面。
按一下「轉送規則對應關係」
按一下「建立轉送規則」。
輸入
td-gke-url-map
做為網址對應的名稱。按一下 [Add Forwarding Rule] (新增轉寄規則)。
針對轉寄規則名稱,請輸入
td-gke-forwarding-rule
。選取網路。
選取「Internal IP」。
按一下 [儲存]。
您可以視需要新增自訂主機和路徑規則,或是將路徑規則設為預設值。
將主機設為
service-test
。按一下 [儲存]。
gcloud
建立使用後端服務的網址對應。
gcloud compute url-maps create td-gke-url-map \ --default-service td-gke-service
建立網址對應路徑比對器和主機規則,根據主機名稱和路徑轉送服務的流量。這個範例會使用
service-test
做為服務名稱,以及與此主機 (/*
) 的所有路徑要求相符的預設路徑比對工具。service-test
也是上述範例設定中使用的 Kubernetes 服務設定名稱。gcloud compute url-maps add-path-matcher td-gke-url-map \ --default-service td-gke-service \ --path-matcher-name td-gke-path-matcher
gcloud compute url-maps add-host-rule td-gke-url-map \ --hosts service-test \ --path-matcher-name td-gke-path-matcher
建立目標 HTTP Proxy。
gcloud compute target-http-proxies create td-gke-proxy \ --url-map td-gke-url-map
建立轉寄規則。
gcloud compute forwarding-rules create td-gke-forwarding-rule \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --address=0.0.0.0 \ --target-http-proxy=td-gke-proxy \ --ports 80 --network default
此時,Cloud Service Mesh 已設定為指定網路端點群組後端間的網址對應所指定服務,進行負載平衡。
視微服務在網路上的分發方式而定,您可能需要在網址對應中新增更多轉送規則或主機和路徑規則。
驗證設定,方法是為測試部署範例用戶端
本節說明如何從用戶端應用程式存取 Cloud Service Mesh 後端。
如要示範功能,您可以部署執行 Busybox 的範例 Pod。Pod 可存取 service-test
,這是在上一節建立的服務,可接收由 Cloud Service Mesh 負載平衡的流量。
將補充 Proxy 插入 GKE / Kubernetes Pod
如要存取由 Cloud Service Mesh 管理的服務,Pod 必須安裝與 xDS API 相容的補充 Proxy。
在本例中,您會使用 Istio-proxy 附加元件和啟動容器,透過參考規格部署 Busybox 用戶端。
如果您使用舊版 API,請將 PROJECT_NUMBER 和 NETWORK_NAME 變數替換為專案編號和網路名稱:
wget -q -O - https://storage.googleapis.com/traffic-director/demo/trafficdirector_client_sample_xdsv3.yaml sed -i "s/PROJECT_NUMBER/PROJECT_NUMBER/g" trafficdirector_client_sample_xdsv3.yaml sed -i "s/NETWORK_NAME/NETWORK_NAME/g" trafficdirector_client_sample_xdsv3.yaml kubectl apply -f trafficdirector_client_sample_xdsv3.yaml
如果您使用的是目前處於預覽階段的新版 服務路由 API,請將 PROJECT_NUMBER 和 MESH_NAME 變數替換為專案編號和 Mesh
名稱:
wget -q -O - https://storage.googleapis.com/traffic-director/demo/trafficdirector_client_new_api_sample_xdsv3.yaml sed -i "s/PROJECT_NUMBER/PROJECT_NUMBER/g" trafficdirector_client_new_api_sample_xdsv3.yaml sed -i "s/MESH_NAME/MESH_NAME/g" trafficdirector_client_new_api_sample_xdsv3.yaml kubectl apply -f trafficdirector_client_new_api_sample_xdsv3.yaml
Busybox Pod 有兩個執行中的容器。第一個容器是基於 Busybox 映像檔的用戶端,第二個容器則是用於側載的 Envoy Proxy。您可以執行下列指令,取得 Pod 的更多資訊:
kubectl describe pods -l run=client
連線至後端服務
設定完成後,在 Pod 上具有插入補充 Proxy 的應用程式,即可存取由 Cloud Service Mesh 服務管理的服務。如要驗證設定,您可以在其中一個容器上存取殼層。
如果您使用了本指南中所提供的範本設定,您可以執行下列驗證指令,確認服務 Pod 會傳回主機名稱。
# Get name of the Pod with busybox. BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}') # Command to execute that tests connectivity to the service service-test. TEST_CMD="wget -q -O - service-test; echo" # Execute the test command on the Pod . kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"
瞭解補充 Proxy 的流量攔截機制
請注意,在這個範例中,當 Busybox 用戶端向後端服務提出要求時,每項要求都會由附加 Proxy 代理。
這個示範應用程式使用 Envoy 代理程式。因此,用戶端會在伺服器回應的標頭中看到「server: envoy」。
如要確認這一點,請使用下列指令:
# Get the name of the Pod with Busybox. BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}') # Command to send a request to service-test and output server response headers. TEST_CMD="wget -S --spider service-test; echo" # Execute the test command on the Pod . kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"
在本範例中,您使用 VIP 位址 0.0.0.0 建立轉送規則。也就是說,Cloud Service Mesh 只會根據 Host
標頭將要求轉送至後端。在這種情況下,只要要求主機標頭與網址對應 service-test
中定義的主機相符,目的地 IP 位址可以是任何位址。
如要確認這一點,請執行下列測試指令:
# Get name of the Pod with Busybox. BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}') # Command to send a request to service-test setting the Host header and using a random IP address. TEST_CMD="wget -q --header 'Host: service-test' -O - 1.2.3.4; echo" # Execute the test command on the Pod . kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"
後續步驟
- 瞭解進階流量管理。
- 瞭解如何排解 Cloud Service Mesh 部署問題。
- 瞭解如何使用 Envoy 設定可觀察性。