启用Calico的Minikube集群中NetworkPolicy未生效问题
问题原因分析与解决
问题场景
已在Minikube上部署Calico并验证状态正常,在ns1、ns2、ns3三个命名空间中部署了Nginx Deployment,所有Pod均处于Running状态。在ns3中创建了如下NetworkPolicy:
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-ns2 namespace: ns3 spec: podSelector: matchLabels: environment: test policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: permission: allowed
执行kubectl describe networkpolicy -n ns3确认策略已应用,但ns2中的Pod仍能正常访问ns3的Pod,未被拦截。
核心原因
- PodSelector未匹配目标Pod:你的NetworkPolicy通过
podSelector.matchLabels.environment: test筛选要管控的Pod,但从kubectl get pods -A的输出可见,ns3下的Nginx Pod并没有environment=test标签,导致该策略根本没有作用到任何ns3的Pod上。 - Calico默认流量规则:Calico默认允许所有Pod间的流量通行,当NetworkPolicy未匹配到目标Pod时,不会对这些Pod的流量做任何限制。
解决步骤
给ns3的Pod添加匹配标签
直接为已运行的Pod添加标签:kubectl label pods -n ns3 new-deploy-7c577ddf69-hvnkb new-deploy-7c577ddf69-s92q5 environment=test或修改
ns3的Nginx Deployment模板,在Pod模板中添加environment: test标签,确保后续新建Pod自动继承该标签。调整NetworkPolicy规则(按需选择)
如果需求是拒绝ns2访问ns3所有Pod,可修改策略为:kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-ns2 namespace: ns3 spec: podSelector: {} # 匹配ns3下所有Pod policyTypes: - Ingress ingress: - from: - namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: NotIn values: - ns2
内容的提问来源于stack exchange,提问作者i'i'i'i'i'i'i'i'i'i'i'i
相关产品推荐
相关产品推荐

