K8s 中如何配置网络策略(NetworkPolicy)?
初始化 Kubernetes 集群时,需指定 Pod 网络 CIDR,并确保 CNI 插件已正确安装。是实现 Pod 之间网络隔离和访问控制的关键手段。以下是详细的配置步骤和示例,帮助你快速上手。同一命名空间下的多个 NetworkPolicy 会叠加生效,最终效果是所有策略的交集。如果需要更复杂的场景(如动态策略更新、可视化监控),可结合。在 Kubernetes 中配置。以下是一个简单的示例,
·
在 Kubernetes 中配置 NetworkPolicy 是实现 Pod 之间网络隔离和访问控制的关键手段。以下是详细的配置步骤和示例,帮助你快速上手。
一、配置前提条件
-
网络插件支持
NetworkPolicy 必须依赖支持其功能的 CNI 插件,例如:- Calico(推荐,功能全面)
- Cilium
- Weave Net
- Azure NPM(Azure 环境)
- Flannel(不支持 NetworkPolicy,需搭配其他插件)
-
集群初始化
初始化 Kubernetes 集群时,需指定 Pod 网络 CIDR,并确保 CNI 插件已正确安装。
二、配置步骤
1. 安装 Calico 网络插件(推荐)
# 安装 Calico(以 v3.25 版本为例)
kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
2. 编写 NetworkPolicy YAML 文件
以下是一个简单的示例,允许 default 命名空间中标签为 app=web 的 Pod 被 app=client 的 Pod 访问 80 端口:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: web-access-policy
namespace: default
spec:
podSelector:
matchLabels:
app: web
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: client
ports:
- protocol: TCP
port: 80
3. 应用 NetworkPolicy
kubectl apply -f web-access-policy.yaml
4. 验证 NetworkPolicy
# 查看已应用的 NetworkPolicy
kubectl get networkpolicy -n default
# 检查策略详细信息
kubectl describe networkpolicy web-access-policy -n default
三、典型配置示例
1. 允许同一命名空间内所有 Pod 通信
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector: {}
egress:
- to:
- podSelector: {}
2. 限制出站流量到特定 IP 段
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-egress
namespace: default
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5432
3. 禁止其他命名空间访问当前命名空间的 Pod
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-external
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {}
四、验证与测试
1. 创建测试 Pod
# 创建客户端 Pod
kubectl run client --image=busybox --labels=app=client -- sleep 3600
# 创建目标 Pod
kubectl run web --image=nginx --labels=app=web -- sleep 3600
2. 测试通信
# 进入客户端 Pod 并尝试访问目标 Pod
kubectl exec -it client -- sh
wget http://web.default.svc.cluster.local
3. 故障排查
- 检查策略是否生效:
kubectl describe networkpolicy web-access-policy -n default - 检查 Calico 日志:
kubectl logs -n kube-system -l k8s-app=calico-node
五、注意事项
-
默认策略行为
- 如果未定义
policyTypes,默认仅控制 Ingress 流量。 - 若需控制 Egress 流量,必须显式声明
policyTypes: [Egress]。
- 如果未定义
-
标签选择器的匹配规则
podSelector和namespaceSelector支持标签匹配(如matchLabels或matchExpressions)。- 多个
from/to条件通过逻辑 OR 组合,同一条规则内的条件通过逻辑 AND 组合。
-
多策略叠加
同一命名空间下的多个 NetworkPolicy 会叠加生效,最终效果是所有策略的交集。
六、场景化配置建议
1. 多租户隔离
- 需求:不同团队的 Pod 不能互相访问。
- 配置:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: tenant-isolation namespace: team-a spec: podSelector: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: tenant: team-a
2. 保护敏感服务
- 需求:数据库 Pod 仅允许特定前端服务访问。
- 配置:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: db-protect namespace: default spec: podSelector: matchLabels: role: db policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379
七、总结
- NetworkPolicy 是 Kubernetes 的核心安全机制,通过标签选择器和规则定义,实现细粒度的网络访问控制。
- 选择支持 NetworkPolicy 的 CNI 插件(如 Calico)是配置成功的关键。
- 合理设计标签和策略规则,可以有效隔离服务、保护敏感数据,并提升集群安全性。
如果需要更复杂的场景(如动态策略更新、可视化监控),可结合 Cilium 或 Azure NPM 等高级功能。
更多推荐


所有评论(0)