本指南說明如何在 Google Kubernetes Engine (GKE) 叢集上設定節點內可視性。
「掌握節點內流量」功能會設定叢集中每個節點的網路,讓叢集的虛擬私有雲 (VPC) 網路處理從一個 Pod 傳送至另一個 Pod 的流量,即使 Pod 位於相同節點也是如此。
Standard 叢集預設會停用節點內瀏覽功能,Autopilot 叢集則預設會啟用這項功能。
架構
節點內瀏覽功能可確保 Pod 之間傳送的封包由虛擬私有雲網路處理。虛擬私有雲網路隨後會將防火牆規則、路徑、流量記錄和 Packet Mirroring 設定套用至這些封包。
當 Pod 將封包傳送至同一節點上的另一個 Pod 時,封包會離開節點,並由 Google Cloud 網路處理。隨後系統會立刻將封包傳回同一節點,並傳送到目的地的 Pod。
啟用節點內瀏覽功能後,每個節點上的網路元件都會設定為管理主機網路設定:
- 在 GKE Dataplane V2 (GKE 1.36.0-gke.3302000 版或更新版本):節點內可視性是 eBPF 原生功能。流量重新導向會在 eBPF 中處理,略過主機網路堆疊。
- 在舊版 GKE 或非 GKE Dataplane V2 叢集中:
netdDaemonSet 會管理節點上的封包重新導向。
優點
掌握節點內流量有下列好處:
- 查看 Pod 之間所有流量的流量記錄,包括同一節點上 Pod 之間的流量。
- 建立防火牆規則,套用至 Pod 之間的所有流量,包括同一節點上 Pod 之間的流量。
- 使用Packet Mirroring功能複製流量 (包括同一節點上 Pod 之間的流量),並轉送流量以進行檢查。
需求條件和限制
「掌握節點內流量」功能有下列規定和限制:
- 叢集必須使用 GKE 1.15 以上版本。
- Windows Server 節點集區不支援節點內瀏覽功能。
- 如果叢集設有多網路,節點內瀏覽權限僅適用於預設網路上的流量。
- 為避免連線問題,搭配使用
ip-masq-agent和節點內瀏覽權限時,自訂nonMasqueradeCIDRs清單必須包含叢集的節點和 Pod IP 位址範圍。
防火牆規則
啟用節點內瀏覽功能後,虛擬私有雲網路會處理 Pod 之間傳送的所有封包,包括在同一節點上的 Pod 之間傳送的封包。也就是說,無論 Pod 位於何處,虛擬私有雲防火牆規則和階層式防火牆政策都會持續套用至 Pod 間的通訊。
如果您設定自訂防火牆規則,用於叢集內通訊,請仔細評估叢集的網路需求,判斷輸出和輸入允許規則組合。您可以使用 Connectivity Tests,確保合法流量不會遭到阻擋。舉例來說,網路政策必須有 Pod 對 Pod 的通訊功能才能運作。
事前準備
開始之前,請務必先完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。
在新叢集上啟用「掌握節點內流量」功能
您可以使用 gcloud CLI 或 Google Cloud 控制台,建立啟用節點內瀏覽權限的叢集。
gcloud
如要建立啟用節點內瀏覽權限的單一節點叢集,請使用 --enable-intra-node-visibility 旗標:
gcloud container clusters create CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--enable-intra-node-visibility
更改下列內容:
CLUSTER_NAME:新叢集的名稱。CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。如果是區域叢集,請提供區域;如果是可用區叢集,請提供可用區。
控制台
如要建立已啟用節點內瀏覽功能的單一節點叢集,請按照下列步驟操作:
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下「建立」add_box。
輸入叢集的名稱。
在「Configure cluster」(設定叢集) 對話方塊中,按一下「GKE Standard」旁邊的「Configure」(設定)。
視需求設定叢集。
在導覽窗格的「叢集」底下,按一下 [網路]。
勾選「啟用節點內瀏覽權限」核取方塊。
點選「建立」。
在現有叢集上啟用「掌握節點內流量」功能
您可以使用 gcloud CLI 或 Google Cloud 控制台,在現有叢集上啟用節點內瀏覽功能。
為現有叢集啟用節點內部的瀏覽權限時,GKE 會重新啟動控制層和 worker 節點中的元件。
gcloud
如要在現有叢集上啟用節點內瀏覽權限,請使用 --enable-intra-node-visibility 旗標:
gcloud container clusters update CLUSTER_NAME \
--enable-intra-node-visibility
將 CLUSTER_NAME 替換為叢集名稱。
控制台
如要在現有叢集上啟用節點內瀏覽功能,請按照下列步驟操作:
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
在叢集清單中,按一下您要修改的叢集名稱。
在「Networking」(網路) 下方,按一下「Edit intranode visibility」(編輯節點內可見性)edit。
勾選「啟用節點內瀏覽權限」核取方塊。
按一下 [儲存變更]。
這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要瞭解這項特定變更的詳細資料,請在手動變更,使用節點升級策略並遵守維護政策重新建立節點表格中,找到對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷情形」。
停用「掌握節點內流量」功能
您可以使用 gcloud CLI 或 Google Cloud 控制台,在叢集上停用節點內瀏覽權限。
為現有叢集停用「掌握節點內流量」功能時,GKE 會重新啟動控制層和工作站節點中的元件。
gcloud
如要停用節點內瀏覽功能,請使用 --no-enable-intra-node-visibility 旗標:
gcloud container clusters update CLUSTER_NAME \
--no-enable-intra-node-visibility
將 CLUSTER_NAME 替換為叢集名稱。
控制台
如要停用節點內流量瀏覽權限,請按照下列步驟操作:
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
在叢集清單中,按一下您要修改的叢集名稱。
在「Networking」(網路) 下方,按一下 edit「Edit intranode visibility」(編輯節點內瀏覽權限)。
取消勾選「Enable intranode visibility」(啟用『掌握節點內流量』功能) 核取方塊。
按一下 [儲存變更]。
這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要瞭解這項特定變更的詳細資料,請在手動變更,使用節點升級策略並遵守維護政策重新建立節點表格中,找到對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷情形」。
練習:驗證節點內瀏覽權限
本練習將說明啟用節點內瀏覽權限,並確認叢集是否正常運作的必要步驟。
在本練習中,您會執行下列步驟:
- 為
us-central1區域的預設子網路啟用流量記錄。 - 在
us-central1-a可用區建立單一節點叢集,並啟用節點內瀏覽權限。 - 在叢集中建立兩個 Pod。
- 從一個 Pod 向另一個 Pod 傳送 HTTP 要求。
- 查看 Pod 對 Pod 要求的流程記錄項目。
啟用流量記錄檔
啟用預設子網路的流量記錄:
gcloud compute networks subnets update default \ --region=us-central1 \ --enable-flow-logs確認預設子網路已啟用流量記錄:
gcloud compute networks subnets describe default \ --region=us-central1輸出內容會顯示流量記錄已啟用,大致如下:
... enableFlowLogs: true ...
建立叢集
建立單一節點叢集,並啟用節點內瀏覽功能:
gcloud container clusters create flow-log-test \ --location=us-central1-a \ --num-nodes=1 \ --enable-intra-node-visibility取得叢集的憑證:
gcloud container clusters get-credentials flow-log-test \ --location=us-central1-a
建立兩個 Pod
建立 Pod。
將下列資訊清單儲存至名為
pod-1.yaml的檔案:apiVersion: v1 kind: Pod metadata: name: pod-1 spec: containers: - name: container-1 image: google/cloud-sdk:slim command: - sh - -c - while true; do sleep 30; done將資訊清單套用至叢集:
kubectl apply -f pod-1.yaml建立第二個 Pod。
將下列資訊清單儲存至名為
pod-2.yaml的檔案:apiVersion: v1 kind: Pod metadata: name: pod-2 spec: containers: - name: container-2 image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0將資訊清單套用至叢集:
kubectl apply -f pod-2.yaml查看 Pod:
kubectl get pod pod-1 pod-2 --output wide輸出內容會顯示 Pod 的 IP 位址,如下所示:
NAME READY STATUS RESTARTS AGE IP ... pod-1 1/1 Running 0 1d 10.52.0.13 ... pod-2 1/1 Running 0 1d 10.52.0.14 ...記下
pod-1和pod-2的 IP 位址。
傳送要求
取得
pod-1中容器的殼層:kubectl exec -it pod-1 -- sh在殼層中,將要求傳送至
pod-2:curl -s POD_2_IP_ADDRESS:8080將
POD_2_IP_ADDRESS替換為pod-2的 IP 位址。輸出內容會顯示在
pod-2中執行的容器回應。Hello, world! Version: 2.0.0 Hostname: pod-2輸入 exit 即可離開 Shell,返回主要指令列環境。
查看流量記錄項目
如要查看流程記錄項目,請使用下列指令:
gcloud logging read \
'logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Fvpc_flows" AND jsonPayload.connection.src_ip="POD_1_IP_ADDRESS" AND jsonPayload.connection.dest_ip="POD_2_IP_ADDRESS"'
更改下列內容:
PROJECT_ID:您的專案 ID。POD_1_IP_ADDRESS:pod-1的 IP 位址。POD_2_IP_ADDRESS:pod-2的 IP 位址。
輸出內容會顯示從 pod-1 到 pod-2 的要求流量記錄項目。在這個範例中,pod-1 的 IP 位址為 10.56.0.13,pod-2 的 IP 位址為 10.56.0.14。
...
jsonPayload:
bytes_sent: '0'
connection:
dest_ip: 10.56.0.14
dest_port: 8080
protocol: 6
src_ip: 10.56.0.13
src_port: 35414
...
清除所用資源
如要避免系統向您的帳戶收取不必要的費用,請按照下列步驟移除您建立的資源:
刪除叢集:
gcloud container clusters delete -q flow-log-test停用預設子網路的流量記錄:
gcloud compute networks subnets update default --no-enable-flow-logs