温馨提示×

Debian部署Kubernetes的网络策略设置

小樊
40
2025-12-19 02:11:40
栏目: 智能运维

Debian 上部署 Kubernetes 的网络策略设置

一 前提条件与组件选择

  • Debian 上部署 Kubernetes 网络策略,需先完成集群初始化与 CNI 网络插件安装。常见组合为 kubeadm + containerd + Calico/Cilium;若使用 Flannel,请注意其默认不实现 NetworkPolicy,需改用支持策略的插件或叠加方案。初始化时建议显式设置 Pod 网络 CIDR(如 10.244.0.0/16),便于与插件配置一致。系统层面需开启内核转发与桥接相关参数,并加载必要内核模块(如 br_netfilter、overlay)。

二 部署步骤

  • 系统网络与内核参数(所有节点)
    • 关闭 Swap:swapoff -a 并注释 /etc/fstab 中的 swap 行
    • 加载模块与开启转发:
      • /etc/modules-load.d/containerd.conf
        • overlay
        • br_netfilter
      • /etc/sysctl.d/99-kubernetes-k8s.conf
        • net.bridge.bridge-nf-call-iptables = 1
        • net.ipv4.ip_forward = 1
        • net.bridge.bridge-nf-call-ip6tables = 1
      • 执行 sysctl --system
  • 安装容器运行时与 kubeadm/kubelet/kubectl(所有节点)
    • apt update && apt install -y containerd kubelet kubeadm kubectl
    • systemctl enable --now containerd kubelet
  • 初始化控制平面(仅主节点)
    • kubeadm init --pod-network-cidr=10.244.0.0/16(可按需指定 apiserver 地址、版本与镜像源)
  • 安装支持 NetworkPolicy 的 CNI(主节点)
    • Calico 示例:kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
    • 验证:kubectl get pods -n kube-system | grep calico
  • 防火墙放行(如使用 ufw)
    • 放行 kube-apiserver、kubelet、Calico 等端口(示例:6443、10250、179、4789 等),或按实际环境放通节点间通信所需端口。

三 网络策略示例

  • 默认拒绝命名空间内所有 Pod 入站(默认无策略时通常全通,此策略用于“默认拒绝”基线)
    • apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-ingress namespace: default spec: podSelector: {} policyTypes:
      • Ingress
  • 仅允许同命名空间内 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: {}
  • 仅允许带标签 app=client 的 Pod 访问 app=web 的 80/TCP
    • apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: web-allow-client namespace: default spec: podSelector: matchLabels: app: web policyTypes:
      • Ingress ingress:
      • from:
        • podSelector: matchLabels: app: client ports:
        • protocol: TCP port: 80
  • 限制后端仅能访问内网数据库网段
    • apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: backend-egress-db namespace: default spec: podSelector: matchLabels: app: backend policyTypes:
      • Egress egress:
      • to:
        • ipBlock: cidr: 10.0.0.0/24 ports:
        • protocol: TCP port: 5432
  • 使用要点
    • 未显式声明 policyTypes 时,默认仅控制 Ingress;需要控制 Egress 必须显式添加。
    • 同一命名空间内多条策略为“叠加”生效,最终效果是各策略条件的交集。

四 验证与排错

  • 验证
    • 查看策略:kubectl get networkpolicy -A;kubectl describe networkpolicy -n
    • 测试连通性:kubectl run client --image=busybox:1.36 --labels=app=client --restart=Never – sleep 3600
      • kubectl exec -it client – sh
      • wget -O- http://web.default.svc.cluster.local
  • 排错
    • 检查 CNI 运行状态:kubectl get pods -n kube-system -l k8s-app=calico-node
    • 查看节点路由/转发:ip route、iptables-save | grep KUBE- 或 nft list ruleset
    • 确认策略是否命中:kubectl describe networkpolicy -n 与日志联动分析。

五 注意事项与最佳实践

  • 选择支持 NetworkPolicy 的 CNI(如 Calico、Cilium);避免使用默认不实现策略的 Flannel 单独提供策略能力。
  • 以“默认拒绝”为基线,按业务最小权限逐条放通,优先使用 标签选择器命名空间选择器 精确控制。
  • 明确 policyTypes(Ingress/Egress),避免遗漏出站控制导致“能出不能回”或横向渗透。
  • 多策略叠加时关注“条件交集”的生效范围,必要时拆分策略并增加审计与回归测试。

0