calico 的 network policy 机制可以关闭
Calico 的 NetworkPolicy(策略机制) 是可以关闭或“旁路”的——这在一些场景(例如你只想让 Calico 负责路由或封装,不要管安全策略)里是常见做法。
下面是完整说明:包括关闭方式、影响、以及推荐安全替代方案。
🧩 一、Calico NetworkPolicy 机制的本质
Calico 的网络策略(NetworkPolicy / GlobalNetworkPolicy)由 Felix 组件执行,它通过动态更新 iptables(或 eBPF program)来实现:
- ingress / egress 访问控制;
- namespace / SA / label 选择器;
- logging、deny、allow 等行为。
因此,“关闭 NetworkPolicy” 的核心,就是让 Felix 不再安装或评估任何安全策略链(cali-fw-*, cali-tw-*, cali-pri-*, cali-pro-* 等) 。
🧰 二、几种关闭方式(从轻到重)
方案 1️⃣:仅禁用策略执行(保留路由)
👉 最安全也是官方推荐的“关闭策略”方式。
在 Felix 配置中设置:
calicoctl patch felixconfiguration default --type merge -p '{
"spec": {
"policySyncPathPrefix": "",
"policyEnabled": "false"
}
}'
或(不同版本字段名略不同):
calicoctl patch felixconfiguration default --type merge -p '{
"spec": {
"policySyncPathPrefix": "",
"applyOnForward": false,
"defaultEndpointToHostAction": "Accept"
}
}'
效果:
- Felix 不再编译和下发 policy 链;
- 不再创建或更新
cali-pri-*,cali-pro-*,cali-fw-*,cali-tw-*;- 所有流量默认放行(除非系统其他 iptables 规则阻挡);
- 路由、封装(IPIP/VXLAN)、BGP 功能仍正常工作。
方案 2️⃣:删除/避免安装所有 NetworkPolicy / GlobalNetworkPolicy
如果你只是使用 Kubernetes CRD 模式:
kubectl delete networkpolicy --all --all-namespaces
kubectl delete globalnetworkpolicy --all
然后保留 Felix 正常运行(但它不会生成策略规则)。
效果:
- 策略模块仍然存在,但无策略可匹配;
- 相当于所有 Pod 全部允许互访;
- 若 Calico 默认 profile 仍存在(如
kns.default),它们仍然是全放行(allow all)。
方案 3️⃣:直接让 Felix 忽略策略同步
可以在 Felix 启动配置中设置环境变量:
FELIX_POLICYENABLED=false
(这是最直接的开关)
部署在 kube-system 下的 DaemonSet 可修改:
kubectl -n kube-system edit daemonset calico-node
在 env 下添加:
- name: FELIX_POLICYENABLED
value: "false"
效果:
- 完全停止策略处理;
- Felix 不再生成任何与策略相关的链;
- Pod 间默认互通;
- 网络封装 / 路由 / IPAM 仍然正常。
⚠️ 三、关闭策略的副作用
| 项目 | 影响 |
|---|---|
| NetworkPolicy 不生效 | 所有 Pod 互通 |
| GlobalNetworkPolicy 不生效 | 不再有全局隔离 |
| HostEndpoint 策略 | 同样失效 |
kubectl get networkpolicy 仍可看到对象 | 但 Felix 不会执行 |
| 已生成的 iptables 链 | 启动后被清空或不会更新 |
| 网络 | 正常,Calico 仍提供 CNI/路由/BGP/IPIP/VXLAN |
🧠 四、你可以用来验证是否关闭成功
# 查看 Felix 日志(确认不再同步 policy)
journalctl -u calico-node | grep policy
# 检查是否仍有 policy 链
iptables-save | grep -E "cali-fw-|cali-pri-|cali-pro-"
# 查看 FELIX_POLICYENABLED 环境变量
kubectl -n kube-system get ds calico-node -o yaml | grep FELIX_POLICYENABLED -A2
如果你看到:
- 没有任何
cali-fw-*/cali-pri-*链; - 或日志里写着
Policy disabled;
就表示策略机制完全关闭。
🧩 五、补充:eBPF 模式下关闭策略
如果你启用了 bpfMode: true(Cilium 类似),则需使用:
FELIX_BPFENABLED=true
FELIX_POLICYENABLED=false
或者在 ConfigMap:
bpfEnabled: true
policyEnabled: false
此时 Calico 会仍然使用 eBPF dataplane(实现路由、NAT、XDP 加速),但不会加载任何策略相关的 eBPF 程序。
✅ 六、总结一句话
Calico 的网络策略模块(NetworkPolicy / GlobalNetworkPolicy / HostEndpoint)可以通过设置
FELIX_POLICYENABLED=false
或删除策略对象的方式完全关闭。
关闭后 Calico 仍可正常作为 CNI(路由、IPAM、BGP、封装均正常),只是所有流量默认放行。
是否希望我帮你生成一个“一键关闭策略”的 YAML Patch(可以直接 kubectl apply 到你的集群)?
那样你不需要手动改 DaemonSet 或 calicoctl。
您说:
是否希望我帮你生成一个“一键关闭策略”的 YAML Patch(可以直接 kubectl apply 到你的集群)? 那样你不需要手动改 DaemonSet 或 calicoctl。
生成
ChatGPT 说:
下面是一份可以直接在你的集群中执行的“一键关闭 Calico NetworkPolicy 功能”的 YAML Patch 文件。
它通过修改 calico-node DaemonSet,设置环境变量 FELIX_POLICYENABLED=false 来关闭策略模块。
📄 文件名:disable-calico-policy.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: calico-node
namespace: kube-system
spec:
template:
spec:
containers:
- name: calico-node
env:
- name: FELIX_POLICYENABLED
value: "false"
🧰 使用方法
-
保存文件:
cat > disable-calico-policy.yaml <<'EOF' apiVersion: apps/v1 kind: DaemonSet metadata: name: calico-node namespace: kube-system spec: template: spec: containers: - name: calico-node env: - name: FELIX_POLICYENABLED value: "false" EOF -
应用修改:
kubectl patch ds calico-node -n kube-system --patch-file disable-calico-policy.yaml -
重启 calico-node DaemonSet:
kubectl rollout restart ds calico-node -n kube-system
✅ 验证
-
查看是否添加成功:
kubectl -n kube-system get ds calico-node -o yaml | grep FELIX_POLICYENABLED -A2 -
查看日志确认策略同步关闭:
kubectl -n kube-system logs -l k8s-app=calico-node | grep -i "Policy disabled" -
查看 iptables 确认策略链不再存在:
iptables-save | grep cali-fw-
🔁 恢复(重新开启策略)
若之后你想恢复策略功能,只需执行:
kubectl -n kube-system patch ds calico-node \
--type json \
-p='[{"op": "remove", "path": "/spec/template/spec/containers/0/env/0"}]'
kubectl rollout restart ds calico-node -n kube-system
是否希望我帮你扩展这个补丁,让它同时设置 FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT(保证节点与 Pod 全互通,无策略隔离)?
这在关闭策略时通常一起设定。