在 CentOS 上落地 Kubernetes 网络策略的完整流程
一 前置条件与网络插件选择
- 操作系统与组件:在 CentOS 上部署 Kubernetes(如 kubeadm 方式),并安装 kubelet/kubectl/kubeadm。初始化集群时建议指定 Pod 网段,例如:10.244.0.0/16。
- 网络插件:网络策略由 CNI 插件实现,常用有 Calico、Flannel、Weave、Cilium。其中 Flannel 默认不启用网络策略,若需策略能力请选择 Calico/Cilium 等支持 NetworkPolicy 的插件。
- 验证插件就绪:安装后确认对应 DaemonSet 已 Running,例如查看 Calico 的 Pod 状态。
以上步骤与选择要点可参考在 CentOS 上部署与验证 Kubernetes 网络及网络策略的实操示例。
二 启用网络策略的两种方式
- 方式 A(推荐)使用 Calico 启用策略
- 安装 Calico(示例清单适用于 v3.25,可按需调整版本):
kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
- 确认 Calico 组件运行正常:
kubectl get pods -n kube-system | grep calico
- 后续通过 Kubernetes 的 NetworkPolicy API(networking.k8s.io/v1) 下发策略即可。
- 方式 B 使用 Flannel 的场景
Flannel 默认不提供策略能力。若必须使用 Flannel,可叠加 Calico 仅做策略(不替换 Flannel 的 Pod 网络),或改用 Cilium 等原生支持策略的 CNI。
以上安装与验证步骤以 Calico 为例,Flannel 的能力边界与替代方案说明可参考相应实践。
三 典型网络策略示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
namespace: example-namespace
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector: {}
egress:
- to:
- podSelector: {}
- 示例 2 按标签放行入站到 Nginx 的 80/TCP
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-nginx-ingress
namespace: example-namespace
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
access: "true"
ports:
- protocol: TCP
port: 80
- 示例 3 按命名空间放行入站(跨命名空间访问控制)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-specific-ns
namespace: python
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
nsname: linux
ports:
- protocol: TCP
port: 8080
- 应用与验证
- 应用策略:kubectl apply -f <file.yaml>
- 验证连通:在具备 access=true 标签的 Pod 内访问目标服务(如 http://pod2.example-namespace.svc.cluster.local 或 :80),未匹配策略的流量应被拒绝。
以上示例覆盖了同命名空间默认放行、按标签放行、按命名空间放行等常见场景,可直接用于验证与落地。
四 验证与排错要点
- 策略未生效的常见原因
- 使用的 CNI 不支持策略(如 Flannel 默认不支持)。
- 目标 Pod 未被任何 podSelector 命中(默认对所有 Pod 生效需使用空选择器 {})。
- 未为 Namespace 打上策略中使用的标签(如 nsname=linux)。
- 策略类型未包含 Ingress/Egress,或未对相应方向做放行。
- 快速排查清单
- 查看策略与生效范围:
kubectl get networkpolicy -A
kubectl describe networkpolicy -n
- 查看 Pod 标签与 Namespace 标签是否匹配策略:
kubectl get pod -n --show-labels
kubectl get ns --show-labels
- 连通性测试:在源 Pod 内使用 curl/wget 访问目标 Service DNS 或 PodIP:Port。
- 查看 CNI 组件状态:
kubectl get pods -n kube-system | grep -E “calico|flannel|cilium”
- 主机侧网络:确认 firewalld/SELinux 未阻断 Pod 网段通信(生产环境不建议直接关闭,应按需放行)。
以上要点与排查命令覆盖了标签匹配、策略方向、CNI 能力与主机侧网络等关键环节。