Kubernetes网络策略实战:使用ahmetb/kubernetes-network-policy-recipes限制应用流量访问
引言:为什么需要Kubernetes网络策略?
在现代微服务架构中,安全性已成为不可忽视的核心要素。随着应用规模的扩大,服务间的网络通信变得日益复杂,传统的网络安全边界逐渐模糊。Kubernetes Network Policies(网络策略)正是为了解决这一痛点而生,它允许您在Pod级别实施精细的网络访问控制。
想象一下这样的场景:您的电商平台数据库不应被前端Web服务器以外的任何服务访问,或者某些敏感的后台管理接口只允许特定IP段的运维人员访问。这些安全需求正是Kubernetes网络策略大显身手的舞台。
通过本文,您将掌握:
- ✅ Kubernetes网络策略的核心概念和工作原理
- ✅ 10+种常见网络策略场景的实战配置
- ✅ 出站(egress)和入站(ingress)流量的精细化控制
- ✅ 多命名空间环境下的网络隔离策略
- ✅ 生产环境中网络策略的最佳实践
网络策略基础概念解析
NetworkPolicy核心组件
关键特性对比表
| 特性 | 描述 | 默认行为 |
|---|---|---|
| podSelector | 选择应用策略的Pod | 空选择器匹配所有Pod |
| ingress | 入站流量规则 | 未指定时允许所有入站流量 |
| egress | 出站流量规则 | 未指定时允许所有出站流量 |
| policyTypes | 策略类型 | 默认为["Ingress"] |
| 规则评估 | 多策略处理 | 策略规则是叠加的(union) |
实战场景一:基础流量控制
1.1 拒绝所有流量到应用
这是网络策略的起点,先黑名单后白名单是最佳实践。
# web-deny-all.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-deny-all
spec:
podSelector:
matchLabels:
app: web
ingress: [] # 空数组表示拒绝所有入站流量
应用场景:
- 初始化安全策略,为后续白名单做准备
- 临时隔离故障服务进行调试
- 保护敏感应用免受未经授权的访问
1.2 限制流量到特定应用
只允许带有特定标签的Pod访问目标应用。
# api-allow.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: api-allow
spec:
podSelector:
matchLabels:
app: bookstore
role: api
ingress:
- from:
- podSelector:
matchLabels:
app: bookstore # 只允许同应用的Pod访问
实战场景二:命名空间级别的网络隔离
2.1 拒绝其他命名空间的流量
# deny-other-namespaces.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-other-namespaces
spec:
podSelector: {} # 应用到所有Pod
ingress:
- from:
- podSelector: {} # 只允许同一命名空间内的Pod
2.2 允许特定命名空间的访问
# allow-production-namespace.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-production-access
spec:
podSelector:
matchLabels:
app: database
ingress:
- from:
- namespaceSelector:
matchLabels:
environment: production # 只允许生产环境命名空间
实战场景三:外部流量控制
3.1 允许外部客户端访问
# web-allow-external.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-external
spec:
podSelector:
matchLabels:
app: web
ingress:
- {} # 空对象表示允许所有来源
3.2 限制外部访问端口
# web-allow-external-port80.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-external-port80
spec:
podSelector:
matchLabels:
app: web
ingress:
- ports:
- port: 80
protocol: TCP
实战场景四:出站(egress)流量控制
4.1 拒绝所有出站流量
# deny-all-egress.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-all-egress
spec:
podSelector:
matchLabels:
app: secure-app
policyTypes:
- Egress
egress: [] # 空数组拒绝所有出站流量
4.2 允许DNS解析的出站策略
# allow-dns-egress.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-dns-egress
spec:
podSelector:
matchLabels:
app: restricted-app
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- port: 53
protocol: UDP
- port: 53
protocol: TCP
高级场景:多选择器和端口控制
5.1 使用多个选择器
# multi-selector-policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: multi-selector-policy
spec:
podSelector:
matchLabels:
app: critical-api
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
namespaceSelector:
matchLabels:
environment: production
- podSelector:
matchLabels:
app: backend
ports:
- port: 8080
protocol: TCP
5.2 端口级别的精细控制
# port-specific-policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: port-specific-policy
spec:
podSelector:
matchLabels:
app: multi-port-service
ingress:
- from:
- podSelector:
matchLabels:
app: web-client
ports:
- port: 80
protocol: TCP
- from:
- podSelector:
matchLabels:
app: admin-client
ports:
- port: 8080
protocol: TCP
- port: 8443
protocol: TCP
网络策略最佳实践指南
6.1 策略设计原则
| 原则 | 描述 | 示例 |
|---|---|---|
| 最小权限 | 只授予必要的访问权限 | 数据库只允许应用服务器访问 |
| 防御纵深 | 多层安全策略叠加 | 命名空间隔离+应用级别策略 |
| 明确拒绝 | 先拒绝所有,再按需允许 | 初始策略设置为ingress: [] |
| 标签一致性 | 使用一致的标签策略 | app, environment, tier标签 |
6.2 策略部署流程
6.3 常见陷阱与解决方案
陷阱1:DNS解析失败
# 错误配置:忘记允许DNS流量
egress: [] # 这会阻止Pod解析域名
# 正确配置:允许DNS流量
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- port: 53
protocol: UDP
- port: 53
protocol: TCP
陷阱2:策略规则冲突
# 策略A:允许所有流量
ingress:
- {}
# 策略B:拒绝某些流量
ingress: []
# 结果:策略A优先,允许所有流量
# 解决方案:使用更具体的选择器
实战演练:电商平台网络策略设计
7.1 架构概述
假设我们有一个典型的电商平台,包含以下组件:
- 前端Web服务 (app=web, tier=frontend)
- 商品API服务 (app=product-api, tier=backend)
- 用户API服务 (app=user-api, tier=backend)
- 订单数据库 (app=order-db, tier=database)
7.2 分层策略配置
数据库层策略:
# order-db-policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: order-db-isolation
namespace: database
spec:
podSelector:
matchLabels:
app: order-db
ingress:
- from:
- podSelector:
matchLabels:
app: order-api
namespaceSelector:
matchLabels:
environment: production
ports:
- port: 5432
protocol: TCP
API层策略:
# api-layer-policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: api-layer-protection
namespace: backend
spec:
podSelector:
matchLabels:
tier: backend
ingress:
- from:
- podSelector:
matchLabels:
tier: frontend
namespaceSelector:
matchLabels:
environment: production
- podSelector:
matchLabels:
app: monitoring-agent
namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: monitoring
监控与调试技巧
8.1 策略验证命令
# 查看当前命名空间的所有网络策略
kubectl get networkpolicies
# 查看特定网络策略的详细信息
kubectl describe networkpolicy <policy-name>
# 测试网络连通性
kubectl run test-pod --rm -it --image=alpine -- sh
# 在测试Pod中执行:
wget -qO- --timeout=2 http://target-service
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



