k8s中的NetworkPolicy使用詳解
在 Kubernetes (k8s) 中,NetworkPolicy 是一種用于控制 Pod 之間網絡流量的資源對象,它基于 Pod 標簽(Labels)和命名空間(namespace)來定義網絡訪問規(guī)則,實現(xiàn)了對 Pod 進出流量的精細化控制。
核心作用
- 隔離網絡流量:默認情況下,k8s 集群中所有 Pod 之間可以自由通信,NetworkPolicy 可限制這種通信,只允許符合規(guī)則的流量通過。
- 定義訪問策略:通過規(guī)則指定 “哪些 Pod 可以被誰訪問” 或 “哪些 Pod 可以訪問誰”。
- 增強安全性:遵循最小權限原則,只開放必要的網絡訪問,減少攻擊面。
工作原理
NetworkPolicy 依賴 網絡插件(CNI) 實現(xiàn)(如 Calico、Cilium、Weave Net 等),不同插件對策略的支持可能存在差異。
其核心邏輯是:
- 基于 Pod 標簽和命名空間篩選目標 Pod(策略作用的對象)。
- 對目標 Pod 的入站(Ingress)和出站(Egress)流量定義允許 / 拒絕規(guī)則。
- 規(guī)則匹配的維度包括:源 / 目標 Pod 標簽、命名空間標簽、IP 地址段、端口等。
關鍵概念
Pod 選擇器(podSelector)用于指定策略作用于哪些 Pod(通過標簽匹配)。若為空,則匹配命名空間內所有 Pod。
命名空間選擇器(namespaceSelector)用于匹配特定命名空間(通過標簽),常與 podSelector 結合使用,限定跨命名空間的流量。
入站規(guī)則(Ingress)控制流入目標 Pod 的流量,可定義:
- 允許的源(來自哪些 Pod / 命名空間 / IP)。
- 允許的端口和協(xié)議(TCP/UDP/SCTP)。
出站規(guī)則(Egress)控制從目標 Pod 流出的流量,可定義:
- 允許的目標(到哪些 Pod / 命名空間 / IP)。
- 允許的端口和協(xié)議。
默認策略
- 若未定義任何 NetworkPolicy,所有流量默認允許。
- 若定義了策略,未被規(guī)則允許的流量將被默認拒絕。
基本示例
1. 拒絕所有入站流量(默認拒絕)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: default
spec:
podSelector: {} # 匹配命名空間內所有 Pod
policyTypes:
- Ingress # 只控制入站流量該策略會拒絕 default 命名空間內所有 Pod 的入站流量(無任何允許規(guī)則)。
2. 允許特定 Pod 訪問
假設有標簽為 app: frontend 的 Pod 需要訪問標簽為 app: backend 的 Pod(端口 8080):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-allow-frontend
namespace: default
spec:
podSelector:
matchLabels:
app: backend # 策略作用于 backend Pod
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend # 允許 frontend Pod 訪問
ports:
- protocol: TCP
port: 8080 # 只允許 8080 端口3. 允許跨命名空間訪問
允許 prod 命名空間(標簽 env: prod)中的 Pod 訪問 default 命名空間中 app: db 的 Pod(端口 5432):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-allow-prod
namespace: default
spec:
podSelector:
matchLabels:
app: db
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
env: prod # 匹配 prod 命名空間
ports:
- protocol: TCP
port: 54324. 控制出站流量
限制 app: backend 的 Pod 只能訪問 app: db 的 Pod(端口 5432)和外部 IP 段 10.0.0.0/24:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-egress-policy
namespace: default
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
app: db
ports:
- protocol: TCP
port: 5432
- to:
- ipBlock:
cidr: 10.0.0.0/24 # 允許訪問該 IP 段注意事項
- 順序無關:NetworkPolicy 規(guī)則沒有優(yōu)先級,只要有一條規(guī)則匹配,流量就會被允許。
- 命名空間隔離:策略僅作用于所在命名空間的 Pod,跨命名空間需通過
namespaceSelector配置。 - 狀態(tài)性:部分網絡插件(如 Calico)支持基于連接狀態(tài)的規(guī)則(如允許已建立的連接)。
- 默認策略建議:生產環(huán)境中通常先配置 “默認拒絕所有流量”,再按需開放必要規(guī)則,即 “白名單模式”。
通過 NetworkPolicy,Kubernetes 實現(xiàn)了 Pod 級別的網絡隔離,是構建安全集群網絡的核心工具之一。實際使用時需結合具體網絡插件的特性進行配置。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
StatefulSet的每個Pod單獨創(chuàng)建Service實踐
本文介紹了如何為StatefulSet的每個Pod創(chuàng)建獨立的Service,并提供了一個示例腳本,以批量生成Service定義,通過這種方式,可以實現(xiàn)從集群外部訪問每個Pod的功能,并且可以根據(jù)需要配置不同的Service類型(如NodePort、LoadBalancer、ClusterIP+Ingress等)2026-01-01
K8S下http請求在ingress和nginx間無限循環(huán)的問題及解決
文章描述了UAT環(huán)境中因Nginx與IngressController代理循環(huán)導致400錯誤的排查過程,發(fā)現(xiàn)proxy_set_header Host配置引發(fā)Host頭攜帶Nginx域名,導致請求反復轉發(fā),最終X-Forwarded-For頭溢出,解決方法是移除該配置2025-07-07

