本教學課程示範如何使用叢集網路政策,控管哪些 Pod 接收傳入的網路流量,以及哪些 Pod 可以傳送外送的流量。詳情請參閱建立叢集網路政策。
網路政策允許您限制 Pod 之間的連線。因此,使用網路政策可以縮減入侵範圍,提供更好的安全性。
請注意,網路政策可供決定是否允許連線,但不提供授權或安全傳輸 (例如 SSL/TLS) 之類的更高階功能。
建立強制執行網路政策的 GKE 叢集
如要建立強制執行網路政策的容器叢集,請執行下列指令:
gcloud container clusters create test --enable-network-policy
限制傳入 Pod 的流量
Kubernetes NetworkPolicy
資源可讓您設定 Pod 的網路存取權政策。NetworkPolicy
物件包含下列資訊:
要用於套用網路政策的 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。不具此標籤的 Pod 所傳送的其他傳入流量、外部流量及其他名稱空間的 Pod 所傳送的流量均會遭到封鎖。
下列資訊清單會選取含有 app=hello
標籤的 Pod,並指定輸入政策,只允許具有 app=foo
標籤的 Pod 所傳送的流量:
如要將此政策套用至叢集,請執行下列指令:
kubectl apply -f hello-allow-from-foo.yaml
驗證 Ingress 政策
首先,執行具有 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
限制來自 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。 - 位於通訊埠 53 上的叢集 Pod 或外部端點 (使用 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: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