Skip to content

Backport for v1.19 release blockers 2026-01-26#44025

Merged
aanm merged 17 commits intocilium:v1.19from
joestringer:pr/v1.19-backport-2026-01-26
Jan 27, 2026
Merged

Backport for v1.19 release blockers 2026-01-26#44025
aanm merged 17 commits intocilium:v1.19from
joestringer:pr/v1.19-backport-2026-01-26

Conversation

@joestringer
Copy link
Copy Markdown
Member

@joestringer joestringer commented Jan 27, 2026

This is all of the outstanding backports for v1.19 as of today, but the last few are release blockers for v1.19.0-rc.1.

Once this PR is merged, a GitHub action will update the labels of these PRs:

43934 43948 43807 44013 42580 43997 43999 43891 43710 43961

aanm and others added 17 commits January 26, 2026 16:15
[ upstream commit bfbf498 ]

Fixes: 151d302 ("datapath/tunnel: New flag --underlay-protocol={ipv4,ipv6}")
Signed-off-by: André Martins <andre@cilium.io>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 93eb490 ]

The datapath doesn't need write access for this map.

Signed-off-by: Julian Wiedmann <jwi@isovalent.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit e382a33 ]

This add back a check to skip some endpoints that should not receive any
traffic in the ClusterMesh context.

Before the fixed commit this filtering was done through the resource /
ParseEndpointSliceV1 but this was removed so that everything can be kept it in
the backend maps while the backends not supposed to serve new connections would
be excluded directly by the datapath.

However as ClusterMesh doesn't retain any info on the Endpoint
conditions, those are essentially lost and we would propagate them like any
fully ready backends unfortunately.

Fixes: 6f41c98 ("loadbalancer: Keep non-serving terminating backends")

Signed-off-by: Arthur Outhenin-Chalandre <git@mrfreezeex.fr>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 9b05119 ]

Adds entry to the upgrade notes for Cilium 1.19 relating to the
introduction of wildcard service entries and the underlying
behaviour change this brings to the datapath.

Signed-off-by: Alasdair McWilliam <alasdair.mcwilliam@isovalent.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 161a51b ]

This creates two unique selector caches inside the policy repository. We
do this since the performance after changes in v1.16 caused the selector cache
to become a lot slower since more data is injected.

This split takes advantage of the fact that in a cluster where pods,
identities and unique policies are churned consistently at a given rate r - we
know that not all aspects are equally expensive. If we then assume these
will have the cardinality c, we can do some calculations.

We know that identities and the policies are cluster level and will
churn at the same rate r, and has the same cardinality c.
However, we know that on a given node, the churn of identities used by
local endpoints is pretty small, most likely much smaller than r. The
same with the cardinality of those identities, that can be at most the
same number as there are endpoints on a node. We then also know, based
on the assumption that not all policies match all pods, that not all l3/l4
{to,from}Endpoints are used by all endpoints. We can then assume that on
a given node, not all c l3/l4 policies are being used. The same we can
assume for the churn then, that the change of l3/l4 policies in use at a
given time on the node, is much smaller than r. This also includes
policies like FQDN and toCIDR policies, and other types of policies that
end up in the selector cache today - but the concept is exactly the
same.

Based on this - we can split the selector cache in two, where;

One is used to index:
- policies from their endpointSelector (high churn rate, high cardinality)
- identities used by local endpoints (low churn rate, low cardinality)

And the other one to index:
- internal l3/l4 policies used by local endpoints (low churn rate, low
  cardinality)
- all identities (high churn rate, high cardinality)

All this together, means that we go from a single selector cache that
indexes a lot of different high churn and high cardinality items - to
two distinct selector caches that index one high cardinality high churn
aspect, and one that is low cardinality low churn.

Fixes: 2e2c6c5 ("policy: determine subject identities via SelectorCache")
Signed-off-by: Odin Ugedal <odin@uged.al>
Signed-off-by: Odin Ugedal <ougedal@palantir.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 2326ca1 ]

Signed-off-by: Odin Ugedal <odin@ugedal.com>
Signed-off-by: Odin Ugedal <ougedal@palantir.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 683f3ff ]

Signed-off-by: Odin Ugedal <ougedal@palantir.com>
Signed-off-by: Odin Ugedal <odin@ugedal.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 015d5f9 ]

Signed-off-by: phuhung273 <phuhung.tranpham@gmail.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 74c1bde ]

This commit adds a test that when we have two EndpointSlices in
different namespaces with the same name, that these do not cause any
collisions or problems.

Specifically, we test the scenario where two EndpointSlices are setup,
then one is modified by removing an address. This should be correctly
picked up and the backend removed from the BPF maps.

This test is a regression test for cilium#43999.

Signed-off-by: Emily Shepherd <emily@redcoat.dev>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 5c146c3 ]

We previously did not include the Namespace in EndpointSliceNames,
relying on the fact that EndpointSlices that use generateName- are
unlikely to have name collisions, even across namespaces. While this is
usually the case, there is no requirement for EndpointSlice managers to
use generateName, and there are examples of controllers that do not (for
example the master kubernetes service's EndpointSlice is always called
"kubernetes").

Including the namespace in EndpointSliceNames guarantees collisions
cannot occur.

See cilium#43999 for further discussion
of this bug.

Signed-off-by: Emily Shepherd <emily@redcoat.dev>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 236126f ]

While we're at it, add references to the upstream kernel commits
required for the feature checks to pass.

Signed-off-by: Alice Mikityanska <alice@isovalent.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit fb3e790 ]

1. On errors, revert changes to the original values, rather than
defaults. There are devices for which gso_max_size=65536 is too big.

2. In error handling flow, modify IPv6 values first, similarly to how
it's done during the configuration. Modifying gso_max_size also affects
gso_ipv4_max_size when setting values below 64k, so it should be done
before IPv4.

3. In error handling flow, go over the devices in the reverse order,
because there might be weird dependencies between them, e.g.,
tso_max_size of one device depends on gso_max_size of another.

Signed-off-by: Alice Mikityanska <alice@isovalent.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 5138f56 ]

Adjust the configuration flow for the startBIGTCP() to use a more typical
detect, modify, update pattern.

1. Move loop for device GSO limit detection into startBIGTCP()

2. Modify the configuration at the end upon successful config.

3. Change the configuration to the default if no devices are selected.

Signed-off-by: Alice Mikityanska <alice@isovalent.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit c5bd3bd ]

Make the initialization flow of BIG TCP more robust by exposing all the
logic explicitly in startBIGTCP(). The robustness changes include:

1. Return errors from startBIGTCP(). Previously, it would always return
nil.

2. Fallback to older kernels' defaults when probing for potentially
unsupported parameters.

3. Revert the change from commit fcdbf6d ("cilium, bigtcp: Allow
raising GRO/GSO size without BIG TCP"), that would set gso_max_size=64k
regardless of tso_max_size, which might be smaller, failing the
operation in that case. Restore the old logic (in non-BIG TCP, keep
values lower than 64k as is), but make it more robust: instead of hiding
the check inside SetGROGSOIPv6MaxSize() and pretending that it set 64k,
let startBIGTCP() check it explicily, whether lowering to 64k is needed.
At the same time, store the lowest value among all netdevs to be used
by the Cilium tunnel netdev.

Fixes: cilium#43737
Signed-off-by: Alice Mikityanska <alice@isovalent.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit c0c752b ]

BIG TCP initialization code refuses to proceed with enabling the feature
if Cilium is set to tunneling mode, but the admin doesn't declare kernel
support for BIG TCP for VXLAN and GENEVE tunnels. However, tunneling
mode isn't the only case when a GENEVE tunnel can be created. Another
case is dsrDispatch=geneve.

Currently, BIG TCP proceeds to increase gso_max_size and gro_max_size,
but the following creation of the GENEVE tunnel fails. Detect this
configuration in advance and block BIG TCP.

Also block BIG TCP in dsrDispatch=ipip, because IPIP tunnels don't
support gso_max_size > 64k either.

Fixes: cilium#43938
Reported-by: Chris Bannister <c.bannister@gmail.com>
Signed-off-by: Alice Mikityanska <alice@isovalent.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 54157c0 ]

[ Backporter's notes: Resolved conflict in cmdref caused by commit
  37103a7 ("bpf: switch POLICY_ACCOUNTING to load time config")
  being merged upstream but not backported to v1.19 ]

Setting this to 2 by default might be too aggressive as it
is has been brought up that this may lead to issues in instances
with high amounts of ephemeral connections (i.e. multiplying the
overhead). Therefore we rework this prior to v1.19 such that cilium
can be configured to use any valid value for endpoints or leave it
empty to simply inherit from host settings.

Signed-off-by: Tom Hadlaw <tom.hadlaw@isovalent.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
[ upstream commit 462b18e ]

This commit adds a new tutorial documenting how to configure
and use the Generic IP Options packet tracing feature.

The tutorial covers:

- Configuring `bpf.monitorTraceIPOption` via Helm in a Kind
environment.
- Manually verifying the feature using `nping` to inject valid
2-byte Trace IDs.
- Observing extracted Trace IDs using `cilium monitor`
- Filtering flows by Trace ID using the
`hubble observe --ip-trace-id` command.
- Documentation of current BPF limitations regarding strict
payload lengths (2, 4, or 8 bytes).

Signed-off-by: Ben Bigdelle <bigdelle@google.com>
Signed-off-by: Joe Stringer <joe@cilium.io>
@joestringer joestringer requested a review from a team as a code owner January 27, 2026 00:26
@joestringer joestringer added kind/backports This PR provides functionality previously merged into master. backport/1.19 This PR represents a backport for Cilium 1.19.x of a PR that was merged to main. labels Jan 27, 2026
@joestringer joestringer requested a review from a team as a code owner January 27, 2026 00:26
@github-actions github-actions bot added the sig/policy Impacts whether traffic is allowed or denied based on user-defined policies. label Jan 27, 2026
@joestringer
Copy link
Copy Markdown
Member Author

/test

@EmilyShepherd
Copy link
Copy Markdown
Contributor

LGTM for the patches from #43999. As I wrote them, I checked and tested that they work as-is if applied to v1.19.

Copy link
Copy Markdown
Member

@odinuge odinuge left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#42580 looks good. Happy with backport as long as we can also backport relevant metric PR(s) as well when we get them ready.

@aanm aanm added this pull request to the merge queue Jan 27, 2026
Merged via the queue into cilium:v1.19 with commit 70f3b58 Jan 27, 2026
95 of 97 checks passed
@cilium-release-bot cilium-release-bot bot moved this to Released in cilium v1.19.0 Feb 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport/1.19 This PR represents a backport for Cilium 1.19.x of a PR that was merged to main. kind/backports This PR provides functionality previously merged into master. sig/policy Impacts whether traffic is allowed or denied based on user-defined policies.

Projects

No open projects
Status: Released

Development

Successfully merging this pull request may close these issues.