🛡️ 第31课:网络策略

核心概念

网络策略:零信任网络的基石

默认拒绝所有流量,只允许明确授权的通信。NetworkPolicy是K8s原生的网络访问控制。

零信任网络原则

1. 永远不信任,始终验证
2. 最小权限原则
3. 微分段(Micro-segmentation)
4. 加密所有通信(mTLS)
5. 持续监控和审计

命令实操

1. K8s NetworkPolicy ✅

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-ingressNetworkPolicy
2. 允许必要流量逐条添加allow规则NetworkPolicy
3. DNS出站允许DNS查询NetworkPolicy
4. mTLS启用严格mTLSPeerAuthentication
5. 授权策略精细访问控制AuthorizationPolicy
6. 测试验证逐个服务测试kubectl exec
💡 零信任落地建议:先在staging验证、默认拒绝后逐条放开、给命名空间打标签、每次变更后测试连通性。

🔧 Calico全局网络策略

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、社区动态,保持知识新鲜度。

🔗 相关课程链接

前置课程后续课程关联课程
前几课基础内容下一课深入内容跨领域综合应用
⚠️ 实验环境安全:本课所有命令请在隔离的实验环境中执行,避免在生产环境直接操作。备份重要数据后再进行任何修改操作。

📌 记住:理论+实践=真正的掌握。每个概念都要动手验证,每个命令都要理解原理。