本頁面示範如何使用叢集網路政策,控管 Pod 是否可接收傳入 (或 Ingress) 網路流量,以及是否可傳送外送 (或 Egress) 流量。
網路政策可讓您限制 Pod 物件之間的連線,減少遭受攻擊的風險。
網路政策的作用如同 OSI 模型第 3 層或第 4 層的防火牆,不會提供授權或加密等額外功能。
限制傳入 Pod 物件的流量
NetworkPolicy
物件可讓您設定 Pod 的網路存取權政策。NetworkPolicy
物件包含下列資訊:
政策適用的 Pod 物件。您可以使用標籤和選取器定義 Pod 物件和工作負載。
網路政策所影響的流量類型:傳入流量的 Ingress、外送流量的 Egress,或兩者皆有。
在輸入政策中,說明哪些 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。GKE on AWS 會封鎖不具此標籤的 Pod 物件傳入流量、外部流量,以及來自不同命名空間中 Pod 物件的流量。下列資訊清單會選取含有
app=hello
標籤的 Pod 物件,並指定輸入政策,只允許含有app=foo
標籤的 Pod 物件傳送流量:將這項政策套用至叢集:
kubectl apply -f hello-allow-from-foo.yaml
驗證 Ingress 政策
執行具有
app=foo
標籤的臨時 Pod。如要驗證是否允許傳入的流量,請向hello-web:8080
端點發出要求:kubectl run -l app=foo --image=alpine --restart=Never --rm -i -t foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080
如果從 Pod
app=foo
到app=hello
Pod 物件的流量已啟用,輸出內容會如下所示:Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z
執行具有不同標籤 (
app=other
) 的臨時 Pod,然後發出相同的要求,觀察系統是否不允許該流量:kubectl run -l app=other --image=alpine --restart=Never --rm -i -t other-app \ -- wget -qO- --timeout=2 http://hello-web:8080
輸出內容會確認連線未收到回應:
wget: download timed out
限制 Pod 物件的外送流量
您可以像限制傳入流量一樣,限制傳出流量。
不過,如要查詢內部主機名稱 (例如 hello-web
) 或外部主機名稱 (例如 www.example.com
),您必須建立輸出政策,允許透過 TCP 和 UDP 通訊協定在通訊埠 53 上傳輸 DNS 流量。
如要啟用輸出網路政策,請部署 NetworkPolicy
,控管從具有 app=foo
標籤的 Pod 物件傳出的流量,同時只允許流量傳入具有 app=hello
標籤的 Pod 物件,以及允許 DNS 流量。
以下資訊清單指定了 NetworkPolicy
,可控管從標籤為 app=foo
的 Pod 物件傳出的流量只能送往兩個允許的目的地:
- 位於相同命名空間中具有
app=hello
標籤的 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,並驗證該 Pod 是否可以建立連至hello-web:8080
的連線:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web:8080
Pod 會回應要求:
Hello, world! Version: 1.0.0 Hostname: hello-web-2258067535-vbx6z
驗證 Pod 無法建立連至
hello-web-2:8080
的連線:kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://hello-web-2:8080
輸出內容會確認連線未收到回應:
wget: download timed out
驗證 Pod 無法建立連至外部網站 (如
www.example.com
) 的連線。kubectl run -l app=foo --image=alpine --rm -i -t --restart=Never foo-app \ -- wget -qO- --timeout=2 http://www.example.com
輸出內容會確認連線未收到回應:
wget: download timed out
清除所用資源
如要移除在本教學課程中建立的資源,請執行下列指令:
kubectl delete pods --labels app=hello-2
kubectl delete pods --labels app=hello
kubectl delete -f foo-allow-to-hello.yaml
kubectl delete -f hello-allow-from-foo.yaml
後續步驟
- Kubernetes 網路政策說明文件
- 使用網路政策記錄功能,記錄叢集的網路政策允許或拒絕連線至 Pod 物件的時間。