設定應用程式的網路政策

本教學課程示範如何使用叢集網路政策控管哪些 Pod 接收傳入的網路流量,以及哪些 Pod 可以傳送外送的流量。

網路政策允許您限制 Pod 之間的連線。因此,使用網路政策可以縮減入侵範圍,提供更好的安全性。

本頁面說明如何在 GKE 中設定網路政策。

請注意,網路政策可供決定是否允許連線,但不提供授權或安全傳輸 (例如 SSL/TLS) 之類的更高階功能。

目標

在本教學課程中,您將學習:

  • 如何建立強制執行網路政策的叢集
  • 如何使用標籤限制傳入 Pod 的流量
  • 如何使用標籤限制從 Pod 外送的流量

事前準備

請依照下列步驟啟用 Kubernetes Engine API:
  1. 造訪 Google Cloud Platform 主控台的 Kubernetes Engine 頁面
  2. 建立或選取專案。
  3. 等待 API 和相關服務完成啟用。這可能需要幾分鐘的時間。
  4. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

請安裝下列指令列工具,我們將在本教學課程中使用這些工具:

  • gcloud 可用來建立和刪除 Kubernetes Engine 叢集。gcloud 包含於 Google Cloud SDK 中。
  • kubectl 可用於管理 Kubernetes,這是 Kubernetes Engine 使用的叢集自動化調度管理系統。您可以使用 gcloud 來安裝 kubectl
    gcloud components install kubectl

設定 gcloud 指令列工具的預設設定

為了節省您在 gcloud 指令列工具輸入專案 IDCompute Engine zone 選項的時間,建議您採用以下預設設定:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

步驟 1:建立 GKE

如要建立強制執行網路政策的容器叢集,請執行下列指令:

gcloud container clusters create test --enable-network-policy

步驟 2:限制傳入 Pod 的流量

Kubernetes NetworkPolicy 資源可讓您設定 Pod 的網路存取權政策。NetworkPolicy 物件含有下列資訊:

  • 要用於套用網路政策的 Pod,通常是由標籤選取器指定

  • 網路政策所影響的網際網路流量類型:Ingress 表示傳入流量,Egress 表示外送流量,或兩者皆有

  • 在輸入政策中,說明哪些 Pod 可以連接至指定的 Pod

  • 在輸出政策中,說明指定的 Pod 所能連接的 Pod。

首先,執行標籤為 app=hello 的簡易網路伺服器應用程式,然後在叢集內部公開此應用程式:

kubectl run hello-web --labels app=hello \
  --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose

接下來,您必須設定 NetworkPolicy 只允許來自 app=foo Pod 的流量傳入 hello-web Pod。不具此標籤的 Pod 所傳送的其他傳入流量、外部流量及其他名稱空間的 Pod 所傳送的流量均會遭到封鎖。

將下列設定儲存至 hello-allow-from-foo.yaml

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: hello-allow-from-foo
spec:
  policyTypes:
  - Ingress
  podSelector:
    matchLabels:
      app: hello
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: foo

此政策會選取含有 app=hello 標籤的 Pod,並指定輸入政策,只允許具有 app=foo 標籤的 Pod 所傳送的流量。

如要將此政策套用至叢集,請執行下列指令:

kubectl apply -f hello-allow-from-foo.yaml

驗證輸入政策

首先,執行具有 app=foo 標籤的臨時 Pod,然後在該 Pod 中取得殼層:

kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t test-1

hello-web:8080 端點發出要求,驗證是否允許傳入的流量:

/ # wget -qO- --timeout=2 http://hello-web:8080
Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6z
/ # exit

從 Pod app=foo 傳入 app=hello Pod 的流量已啟用。

接下來,請執行具有不同標籤 (app=other) 的臨時 Pod,並在該 Pod 中取得殼層:

kubectl run -l app=other --image=alpine --restart=Never --rm -i -t test-1

發出相同的要求,以便觀察系統確實「不允許」該流量,使得要求因此逾時,然後離開 Pod 殼層:

/ # wget -qO- --timeout=2 http://hello-web:8080
wget: download timed out
/ # exit

步驟 3:限制來自 Pod 的外送流量

您可以像限制傳入流量一樣,限制外送 (輸出) 流量。

但若要查詢內部主機名稱 (如 hello-web) 或外部主機名稱 (如 www.example.com),您必須在輸出網路政策中允許 DNS (網域名稱系統) 解析。DNS 流量會透過 TCP 及 UDP 通訊協定在通訊埠 53 上產生。

如要執行輸出網路政策,請部署 NetworkPolicy 以控管從具有 app=foo 標籤的 Pod 傳出的流量,同時只允許流量傳入具有 app=hello 標籤的 Pod 以及允許 DNS 流量。

將下列設定儲存至 foo-allow-to-hello.yaml,並將此檔案套用至叢集:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: foo-allow-to-hello
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels:
      app: foo
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: hello
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP
kubectl apply -f foo-allow-to-hello.yaml

此資訊清單指定的網路政策可控管從 app=foo 標籤的 Pod 傳出的流量只能送往兩個允許的目的地:

  1. 位於相同名稱空間中具有 app=hello 標籤的 Pod。
  2. 位於通訊埠 53 上的叢集 Pod 或外部端點 (使用 UDP 和 TCP)

驗證輸出政策

首先,部署名為 hello-web-2 的新網路應用程式,然後在叢集內部公開此應用程式:

kubectl run hello-web-2 --labels app=hello-2 \
  --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose

接下來,請執行具有 app=foo 標籤的臨時 Pod,並在容器中取得殼層提示:

kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never test-3

驗證 Pod 是否可以建立連至 hello-web:8080 的連線:

/ # wget -qO- --timeout=2 http://hello-web:8080
Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6z

驗證 Pod 無法建立連至 hello-web-2:8080 的連線:

/ # wget -qO- --timeout=2 http://hello-web-2:8080
wget: download timed out

驗證 Pod 無法建立連至外部網站 (如 www.example.com) 的連線,然後結束 Pod 殼層。

/ # wget -qO- --timeout=2 http://www.example.com
wget: download timed out
/ # exit

清除

如何避免系統向您的 Google Cloud Platform 帳戶收取在本教學課程中使用資源的相關費用:

  1. 刪除容器叢集:此步驟會刪除組成容器叢集的資源,例如運算執行個體、磁碟和網路資源。

    gcloud container clusters delete test

後續步驟

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

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

這個網頁
Kubernetes Engine 教學課程