設定節點內瀏覽權限


本指南說明如何在 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 位置。為地區叢集提供地區,或為區域叢集提供區域。

控制台

如要建立啟用節點內瀏覽權限功能的單一節點叢集,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下「建立」

  3. 輸入叢集的「名稱」

  4. 在「設定叢集」對話方塊中,按一下「GKE Standard」旁的「設定」

  5. 視需要設定叢集。

  6. 在導覽窗格的「叢集」底下,按一下 [網路]

  7. 勾選「啟用節點內瀏覽權限」核取方塊。

  8. 點選「建立」

啟用現有叢集的節點內瀏覽權限

您可以使用 gcloud CLI 或 Google Cloud 控制台,在現有叢集上啟用節點內瀏覽權限。

啟用現有叢集的節點內瀏覽權限時,GKE 會重新啟動控制層和工作站節點中的元件。

gcloud

如要在現有叢集上啟用節點內瀏覽權限,請使用 --enable-intra-node-visibility 標記:

gcloud container clusters update CLUSTER_NAME \
    --enable-intra-node-visibility

CLUSTER_NAME 替換為叢集名稱。

控制台

如要啟用現有叢集的節點內瀏覽權限,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 在叢集清單中,按一下您要修改的叢集名稱。

  3. 在「Networking」(網路) 下方,按一下「Edit intranode visibility」(編輯節點內可見性)

  4. 勾選「啟用節點內瀏覽權限」核取方塊。

  5. 按一下 [儲存變更]。

這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要瞭解這項特定變更的詳細資料,請在「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 替換為叢集名稱。

控制台

如要停用節點內瀏覽權限,請執行下列步驟:

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 在叢集清單中,按一下您要修改的叢集名稱。

  3. 在「網路」下方,按一下 「編輯節點內瀏覽權限」

  4. 取消勾選「啟用節點內瀏覽權限」核取方塊。

  5. 按一下 [儲存變更]。

這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要瞭解這項特定變更的詳細資料,請在「manual changes that recreate the nodes using a node upgrade strategy and respecting maintenance policies」(手動變更,使用節點升級策略重建節點,並遵守維護政策) 表格中找到對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。

練習:驗證節點內瀏覽權限

本練習會說明啟用節點內瀏覽權限的必要步驟,並確認叢集是否正常運作。

在本練習中,您將執行下列步驟:

  1. 啟用 us-central1 地區預設子網路的流程記錄。
  2. us-central1-a 區域中建立啟用節點內瀏覽權限的單一節點叢集。
  3. 在叢集中建立兩個 Pod。
  4. 從其中一個 Pod 傳送 HTTP 要求至另一個 Pod。
  5. 查看 Pod 對 Pod 要求的流程記錄項目。

啟用流量記錄檔

  1. 啟用預設子網路的流程記錄:

    gcloud compute networks subnets update default \
        --region=us-central1 \
        --enable-flow-logs
    
  2. 確認預設子網路已啟用流程記錄:

    gcloud compute networks subnets describe default \
        --region=us-central1
    

    輸出資料顯示已啟用流程記錄,類似如下:

    ...
    enableFlowLogs: true
    ...
    

建立叢集

  1. 建立啟用節點內瀏覽權限的單一節點叢集:

    gcloud container clusters create flow-log-test \
        --location=us-central1-a \
        --num-nodes=1 \
        --enable-intra-node-visibility
    
  2. 取得叢集的憑證:

    gcloud container clusters get-credentials flow-log-test \
        --location=us-central1-a
    

建立兩個 Pod

  1. 建立 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
    
  2. 將資訊清單套用至叢集:

    kubectl apply -f pod-1.yaml
    
  3. 建立第二個 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
    
  4. 將資訊清單套用至叢集:

    kubectl apply -f pod-2.yaml
    
  5. 查看 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-1pod-2 的 IP 位址。

傳送要求

  1. 取得 pod-1 中容器的殼層:

    kubectl exec -it pod-1 -- sh
    
  2. 在殼層中傳送要求至 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
    
  3. 輸入 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_ADDRESSpod-1 的 IP 位址。
  • POD_2_IP_ADDRESSpod-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
...

清除所用資源

如要避免系統向您的帳戶收取不必要的費用,請按照下列步驟移除您建立的資源:

  1. 刪除叢集:

    gcloud container clusters delete -q flow-log-test
    
  2. 停用預設子網路的流程記錄:

    gcloud compute networks subnets update default --no-enable-flow-logs
    

後續步驟