本指南說明如何在 Google Kubernetes Engine (GKE) 叢集上設定節點內瀏覽權限。
節點內瀏覽權限會設定叢集中每個節點的網路,讓叢集的虛擬私有雲 (VPC) 網路處理從一個 Pod 傳送至另一個 Pod 的流量,即使這些 Pod 位於同一節點也一樣。
Standard 叢集預設會停用節點內瀏覽權限,Autopilot 叢集則預設會啟用。
架構
節點內瀏覽權限可確保 Pod 之間傳送的封包一律由虛擬私有雲網路處理,因此防火牆規則、路徑、流程記錄和封包鏡像設定都會套用至封包。
當 Pod 將封包傳送給同一節點上的另一個 Pod 時,該封包會離開節點,並由 Google Cloud 網路進行處理。隨後系統會立刻將封包傳回同一節點,並傳送到目的地的 Pod。
節點內瀏覽權限會部署 netd
DaemonSet。
優點
節點內瀏覽權限有下列優點:
- 查看 Pod 之間所有流量的流程記錄,包括位於相同節點上 Pod 之間的流量。
- 建立防火牆規則,套用至 Pod 之間的所有流量,包括同一節點上 Pod 之間的流量。
- 使用封包鏡像複製流量,包括位於相同節點上 Pod 之間的流量,並轉送流量以進行檢查。
需求條件和限制
查看節點內資料的功能有下列規定和限制:
- 叢集必須使用 GKE 1.15 以上版本。
- Windows Server 節點集區不支援節點內瀏覽權限。
- 如果您啟用節點內瀏覽權限,並使用以
nonMasqueradeCIDRs
參數設定的ip-masq-agent
,則必須在nonMasqueradeCIDRs
中加入 Pod CIDR 範圍,以免發生節點內連線問題。
防火牆規則
啟用節點內瀏覽權限後,虛擬私有雲網路會處理 Pod 之間傳送的所有封包,包括在相同節點上 Pod 之間傳送的封包。也就是說,無論 Pod 位於何處,虛擬私有雲防火牆規則和階層式防火牆政策都會一致套用至 Pod 對 Pod 的通訊。
如果您為叢集內的通訊設定自訂防火牆規則,請仔細評估叢集的網路需求,判斷允許輸出和輸入流量的規則組合。您可以使用連線能力測試,確保正當的流量不會受到阻礙。舉例來說,網路政策必須有 Pod 對 Pod 通訊才能運作。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
在新叢集上啟用節點內瀏覽權限
您可以使用 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。
輸入叢集的「名稱」。
在「設定叢集」對話方塊中,按一下「GKE Standard」旁的「設定」。
視需要設定叢集。
在導覽窗格的「叢集」底下,按一下 [網路]。
勾選「啟用節點內瀏覽權限」核取方塊。
點選「建立」。
啟用現有叢集的節點內瀏覽權限
您可以使用 gcloud CLI 或 Google Cloud 控制台,在現有叢集上啟用節點內瀏覽權限。
啟用現有叢集的節點內瀏覽權限時,GKE 會重新啟動控制層和工作站節點中的元件。
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。
勾選「啟用節點內瀏覽權限」核取方塊。
按一下 [儲存變更]。
這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要瞭解這項特定變更的詳細資料,請在「manual changes that recreate the nodes using a node upgrade strategy and respecting maintenance policies」(手動變更,使用節點升級策略重建節點,並遵守維護政策) 表格中找到對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。
停用節點內瀏覽權限
您可以使用 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」頁面。
在叢集清單中,按一下您要修改的叢集名稱。
在「網路」下方,按一下 edit「編輯節點內瀏覽權限」。
取消勾選「啟用節點內瀏覽權限」核取方塊。
按一下 [儲存變更]。
這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要瞭解這項特定變更的詳細資料,請在「manual changes that recreate the nodes using a node upgrade strategy and respecting maintenance policies」(手動變更,使用節點升級策略重建節點,並遵守維護政策) 表格中找到對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。
練習:驗證節點內瀏覽權限
本練習會說明啟用節點內瀏覽權限的必要步驟,並確認叢集是否正常運作。
在本練習中,您將執行下列步驟:
- 啟用
us-central1
地區預設子網路的流程記錄。 - 在
us-central1-a
區域中建立啟用節點內瀏覽權限的單一節點叢集。 - 在叢集中建立兩個 Pod。
- 從其中一個 Pod 傳送 HTTP 要求至另一個 Pod。
- 查看 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 即可離開殼層,然後返回主要指令列環境。
查看流量記錄項目
如要查看流程記錄項目,請使用下列指令:
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