<返回目录     Powered by claud/xia兄

第11课: 网络策略

Pod间通信控制、网络安全策略的配置与最佳实践

学习目标

网络策略的基本概念

网络策略(Network Policy)是Kubernetes中用于控制Pod间通信的资源。通过网络策略,你可以:

网络策略工作原理

Pod → 网络策略规则 → 流量过滤 → 允许/拒绝通信

网络策略的核心概念

1. 选择器(Selectors)

作用:指定网络策略应用于哪些Pod。

2. 规则类型

3. 流量规则

网络策略配置示例

示例1:基本的入站流量控制

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-specific-ingress
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: web
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 80

示例2:同时控制入站和出站流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: control-both-ways
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: database
    ports:
    - protocol: TCP
      port: 5432
  - to:
    - ipBlock:
        cidr: 8.8.8.8/32
    ports:
    - protocol: UDP
      port: 53

示例3:基于命名空间的流量控制

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: namespace-isolation
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: sensitive
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          purpose: production
    ports:
    - protocol: TCP
      port: 443

示例4:默认拒绝所有流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: default
spec:
  podSelector:
  policyTypes:
  - Ingress
  - Egress

---

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns
  namespace: default
spec:
  podSelector:
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system
    ports:
    - protocol: UDP
      port: 53
    - protocol: TCP
      port: 53

命令行操作

# 查看网络策略
kubectl get networkpolicies
kubectl get networkpolicies -n <namespace>

# 查看网络策略详情
kubectl describe networkpolicy <policy-name>

# 创建网络策略
kubectl apply -f network-policy.yaml

# 删除网络策略
kubectl delete networkpolicy <policy-name>

# 测试网络策略
# 使用curl测试Pod间通信
kubectl exec -it <source-pod> -- curl <target-pod-ip>:<port>

# 查看Pod的IP地址
kubectl get pods -o wide
最佳实践:

常见问题与解决方案

问题1:网络策略不生效

可能原因:Kubernetes集群未安装支持网络策略的CNI插件(如Calico、Cilium等)

解决方案:安装支持网络策略的CNI插件

问题2:Pod无法访问DNS服务

可能原因:网络策略阻止了DNS流量

解决方案:添加允许访问DNS服务的egress规则

问题3:网络策略过于复杂难以维护

可能原因:规则设计不合理

解决方案:使用标签组织Pod,简化网络策略规则

实践练习

练习任务:
  1. 基础练习:创建一个简单的网络策略,控制两个Pod之间的通信
  2. 进阶练习:为一个多服务应用配置完整的网络策略,包括前端、后端和数据库
  3. 挑战练习:实现命名空间级别的网络隔离,只允许特定命名空间的Pod访问
  4. 综合练习:设计并实现一个符合零信任原则的网络安全策略

总结

网络策略是Kubernetes中实现网络安全的重要工具,通过合理配置网络策略,可以:

在实际应用中,需要根据应用的架构和安全需求,设计并实现合适的网络策略。网络策略的设计应该遵循最小权限原则,只允许必要的流量,同时确保应用的正常运行。