1. Kubernetes集群网络策略概述
在Kubernetes生产环境中,网络策略(NetworkPolicy)是保障集群安全的关键防线。它就像数据中心里的防火墙规则,精确控制着Pod之间的通信流量。我见过太多因为网络策略配置不当导致的安全事件——从简单的服务间异常调用到严重的横向渗透攻击。
网络策略通过标签选择器(Label Selector)定义规则,能够实现以下核心功能:
- 控制Pod的入站(Ingress)和出站(Egress)流量
- 基于命名空间、Pod标签、IP段等维度进行精细化管理
- 与CNI插件(如Calico、Cilium)协同工作,提供L3-L4层的访问控制
重要提示:网络策略是白名单机制,未匹配任何策略的Pod默认允许所有流量,但一旦命名空间中存在任何NetworkPolicy,就会进入"默认拒绝"模式
2. 网络策略核心组件解析
2.1 策略规则结构解剖
一个标准的NetworkPolicy资源包含以下关键字段:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-access-policy
spec:
podSelector:
matchLabels:
role: database
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 3306
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 53
各字段作用说明:
podSelector:策略适用的目标Pod(本例选择带有role=database标签的Pod)policyTypes:声明策略类型(Ingress/Egress)ingress/egress:具体规则,支持podSelector、namespaceSelector、ipBlock三种匹配方式
2.2 策略匹配优先级
当多个策略作用于同一个Pod时,规则评估遵循以下原则:
- 所有策略的
ingress.from和egress.to条件取并集 - 如果任一策略允许某个连接,则该连接被允许
- 空值的
from/to字段匹配所有来源/目标
3. 生产环境最佳实践
3.1 分层防御策略设计
根据我在金融行业的实施经验,推荐采用分层防御模型:
- 命名空间隔离层
yaml复制# 拒绝所有跨命名空间流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-cross-ns
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector: {}
egress:
- to:
- podSelector: {}
- 应用间访问层
yaml复制# 只允许frontend访问backend的8080端口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: frontend-to-backend
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- port: 8080
- 外部访问层
yaml复制# 只允许特定IP访问监控接口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: external-access
spec:
podSelector:
matchLabels:
app: monitoring
ingress:
- from:
- ipBlock:
cidr: 203.0.113.0/24
ports:
- port: 9090
3.2 关键配置技巧
- DNS访问控制
yaml复制# 允许Pod访问集群DNS
egress:
- to:
- namespaceSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
- 节点网络访问
yaml复制# 允许访问节点默认端口范围
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
portRange: 30000-32767
- 多租户隔离方案
yaml复制# 租户A只能访问自己的服务
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant-a-isolation
spec:
podSelector:
matchLabels:
tenant: a
ingress:
- from:
- podSelector:
matchLabels:
tenant: a
4. 常见问题排查指南
4.1 策略不生效排查流程
-
确认CNI插件支持NetworkPolicy
bash复制kubectl get pod -n kube-system | grep -E 'calico|cilium' -
检查策略是否应用到目标Pod
bash复制
kubectl get networkpolicy --all-namespaces kubectl describe networkpolicy <policy-name> -
验证Pod标签匹配
bash复制
kubectl get pod --show-labels -
使用网络诊断工具
bash复制# 在源Pod执行 kubectl exec -it <pod-name> -- nc -zv <target-ip> <port>
4.2 性能优化建议
- 避免使用大量小规模策略(建议合并相关规则)
- IPBlock规则比podSelector性能更好
- 在Calico中启用EndpointSlices
yaml复制apiVersion: projectcalico.org/v3 kind: FelixConfiguration metadata: name: default spec: bpfEnabled: true
5. 高级应用场景
5.1 服务网格集成
当与Istio等服务网格配合使用时,需要注意:
- 网络策略作用于L3/L4层,服务网格控制L7层
- 推荐策略:
yaml复制# 只允许istio-proxy通信 ingress: - from: - podSelector: matchLabels: istio: ingressgateway
5.2 混合云网络策略
跨云场景下的配置要点:
yaml复制egress:
- to:
- ipBlock:
cidr: 192.168.0.0/16 # 本地IDC网段
ports:
- port: 443
5.3 策略即代码实践
使用工具自动化策略管理:
-
Gatekeeper策略模板
yaml复制apiVersion: templates.gatekeeper.sh/v1beta1 kind: ConstraintTemplate metadata: name: k8srequirednetworkpolicy spec: targets: - target: admission.k8s.gatekeeper.sh rego: | package k8srequirednetworkpolicy violation[{"msg": msg}] { not input.review.object.kind == "NetworkPolicy" msg := "All namespaces must have a NetworkPolicy" } -
Terraform管理示例
hcl复制resource "kubernetes_network_policy" "example" { metadata { name = "terraform-example" namespace = kubernetes_namespace.example.metadata[0].name } spec { pod_selector { match_labels = { app = "myapp" } } ingress { from { pod_selector { match_labels = { role = "frontend" } } } } } }
6. 安全加固建议
-
默认拒绝所有流量
yaml复制apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-all spec: podSelector: {} policyTypes: - Ingress - Egress -
审计现有网络流量
bash复制# 使用Cilium Hubble观察流量 hubble observe --follow --type drop -
定期策略评审
- 检查未使用的策略
- 验证策略与实际流量模式的匹配度
- 使用kube-bench检查安全配置
经验之谈:每次集群升级后,务必验证网络策略是否仍然生效。我曾遇到过Kubernetes版本升级导致Calico策略失效的情况,原因是API版本变更。
