本教學課程示範如何使用叢集網路政策,控管可接收傳入網路流量的 Pod,以及可傳出流量的 Pod。詳情請參閱「建立叢集網路政策」。
網路政策可限制 Pod 之間的連線。因此,使用網路政策可縮小遭入侵的範圍,進而提升安全性。
請注意,網路政策會決定是否允許連線,且不會提供授權或安全傳輸 (例如 SSL/TLS) 等較高層級的功能。
目標
在本教學課程中,您將學習:- 如何建立強制執行網路政策的叢集
- 如何使用標籤限制傳入 Pod 的流量
- 如何使用標籤限制從 Pod 外送的流量
費用
在本文件中,您將使用下列 Google Cloud計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。
事前準備
請按照下列步驟啟用 Kubernetes Engine API:- 前往 Google Cloud 控制台的 Kubernetes Engine 頁面。
- 建立或選取專案。
- 等待 API 和相關服務完成啟用。 這可能需要幾分鐘的時間。
請安裝下列指令列工具,我們將在本教學課程中使用這些工具:
-
gcloud可用來建立和刪除 Kubernetes Engine 叢集。gcloud包含在gcloudCLI 中。 -
kubectl可用於管理 Kubernetes,這是 Kubernetes Engine 使用的叢集自動化調度管理系統。您可以使用gcloud安裝kubectl:gcloud components install kubectl
從 GitHub 複製程式碼範例:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/networking/network-policies
設定 gcloud 指令列工具的預設設定
如要節省在 gcloud 指令列工具中輸入專案 ID 和 Compute Engine 區域選項的時間,可以採用預設設定:gcloud config set project project-id gcloud config set compute/zone compute-zone
建立強制執行網路政策的 GKE 叢集
如要建立啟用網路政策執行的容器叢集,請執行下列指令:
gcloud container clusters create test --enable-network-policy
限制傳入 Pod 的流量
Kubernetes NetworkPolicy 資源可讓您為 Pod 設定網路存取政策。NetworkPolicy 物件包含下列資訊:
網路政策適用的 Pod,通常由標籤選取器指定
網路政策影響的流量類型:連入流量的輸入流量、連出流量的輸出流量,或兩者皆是
在輸入政策中,說明哪些 Pod 可以連接至指定的 Pod
如果是輸出政策,則為指定 Pod 可連線的 Pod
首先,執行標籤為 app=hello 的網路伺服器應用程式,並在叢集內部公開該應用程式:
kubectl run hello-web --labels app=hello \ --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose
接著,設定 NetworkPolicy,只允許來自 app=foo Pod 的流量傳送至 hello-web Pod。不具此標籤的 Pod 所傳送的其他傳入流量、外部流量及其他名稱空間的 Pod 所傳送的流量均會遭到封鎖。
下列資訊清單會選取具有 app=hello 標籤的 Pod,並指定 Ingress 政策,只允許來自具有 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:8080Hello, 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:8080wget: download timed out / # exit
限制 Pod 的輸出流量
您可以像限制傳入流量一樣限制傳出流量。
不過,如要查詢內部主機名稱 (例如 hello-web) 或外部主機名稱 (例如 www.example.com),您必須允許輸出網路政策中的 DNS (網域名稱系統) 解析。DNS 流量會透過 TCP 及 UDP 通訊協定在通訊埠 53 上產生。
如要啟用輸出網路政策,請部署NetworkPolicy,控管標籤為 app=foo 的 Pod 輸出流量,同時只允許流量傳送至標籤為 app=hello 的 Pod,以及 DNS 流量。
以下資訊清單指定網路政策,控管標籤為 app=foo 的 Pod 輸出流量,並允許兩個目的地:
- 具有
app=hello標籤的相同命名空間中的 Pod。 - 叢集 Pod 或外部端點 (通訊埠 53,UDP 和 TCP)。
如要將此政策套用至叢集,請執行下列指令:
kubectl apply -f foo-allow-to-hello.yaml
驗證輸出政策
首先,部署名為 hello-web-2 的新網頁應用程式,並在叢集內部公開:
kubectl run hello-web-2 --labels app=hello-2 \ --image=us-docker.pkg.dev/google-samples/containers/gke/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:8080Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6z確認 Pod「無法」與 hello-web-2:8080 建立連線:
/ # wget -qO- --timeout=2 http://hello-web-2:8080wget: download timed out驗證 Pod 無法建立與外部網站 (例如 www.example.com) 的連線,然後結束 Pod 殼層。
/ # wget -qO- --timeout=2 http://www.example.comwget: download timed out
/ # exit清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 帳戶收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除容器叢集:此步驟會刪除組成容器叢集的資源,例如運算執行個體、磁碟和網路資源。
gcloud container clusters delete test