k8s中的NetworkPolicy使用詳解
在 Kubernetes (k8s) 中,NetworkPolicy 是一種用于控制 Pod 之間網(wǎng)絡(luò)流量的資源對(duì)象,它基于 Pod 標(biāo)簽(Labels)和命名空間(namespace)來(lái)定義網(wǎng)絡(luò)訪問(wèn)規(guī)則,實(shí)現(xiàn)了對(duì) Pod 進(jìn)出流量的精細(xì)化控制。
核心作用
- 隔離網(wǎng)絡(luò)流量:默認(rèn)情況下,k8s 集群中所有 Pod 之間可以自由通信,NetworkPolicy 可限制這種通信,只允許符合規(guī)則的流量通過(guò)。
- 定義訪問(wèn)策略:通過(guò)規(guī)則指定 “哪些 Pod 可以被誰(shuí)訪問(wèn)” 或 “哪些 Pod 可以訪問(wèn)誰(shuí)”。
- 增強(qiáng)安全性:遵循最小權(quán)限原則,只開(kāi)放必要的網(wǎng)絡(luò)訪問(wèn),減少攻擊面。
工作原理
NetworkPolicy 依賴 網(wǎng)絡(luò)插件(CNI) 實(shí)現(xiàn)(如 Calico、Cilium、Weave Net 等),不同插件對(duì)策略的支持可能存在差異。
其核心邏輯是:
- 基于 Pod 標(biāo)簽和命名空間篩選目標(biāo) Pod(策略作用的對(duì)象)。
- 對(duì)目標(biāo) Pod 的入站(Ingress)和出站(Egress)流量定義允許 / 拒絕規(guī)則。
- 規(guī)則匹配的維度包括:源 / 目標(biāo) Pod 標(biāo)簽、命名空間標(biāo)簽、IP 地址段、端口等。
關(guān)鍵概念
Pod 選擇器(podSelector)用于指定策略作用于哪些 Pod(通過(guò)標(biāo)簽匹配)。若為空,則匹配命名空間內(nèi)所有 Pod。
命名空間選擇器(namespaceSelector)用于匹配特定命名空間(通過(guò)標(biāo)簽),常與 podSelector 結(jié)合使用,限定跨命名空間的流量。
入站規(guī)則(Ingress)控制流入目標(biāo) Pod 的流量,可定義:
- 允許的源(來(lái)自哪些 Pod / 命名空間 / IP)。
- 允許的端口和協(xié)議(TCP/UDP/SCTP)。
出站規(guī)則(Egress)控制從目標(biāo) Pod 流出的流量,可定義:
- 允許的目標(biāo)(到哪些 Pod / 命名空間 / IP)。
- 允許的端口和協(xié)議。
默認(rèn)策略
- 若未定義任何 NetworkPolicy,所有流量默認(rèn)允許。
- 若定義了策略,未被規(guī)則允許的流量將被默認(rèn)拒絕。
基本示例
1. 拒絕所有入站流量(默認(rèn)拒絕)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: default
spec:
podSelector: {} # 匹配命名空間內(nèi)所有 Pod
policyTypes:
- Ingress # 只控制入站流量該策略會(huì)拒絕 default 命名空間內(nèi)所有 Pod 的入站流量(無(wú)任何允許規(guī)則)。
2. 允許特定 Pod 訪問(wèn)
假設(shè)有標(biāo)簽為 app: frontend 的 Pod 需要訪問(wèn)標(biāo)簽為 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 訪問(wèn)
ports:
- protocol: TCP
port: 8080 # 只允許 8080 端口3. 允許跨命名空間訪問(wèn)
允許 prod 命名空間(標(biāo)簽 env: prod)中的 Pod 訪問(wèn) 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 只能訪問(wèn) 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 # 允許訪問(wèn)該 IP 段注意事項(xiàng)
- 順序無(wú)關(guān):NetworkPolicy 規(guī)則沒(méi)有優(yōu)先級(jí),只要有一條規(guī)則匹配,流量就會(huì)被允許。
- 命名空間隔離:策略僅作用于所在命名空間的 Pod,跨命名空間需通過(guò)
namespaceSelector配置。 - 狀態(tài)性:部分網(wǎng)絡(luò)插件(如 Calico)支持基于連接狀態(tài)的規(guī)則(如允許已建立的連接)。
- 默認(rèn)策略建議:生產(chǎn)環(huán)境中通常先配置 “默認(rèn)拒絕所有流量”,再按需開(kāi)放必要規(guī)則,即 “白名單模式”。
通過(guò) NetworkPolicy,Kubernetes 實(shí)現(xiàn)了 Pod 級(jí)別的網(wǎng)絡(luò)隔離,是構(gòu)建安全集群網(wǎng)絡(luò)的核心工具之一。實(shí)際使用時(shí)需結(jié)合具體網(wǎng)絡(luò)插件的特性進(jìn)行配置。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
kubernetes日志備份解決ELK中日志丟失問(wèn)題
這篇文章主要為大家介紹了kubernetes日志備份方案的細(xì)節(jié)探究分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
k8s跨服務(wù)調(diào)用入門到實(shí)戰(zhàn)示例詳解
這篇文章主要為大家介紹了k8s跨服務(wù)調(diào)用入門到實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
舉例詳解k8s是如何實(shí)現(xiàn)自動(dòng)擴(kuò)縮的
Kubernetes(簡(jiǎn)稱k8s)是一個(gè)開(kāi)源的,用于自動(dòng)部署、擴(kuò)展和管理容器化應(yīng)用程序的系統(tǒng),這篇文章主要介紹了k8s是如何實(shí)現(xiàn)自動(dòng)擴(kuò)縮的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-07-07
CentOS 7.9 升級(jí)內(nèi)核 kernel-ml-5.6.14版本的方法
這篇文章主要介紹了CentOS 7.9 升級(jí)內(nèi)核 kernel-ml-5.6.14版本,默認(rèn)內(nèi)核版本為3.10.0,現(xiàn)升級(jí)到 5.6.14 版本,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
在AWS-EC2中安裝Minikube集群的詳細(xì)過(guò)程
這篇文章主要介紹了在AWS-EC2中安裝Minikube集群,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
詳解Rainbond云原生平臺(tái)簡(jiǎn)化Kubernetes業(yè)務(wù)問(wèn)題排查
這篇文章主要介紹了詳解Rainbond云原生平臺(tái)簡(jiǎn)化Kubernetes業(yè)務(wù)問(wèn)題排查,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
KVM虛擬化技術(shù)之virt-manager使用及KVM虛擬化平臺(tái)網(wǎng)絡(luò)模型介紹
這篇文章主要介紹了KVM虛擬化技術(shù)之virt-manager使用及KVM虛擬化平臺(tái)網(wǎng)絡(luò)模型介紹,需要的朋友可以參考下2016-10-10

