kubeadm初始化Master节点并加入Worker节点(参考kubeadm init和kubeadm join命令),确保集群正常运行。kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml安装;NetworkPolicy资源,否则策略无法生效。matchLabels: {app: backend}),空选择器表示当前命名空间内所有Pod;Ingress(控制入站流量)、Egress(控制出站流量)或两者组合;from(流量来源,如Pod标签、命名空间、IP段)和ports(允许的端口/协议);to(流量目标,如IP段、Pod标签)和ports(允许的端口/协议)。默认拒绝所有入站流量(基础隔离)
通过空podSelector匹配当前命名空间内所有Pod,仅允许显式定义的流量通过,防止未授权访问。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: default
spec:
podSelector: {} # 匹配所有Pod
policyTypes:
- Ingress # 仅控制入站流量
应用后,所有未明确允许的入站流量将被拒绝。
允许特定Pod间通信(微服务隔离)
允许带有app: frontend标签的Pod访问带有app: backend标签的Pod的8080端口(TCP),实现前后端服务的安全通信。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: default
spec:
podSelector:
matchLabels:
app: backend # 作用于后端Pod
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend # 来自前端Pod
ports:
- protocol: TCP
port: 8080
该策略确保只有前端服务能访问后端服务,其他Pod无法访问。
限制出站流量到特定IP段(数据安全)
允许带有app: db标签的Pod访问外部10.0.0.0/24网段的3306端口(MySQL),防止数据库Pod访问无关外部服务,降低数据泄露风险。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-db-to-external
namespace: default
spec:
podSelector:
matchLabels:
app: db # 作用于数据库Pod
policyTypes:
- Egress # 仅控制出站流量
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24 # 允许的IP段
ports:
- protocol: TCP
port: 3306
适用于需要限制数据库访问外部IP的场景。
组合策略(入站+出站)
允许带有app: user-service标签的Pod:
app: frontend的Pod的80端口(TCP)流量;192.168.1.0/24网段的443端口(HTTPS)。apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: combined-policy
namespace: default
spec:
podSelector:
matchLabels:
app: user-service # 作用于用户服务Pod
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend # 入站来源
ports:
- protocol: TCP
port: 80
egress:
- to:
- ipBlock:
cidr: 192.168.1.0/24 # 出站目标
ports:
- protocol: TCP
port: 443
适用于需要同时控制入站和出站流量的复杂场景。
kubectl apply命令部署:kubectl apply -f <policy-file>.yaml
kubectl get networkpolicies -n <namespace>
kubectl run test-pod --image=busybox -it --rm --restart=Never -- sh
app: backend的8080端口):wget -qO- http://<backend-pod-ip>:8080
app: frontend、env: production),便于策略的精准匹配(如通过app: frontend选择前端Pod)。kubectl get networkpolicies查看策略覆盖率,结合监控工具(如Prometheus)监控策略匹配的流量日志,及时调整策略(如删除未使用的规则)。