calico 关闭 network policy 机制

54 阅读4分钟

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"

🧰 使用方法

  1. 保存文件:

    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
    
  2. 应用修改:

    kubectl patch ds calico-node -n kube-system --patch-file disable-calico-policy.yaml
    
  3. 重启 calico-node DaemonSet:

    kubectl rollout restart ds calico-node -n kube-system
    

✅ 验证

  1. 查看是否添加成功:

    kubectl -n kube-system get ds calico-node -o yaml | grep FELIX_POLICYENABLED -A2
    
  2. 查看日志确认策略同步关闭:

    kubectl -n kube-system logs -l k8s-app=calico-node | grep -i "Policy disabled"
    
  3. 查看 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 全互通,无策略隔离)?
这在关闭策略时通常一起设定。