温馨提示×

centos k8s网络策略应用

小樊
32
2025-12-05 22:20:25
栏目: 智能运维

在 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 启用策略
    1. 安装 Calico(示例清单适用于 v3.25,可按需调整版本):
      kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
    2. 确认 Calico 组件运行正常:
      kubectl get pods -n kube-system | grep calico
    3. 后续通过 Kubernetes 的 NetworkPolicy API(networking.k8s.io/v1) 下发策略即可。
  • 方式 B 使用 Flannel 的场景
    Flannel 默认不提供策略能力。若必须使用 Flannel,可叠加 Calico 仅做策略(不替换 Flannel 的 Pod 网络),或改用 Cilium 等原生支持策略的 CNI。
    以上安装与验证步骤以 Calico 为例,Flannel 的能力边界与替代方案说明可参考相应实践。

三 典型网络策略示例

  • 示例 1 默认拒绝并仅放行同命名空间
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: {}   # 作用于本命名空间全部 Pod
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          nsname: linux   # 仅允许带有 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 DNSPodIP:Port
    • 查看 CNI 组件状态:
      kubectl get pods -n kube-system | grep -E “calico|flannel|cilium”
    • 主机侧网络:确认 firewalld/SELinux 未阻断 Pod 网段通信(生产环境不建议直接关闭,应按需放行)。
      以上要点与排查命令覆盖了标签匹配、策略方向、CNI 能力与主机侧网络等关键环节。

0