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
- /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:
- 仅允许同命名空间内 Pod 互通(白名单基线)
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- to:
- 仅允许带标签 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),避免遗漏出站控制导致“能出不能回”或横向渗透。
- 多策略叠加时关注“条件交集”的生效范围,必要时拆分策略并增加审计与回归测试。