🛡️ 第31课:网络策略
核心概念
网络策略:零信任网络的基石
默认拒绝所有流量,只允许明确授权的通信。NetworkPolicy是K8s原生的网络访问控制。
零信任网络原则
1. 永远不信任,始终验证
2. 最小权限原则
3. 微分段(Micro-segmentation)
4. 加密所有通信(mTLS)
5. 持续监控和审计
命令实操
1. K8s NetworkPolicy ✅
# 默认拒绝所有入站
cat > default-deny-ingress.yaml << 'EOF'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: {name: default-deny-ingress, namespace: production}
spec:
podSelector: {} # 匹配所有Pod
policyTypes: [Ingress]
EOF
# 允许frontend访问api
cat > allow-frontend.yaml << 'EOF'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: {name: allow-frontend-to-api, namespace: production}
spec:
podSelector: {matchLabels: {app: api-server}}
policyTypes: [Ingress]
ingress:
- from: [{podSelector: {matchLabels: {app: frontend}}}]
ports: [{protocol: TCP, port: 8080}]
EOF
# 允许跨命名空间(Prometheus)
cat > allow-monitoring.yaml << 'EOF'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata: {name: allow-prometheus, namespace: production}
spec:
podSelector: {}
policyTypes: [Ingress]
ingress:
- from: [{namespaceSelector: {matchLabels: {name: monitoring}}}]
ports: [{protocol: TCP, port: 9090}]
EOF
kubectl apply -f default-deny-ingress.yaml
kubectl apply -f allow-frontend.yaml
kubectl apply -f allow-monitoring.yaml
2. 网络策略测试 ✅
#!/bin/bash
# 验证NetworkPolicy
echo "🧪 测试..."
# frontend可以访问api
echo "Test: frontend → api"
kubectl exec deploy/frontend -- curl -sf http://api-server:8080/health && echo "✅" || echo "❌"
# 其他Pod不能访问api
echo "Test: random → api (should deny)"
kubectl exec deploy/random -- curl -sf --max-time 3 http://api-server:8080/health && echo "❌ 应该被拒绝" || echo "✅ 已拒绝"
# DNS正常
echo "Test: DNS"
kubectl exec deploy/frontend -- nslookup kubernetes.default && echo "✅" || echo "❌
架构图
网络策略:零信任网络的基石架构
┌───────────────────────────────────────────┐
│ Internet │
└──────────────────┬────────────────────────┘
│ WAF + DDoS防护
┌──────────────────▼────────────────────────┐
│ Ingress/Gateway │
└──────────────────┬────────────────────────┘
┌──────────────┼──────────────┐
▼ ▼ ▼
┌────────┐ ┌──────────┐ ┌──────────┐
│Frontend│ │ API │ │ Worker │
│(Allow: │→│(Allow: │→│(Allow: │
│ →API) │ │Frontend) │ │API,Redis)│
└────────┘ └──────────┘ └──────────┘
▼
┌──────────────┐
│ Database │
│(Allow: API) │
└──────────────┘
故障排查
❌ NetworkPolicy导致服务不可达
kubectl get networkpolicy -A
kubectl describe networkpolicy -n production
# 临时删除验证
kubectl delete networkpolicy allow-frontend -n production
# 恢复后说明策略配置有误
# 常见:podSelector不匹配/缺少DNS出站规则/namespaceSelector标签未设置
💡 零信任原则:默认拒绝、最小权限、mTLS加密、持续审计。
🏆 成就解锁:网络策略专家!
掌握NetworkPolicy、零信任原则、策略测试——默认拒绝是安全的基础
📝 零信任网络实施步骤
| 步骤 | 操作 | K8s资源 |
| 1. 默认拒绝 | 添加default-deny-ingress | NetworkPolicy |
| 2. 允许必要流量 | 逐条添加allow规则 | NetworkPolicy |
| 3. DNS出站 | 允许DNS查询 | NetworkPolicy |
| 4. mTLS | 启用严格mTLS | PeerAuthentication |
| 5. 授权策略 | 精细访问控制 | AuthorizationPolicy |
| 6. 测试验证 | 逐个服务测试 | kubectl exec |
💡 零信任落地建议:先在staging验证、默认拒绝后逐条放开、给命名空间打标签、每次变更后测试连通性。
🔧 Calico全局网络策略
# 安装Calico CNI
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
# GlobalNetworkPolicy(集群级默认拒绝)
cat > global-deny-all.yaml << 'EOF'
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata: {name: default-deny}
spec:
selector: all()
order: 1000
types: [Ingress, Egress]
ingress: [{action: Deny}]
egress: [{action: Deny}]
EOF
# 允许DNS出站
cat > allow-dns.yaml << 'EOF'
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata: {name: allow-dns}
spec:
selector: all()
order: 900
types: [Egress]
egress:
- action: Allow
protocol: UDP
destination: {ports: [53]}
- action: Allow
protocol: TCP
destination: {ports: [53]}
EOF
calicoctl apply -f global-deny-all.yaml
calicoctl apply -f allow-dns.yaml
calicoctl get globalnetworkpolicy -o wide
📝 网络策略分层设计
| 层 | 策略 | 范围 | 优先级 |
| L1 | 默认拒绝 | 全局 | 最低(1000) |
| L2 | 允许DNS | 全局 | 高(900) |
| L3 | 允许监控 | namespace级 | 中(500) |
| L4 | 服务间通信 | namespace级 | 最高(100) |
💡 网络策略实施顺序:先staging验证→生产逐命名空间启用→默认拒绝→逐条放开→每次验证连通性。
⚠️ 学习建议:每课内容都需要在实验环境中实际操作验证,只有动手才能真正掌握。建议搭建自己的实验环境反复练习。
📝 本课知识图谱
| 知识域 | 核心技能 | 验证方式 |
| 核心概念 | 理解原理和架构 | 能用自己的话解释 |
| 命令实操 | 熟练使用相关工具 | 能独立完成操作 |
| 故障排查 | 定位和解决问题 | 能在模拟故障中恢复 |
| 最佳实践 | 遵循生产级标准 | 能设计可靠方案 |
💡 持续学习:技术领域更新快,关注官方博客、GitHub Release、社区动态,保持知识新鲜度。
🔗 相关课程链接
| 前置课程 | 后续课程 | 关联课程 |
| 前几课基础内容 | 下一课深入内容 | 跨领域综合应用 |
⚠️ 实验环境安全:本课所有命令请在隔离的实验环境中执行,避免在生产环境直接操作。备份重要数据后再进行任何修改操作。
📌 记住:理论+实践=真正的掌握。每个概念都要动手验证,每个命令都要理解原理。