Skip to content

restrict-system-components blocks LINSTOR satellite cross-node traffic when Cilium is chained with kube-ovn #3337

Description

@2mind

What happened

LINSTOR controller pod on node A cannot reach satellite on node B (port 3367 SSL). Only the satellite on the same node as the controller is Online. Cross-node pod-to-host TCP connections to port 3367 are silently dropped.

Root cause

restrict-system-components CCNP has:

ingressDeny:
- fromEntities:
  - world
  toPorts:
  - ports:
    - port: "3367"   # ← blocks LINSTOR satellite

In CNI chaining mode (generic-veth with kube-ovn), cross-node pod-to-host traffic arrives at the destination node with the pod overlay IP as source. Cilium ipcache does not have identity entries for pods managed by kube-ovn (they are not Cilium endpoints), so the traffic is classified as identity world→unknown and dropped.

Note: ingressDeny has priority over ingress in Cilium policy evaluation. Moving port 3367 to another CCNP (e.g. restrict-drbd-reactor) with ingress.fromEntities: [cluster] would NOT help — the ingressDeny.fromEntities: [world] rule is evaluated first, and since the traffic IS classified as world, it would still be denied.

Confirmed via cilium monitor:

xx drop (Policy denied by denylist) identity world->unknown:
  10.244.0.204:37124 -> 10.88.148.82:3367 tcp SYN

Why this does not affect all clusters

In standard kube-ovn distributed-gateway mode with natOutgoing: true, pod→remote-node traffic gets SNAT to the node IP. Cilium then classifies it as host (allowed by ingress.fromEntities). On affected clusters, SNAT is not applied.

Short-term fix

Remove port 3367 (and 3366) from restrict-system-components ingressDeny.

Long-term fix

Fix Cilium identity classification in generic-veth chaining mode with kube-ovn. Cross-node pod traffic should be classified as cluster, not world.

Steps to reproduce

  1. Deploy cozystack with networking: kubeovn-cilium, Cilium in chaining mode
  2. Enable LINSTOR on a multi-node cluster
  3. kubectl exec -n cozy-linstor deploy/linstor-controller -- linstor node list — satellites on remote nodes are OFFLINE
  4. TCP connection from controller pod to remote node IP:3367 fails (world → denied)
  5. HostNetwork pod on same node can reach remote satellite:3367 (host → allowed)
  6. cilium monitor --type drop on remote node confirms: Policy denied by denylist, identity world->unknown

Environment

  • Cozystack version: current main
  • CNI: Cilium + kube-ovn (generic-veth chaining)
  • Affected component: cilium-networkpolicyrestrict-system-components CCNP

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions