環境模式與 Kubernetes 網路政策

Kubernetes 網路政策 可讓您控制第 4 層流量如何到達您的 Pod。

NetworkPolicy 通常是由您叢集中安裝的 CNI 強制執行的。Istio 不是 CNI,不會強制執行或管理 NetworkPolicy,並且在所有情況下都會尊重它 - ambient 模式不會,也永遠不會繞過 Kubernetes NetworkPolicy 的強制執行。

這意味著,有可能建立一個會阻止 Istio 流量或以其他方式阻礙 Istio 功能的 Kubernetes NetworkPolicy,因此當同時使用 NetworkPolicy 和 ambient 模式時,需要記住一些事項。

環境流量覆蓋和 Kubernetes 網路政策

將應用程式新增至 ambient 網格後,ambient 的安全 L4 覆蓋網路將透過 15008 埠在您的 Pod 之間隧道傳輸流量。安全流量以 15008 作為目標埠進入目標 Pod 後,流量將被代理回原始目標埠。

但是,NetworkPolicy 是在主機上(Pod 之外)強制執行的。這表示,如果您有現有的 NetworkPolicy,例如,會拒絕除了 443 埠以外的所有埠對 ambient Pod 的入站流量,則您必須為 15008 埠在該 NetworkPolicy 中新增例外。

例如,以下 NetworkPolicy 會封鎖傳入至 my-app 上 15008 埠的 HBONE 流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
spec:
  ingress:
  - ports:
    - port: 9090
      protocol: TCP
  podSelector:
    matchLabels:
      app.kubernetes.io/name: my-app

並且應該更改為

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
spec:
  ingress:
  - ports:
    - port: 8080
      protocol: TCP
    - port: 15008
      protocol: TCP
  podSelector:
    matchLabels:
      app.kubernetes.io/name: my-app

如果 my-app 新增至 ambient 網格。

環境模式、健康探測和 Kubernetes 網路政策

Kubernetes 健康檢查探測會造成問題,並為一般的 Kubernetes 流量策略建立特殊情況。它們源自於在節點上作為進程執行的 kubelet,而不是叢集中的其他 Pod。它們是純文字且不安全的。kubelet 或 Kubernetes 節點通常都沒有自己的加密身分,因此無法進行存取控制。僅允許所有流量通過健康檢查探測埠是不夠的,因為惡意流量也可以像 kubelet 一樣輕鬆地使用該埠。此外,許多應用程式會將相同的埠用於健康檢查探測和合法的應用程式流量,因此基於簡單埠的允許是不可接受的。

各種 CNI 實作透過不同的方式解決此問題,並嘗試透過靜默地將 kubelet 健康檢查探測從正常策略強制執行中排除,或為它們設定策略例外來解決此問題。

在 Istio ambient 中,此問題是透過結合 iptables 規則和來源網路位址轉譯 (SNAT) 來解決的,以僅重寫可證明源自本機節點且具有固定連結本機 IP 的封包,以便可以透過 Istio 策略強制執行將它們明確忽略為不安全的健康檢查探測流量。選擇連結本機 IP 作為預設值,因為它們通常會被忽略用於輸入/輸出控制,並且 根據 IETF 標準,它們無法在本地子網路外部路由。

當您將 Pod 新增至 ambient 網格時,此行為會以透明方式啟用,並且依預設,ambient 會使用連結本機位址 169.254.7.127 來識別並正確允許 kubelet 健康檢查探測封包。

但是,如果您的工作負載、命名空間或叢集具有現有的輸入或輸出 NetworkPolicy,則根據您使用的 CNI,具有此連結本機位址的封包可能會被明確的 NetworkPolicy 封鎖,這將導致當您將 Pod 新增至 ambient 網格時,您的應用程式 Pod 健康檢查探測開始失敗。

例如,在命名空間中套用以下 NetworkPolicy 會封鎖到 my-app Pod 的所有流量(無論是 Istio 還是其他流量),包括 kubelet 健康檢查探測。根據您的 CNI,kubelet 探測和連結本機位址可能會被此策略忽略,或被其封鎖

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-ingress
spec:
  podSelector:
    matchLabels:
      app.kubernetes.io/name: my-app
  policyTypes:
  - Ingress

一旦 Pod 註冊到 ambient 網格中,健康檢查探測封包將開始透過 SNAT 指派連結本機位址,這表示您的 CNI NetworkPolicy 實作可能會開始封鎖健康檢查探測。若要允許 ambient 健康檢查探測略過 NetworkPolicy,請透過允許將連結本機位址列入允許清單,明確允許從主機節點到您 Pod 的流量,ambient 會使用該位址進行此流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-ingress-allow-kubelet-healthprobes
spec:
  podSelector:
    matchLabels:
      app.kubernetes.io/name: my-app
  ingress:
    - from:
      - ipBlock:
          cidr: 169.254.7.127/32
此資訊是否有用?
您有任何改進建議嗎?

感謝您的回饋!