節點內瀏覽權限

本頁面說明如何在 Google Kubernetes Engine 叢集中設定節點內的瀏覽權限,讓 Google Cloud Platform 網路能看到叢集中的所有網路流量。也就是說,您能夠看見 Pod 之間所有流量的流程記錄,包括位於相同節點上 Pod 之間的流量。透過節點內的瀏覽權限,您還可以建立防火牆規則,套用到 Pod 之間的所有流量上,甚至可套用到同一節點上的 Pod。

當 Pod 將封包傳送給同一節點上的另一個 Pod 時,該封包會離開節點,並由 GCP 網路進行處理。隨後系統會立刻將封包傳回同一節點,並傳送到目的地的 Pod。

目前根據預設,瀏覽權限為停用。

節點瀏覽權限適用於 GKE v1.11.x 以上版本。

注意事項

記錄檔量增加

啟用節點內瀏覽權限時,虛擬私人雲端擷取的流量增加,流量記錄檔的量可能也會隨之提高。您可以調整記錄設定來管理流程記錄功能的關聯費用。

所有 Pod 至 Pod 流量都會受防火牆影響

啟用節點內瀏覽權限後,虛擬私人雲端可以看到 Pod 之間的所有流量,包部署到名稱節點的 Pod。啟用節點內瀏覽權限,可能會造成先前未受限制的流量受到防火牆規則影響。請評估您節點層級的防火牆,確保正當的流量不會受到阻礙。

事前準備

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

總覽

以下是本主題操作步驟的總覽:

  1. 啟用 us-central1 地區預設子網路的流程記錄。

  2. 在 us-central1-a 區域中建立一個具有單一節點的叢集。

  3. 在叢集中建立兩個 Pod。

  4. 從其中一個 Pod 傳送 HTTP 要求至另一個 Pod。

  5. 查看 Pod 對 Pod 要求的流程記錄項目。

啟用子網路的流程記錄

gcloud

啟用 us-central1 地區預設子網路的流程記錄:

gcloud compute networks subnets update default --region us-central1 --enable-flow-logs

確認已啟用子網路的流程記錄:

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

輸出資料顯示已經啟用流程記錄:

...
enableFlowLogs: true
...
ipCidrRange: 10.128.0.0/20
region: https://www.googleapis.com/compute/v1/projects/abc-712099/regions/us-central1

主控台

請按照下列步驟來啟用 us-central1 地區預設子網路的流程記錄:

  1. 前往 GCP 主控台的「Google Kubernetes Engine VPC networks」(Google Kubernetes Engine VPC 網路) 頁面。

    造訪「VPC networks」(VPC 網路) 頁面

  2. 在「us-central1」資料列中按一下 [default] (預設)

  3. 按一下 [Edit] (編輯)

  4. 在「Flow logs」(流程記錄) 下方,選取 [On] (啟用)

  5. 按一下 [Save] (儲存)

建立叢集

建立一個具有單一節點的叢集:

gcloud

gcloud container clusters create [CLUSTER_NAME] \
    --zone us-central1-a \
    --num-nodes 1 \
    --enable-intra-node-visibility

主控台

  1. 造訪 GCP Console 中的「Create a Kubernetes cluster 」(建立 Kubernetes 叢集) 頁面。

    造訪「Kubernetes clusters」(Kubernetes 叢集) 頁面

  2. 在「Name」(名稱) 中輸入 [CLUSTER_NAME]

  3. 在「Zone」(區域) 中選取 [us-central1-a]

  4. 在「Number of nodes」(節點數) 中輸入 1

  5. 在頁面底部,按一下 [Advanced Options] (進階選項)

  6. 選取 [Enable intranode visibility] (啟用節點內瀏覽權限)

  7. 按一下 [Create] (建立)。

取得叢集憑證:

請輸入以下指令來取得新叢集的憑證:

gcloud container clusters get-credentials [CLUSTER_NAME] \
    --zone us-central1-a

憑證會儲存在您的 kubeconfig 檔案中,該檔案通常位於 $HOME/.kube/config

建立兩個 Pod

以下是第一個 Pod 的資訊清單:

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container-1
    image: gcr.io/google-samples/hello-app:2.0

將資訊清單存檔並命名為 pod-1.yaml,然後建立 Pod:

kubectl apply -f pod-1.yaml

以下是第二個 Pod 的資訊清單:

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
spec:
  containers:
  - name: container-2
    image: gcr.io/google-samples/node-hello:1.0

將資訊清單存檔並命名為 pod-2.yaml,然後建立 Pod:

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

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

kubectl exec -it pod-1 sh

在殼層中傳送要求至 pod-2

wget -qO- [POD_2_IP_ADDRESS]:8080

其中 [POD_2_IP_ADDRESS] 是您在先前練習中找到的 pod-2 IP 位址。

輸出內容顯示在 pod-2 中執行容器的回應:

Hello Kubernetes!

輸入 exit 以離開殼層,然後返回主要指令列環境。

查看流程記錄項目

gcloud

在一般指令列視窗中,輸入以下指令來查看從 pod-1 傳送至 pod-2 的要求流程記錄項目。

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/compute.googleapis.com%2Fvpc_flows" AND jsonPayload.connection.src_ip="[POD_1_IP_ADDRESS]"'

其中:

  • [PROJECT_ID] 是您的專案 ID。
  • [POD_1_IP_ADDRESS]pod-1 的 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. 前往 GCP 主控台的「Google Kubernetes Engine Stackdriver logs」(Google Kubernetes Engine Stackdriver 記錄) 頁面。

    造訪「Stackdriver logs」(Stackdriver 記錄) 頁面

  2. 在頁面頂端,按一下篩選器方塊右側的向下箭號,然後選取 [Convert to advanced filter] (轉換為進階篩選器)

  3. 刪除篩選器方塊中的所有文字,然後輸入下列查詢:

    resource.type="gce_subnetwork"
    logName="projects/[PROJECT_ID]/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.connection.src_ip="[POD_1_IP_ADDRESS]"
    

    其中:

    • [PROJECT_ID] 是您的專案 ID。
    • [POD_1_IP_ADDRESS]pod-1 的 IP 位址。

    展開列出的記錄項目。在 jsonPayload 下方,您可以看到要求是從 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
    

請回想一下,您的叢集只有一個節點,所以 pod-1pod-2 位在同一個節點上。即便如此,流程記錄項目也可用於 pod-1pod-2 之間的節點內通訊。

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

gcloud

如要啟用現有叢集的節點內瀏覽權限功能,請輸入以下指令:

gcloud beta container clusters update [CLUSTER_NAME] \
    --enable-intra-node-visibility

其中 [CLUSTER_NAME] 是現有叢集的名稱。

主控台

  1. 造訪 GCP 主控台的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 按一下鉛筆形狀的叢集 [Edit] (編輯) 按鈕。

  3. 啟用 Intranode 瀏覽權限

  4. 按一下 [Save] (儲存)

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

啟用此功能後,可以檢查節點上的轉送規則,確認該功能是否已啟動:

ip rule show

會出現類似如下的輸出內容:

0:  from all lookup local
30001:  from all fwmark 0x4000/0x4000 lookup main
30002:  from all iif lo lookup main
30003:  not from all iif eth0 lookup 1
32766:  from all lookup main
32767:  from all lookup default

以及:

ip route show table 1

會出現類似如下的輸出內容:

default via [GKE_NODE_SUBNET_GW] dev eth0

停用節點內瀏覽權限

gcloud

如要停用現有叢集的節點內瀏覽權限功能,請輸入以下指令:

gcloud beta container clusters update [CLUSTER_NAME] \
  --no-enable-intra-node-visibility

其中 [CLUSTER_NAME] 是現有叢集的名稱。

主控台

  1. 前往 GCP Console 的「Kubernetes clusters」(Kubernetes 叢集) 頁面。

    造訪「Kubernetes clusters」(Kubernetes 叢集) 頁面

  2. 按一下鉛筆形狀的叢集 [Edit] (編輯) 按鈕。

  3. 在「Intranode visilbility」(節點內瀏覽權限) 下拉式選單中,選取 [Disabled] (停用)

  4. 按一下 [Save] (儲存)

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

後續步驟

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

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

這個網頁
Kubernetes Engine 說明文件