設定網路政策

本頁面示範如何使用叢集網路政策,控管 Pod 是否可接收傳入 (或 Ingress) 網路流量,以及是否可傳送外送 (或 Egress) 流量。

網路政策可讓您限制 Pod 物件之間的連線,減少遭受攻擊的風險。

網路政策的作用如同 OSI 模型第 3 層或第 4 層的防火牆,不會提供授權或加密等額外功能。

限制傳入 Pod 物件的流量

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

  • 政策適用的 Pod 物件。您可以使用標籤和選取器定義 Pod 物件和工作負載。

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

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

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

連入流量限制範例

本節將示範如何為範例應用程式建立連入流量限制。請根據自己的應用程式環境修改這個範例。

  1. 執行標籤為 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
    
  2. 設定 NetworkPolicy,只允許來自 app=foo Pod 物件的流量傳入 hello-web Pod。GKE on Azure 會封鎖不具此標籤的 Pod 物件傳入流量、外部流量,以及來自不同命名空間的 Pod 物件流量。

    下列資訊清單會選取含有 app=hello 標籤的 Pod 物件,並指定輸入政策,只允許含有 app=foo 標籤的 Pod 物件傳送流量:

    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
  3. 將這項政策套用至叢集:

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

驗證 Ingress 政策

  1. 執行具有 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=fooapp=hello Pod 物件的流量已啟用,輸出內容會如下所示:

    Hello, world!
    Version: 1.0.0
    Hostname: hello-web-2258067535-vbx6z
    
  2. 執行具有不同標籤 (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 物件傳出的流量只能送往兩個允許的目的地:

  1. 位於相同命名空間中具有 app=hello 標籤的 Pod 物件。
  2. 位於通訊埠 53 上的內部或外部端點 (使用 UDP 和 TCP)
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

驗證輸出政策

  1. 部署名為 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
    
  2. 執行具有 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
    
  3. 驗證 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
    
  4. 驗證 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

後續步驟