Summary
It has been more than half a year since our last official kube-router release, so I think we're more than past time to do so. Additionally, there have been quite a few items that have been fixed or upgraded.
Highlights & Changed Functionality
- The Network Services Controller (enabled via
--run-service-proxy
) now fetches metrics when the metrics URL is hit rather than on the sync period (--ipvs-sync-period
). This allows for more fine-grained and up-to-date metrics on IPVS services. (Thanks @rkojedzinszky!) - Service's
externalIP
andLoadBalancerIP
are now labels on IPVS metrics which can increase cardinality, but also provides better visibility for services. Prior to this, only theClusterIP
orNodePort
labels were added to metrics. - The GoBGP port can be changed or disabled via
--gpbgp-admin-port
to create more secure / flexible deployments of kube-router - We converted a lot of exec's out to
iproute2
intonetlink
library calls, making the code more idiomatic, faster, and less fragile to userspace tooling changes - When both DSR and Maglev is enabled on a service kube-router will automatically enable the kernel option
sloppy_tcp
for IPVS which allows for greater service routing consistency when transitioning nodes (Thanks @AnupamGhosh!) - All references to Endpoints has been removed since the API is now fully deprecated and EndpointSlices is now used behind the scenes
Fixed Issues
- 1895 - IPv6 NDP NA/NS dropped when using egress network policy
- 1875 - Collect service statistics real-time
- 1888 - Resilience to TCP SYN Node Loss
- 1816 - support change the default port of GoBGP
- 1614 - Fix CLI Options - --master doesn't work without --kubeconfig
Library Updates
- Go Version:
1.23.6
->1.25.1
- Alpine Version:
3.21
->3.22
- Go Releaser Version:
v2.5.0
->v2.12.2
- GoBGP Version:
v3.29.0
->v3.37.0
- CNI Plugin Version:
v1.6.2
->v1.8.0
- Kubernetes Libraries:
v1.31.3
->v1.34.1
Contributions
Special thanks to @rkojedzinszky, @AnupamGhosh, @qbnit0 for contributing to kube-router and helping make this release possible!
Changelog
- 8bf2e56 - feat(cni): update v1.6.2 -> v1.8.0
<Aaron U'Ren>
- b04463f - feat(moq): update v0.5.1 -> v0.6.0
<Aaron U'Ren>
- b1b3f93 - feat(goreleaser): update v2.12.2 -> v2.5.0
<Aaron U'Ren>
- a4fb70a - feat(lint): update golangci-lint v2.0.2 -> v2.4.0
<Aaron U'Ren>
- ec5c41d - feat(markdown): update linter from 0.39.0 -> 0.45.0
<Aaron U'Ren>
- 727ff28 - feat(actions): update stale v9 -> v10
<Aaron U'Ren>
- 97138fd - feat(actions): update setup-go v5 -> v6
<Aaron U'Ren>
- d691aaa - feat(alpine): update 3.21 -> 3.22
<Aaron U'Ren>
- 4d41eb6 - feat(go): update go 1.24 -> 1.25 + mods
<Aaron U'Ren>
- 94e72aa - fix(NPC): allow bi-directional ipv6 network discovery
<Aaron U'Ren>
- bafe940 - build(deps): bump github.com/docker/docker
<dependabot[bot]>
- 0855bbe - build(deps): bump google.golang.org/protobuf from 1.36.6 to 1.36.8
<dependabot[bot]>
- 16d7e2b - build(deps): bump the k8s-dependencies group across 1 directory with 4 updates
<dependabot[bot]>
- cb3ada2 - build(deps): bump k8s from 0.31.3 -> 0.33.3
<Aaron U'Ren>
- d7214ce - feat(Endpoints): convert Endpoints -> EndpointSlices
<Aaron U'Ren>
- bb9835a - feat(lballoc_test.go): make mock informer satisfy SharedIndexInformer interface
<Aaron U'Ren>
- 21719d2 - build(deps): bump github.com/aws/aws-sdk-go-v2/config
<dependabot[bot]>
- af1984a - build(deps): bump github.com/spf13/pflag from 1.0.9 to 1.0.10
<dependabot[bot]>
- a5c9404 - build(deps): bump github.com/onsi/gomega from 1.38.0 to 1.38.2
<dependabot[bot]>
- 36b6634 - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- ab81c6e - build(deps): bump github.com/prometheus/client_golang
<dependabot[bot]>
- 732d7a7 - fix(nsc): add loadbalancer IPs to metrics
<Aaron U'Ren>
- c2fd633 - fix(nsc): sync field name
<Richard Kojedzinszky>
- b4a9ba7 - fix(nsc): rename network_services_metrics.go
<Richard Kojedzinszky>
- 7533c18 - feat(nsc): getMetricsServiceMap() rebuilds only after services changed
<Richard Kojedzinszky>
- 5efb999 - feat(nsc): replace unsafe.Pointer with atomic.Pointer
<Richard Kojedzinszky>
- d0163ab - feat(nsc): move part of Collect() to getMetricsServiceMap()
<Richard Kojedzinszky>
- 4e8bb70 - feat(nsc): move metrics logic to separate file
<Richard Kojedzinszky>
- a224198 - feat(nsc): optimize key in temporary serviceMap
<Richard Kojedzinszky>
- 4ed0cf4 - feat(nsc): improve Service statistics
<Richard Kojedzinszky>
- 1b4b6d6 - feat(nsc): eliminate nested loops in Collect()
<Richard Kojedzinszky>
- 7666276 - feat(nsc): collect service statistics on demand
<Richard Kojedzinszky>
- 4b4ebec - feat(nsc): prepare serviceMap to be accessed by collector thread
<Richard Kojedzinszky>
- 5132015 - build(deps): bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds
<dependabot[bot]>
- 4479fd2 - build(deps): bump golang.org/x/net from 0.42.0 to 0.43.0
<dependabot[bot]>
- 3127ca8 - build(deps): bump github.com/aws/aws-sdk-go-v2 from 1.37.1 to 1.38.3
<dependabot[bot]>
- bca8418 - build(deps): bump github.com/aws/smithy-go from 1.22.5 to 1.23.0
<dependabot[bot]>
- 5d31e35 - build(deps): bump google.golang.org/grpc from 1.74.2 to 1.75.0
<dependabot[bot]>
- 9b9402e - build(deps): bump github.com/spf13/pflag from 1.0.7 to 1.0.9
<dependabot[bot]>
- 90821a1 - build(deps): bump actions/checkout from 4 to 5
<dependabot[bot]>
- 9771000 - build(deps): bump github.com/stretchr/testify from 1.10.0 to 1.11.1
<dependabot[bot]>
- 02fbecc - build(deps): bump golang.org/x/sys from 0.34.0 to 0.35.0
<dependabot[bot]>
- 5e397e5 - fix failed message
<Anupam Ghosh>
- bbb8f3b - disable sloppy_tcp if there is no DSR & Maglev service
<Anupam Ghosh>
- 98e38e9 - get and set with int8 for SysctlConfig
<Anupam Ghosh>
- 598fc86 - enable sloppy_tcp when DSR and Maglev is enabled
<Anupam Ghosh>
- 46d7d62 - build(deps): bump github.com/aws/aws-sdk-go-v2/config
<dependabot[bot]>
- b7a3721 - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- d9c4712 - build(deps): bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds
<dependabot[bot]>
- cfb9119 - build(deps): bump github.com/docker/docker
<dependabot[bot]>
- 0f4c577 - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- c64aed5 - build(deps): bump github.com/aws/aws-sdk-go-v2/config
<dependabot[bot]>
- 4f31e54 - build(deps): bump github.com/onsi/gomega from 1.37.0 to 1.38.0
<dependabot[bot]>
- 9bf90c7 - build(deps): bump google.golang.org/grpc from 1.73.0 to 1.74.2
<dependabot[bot]>
- 496ea3b - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- 716b3de - build(deps): bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds
<dependabot[bot]>
- 48e859b - build(deps): bump github.com/spf13/pflag from 1.0.6 to 1.0.7
<dependabot[bot]>
- 7adddd4 - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- 569954a - build(deps): bump golang.org/x/net from 0.41.0 to 0.42.0
<dependabot[bot]>
- b3f5082 - build(deps): bump github.com/docker/docker
<dependabot[bot]>
- bcaced7 - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- e2f9681 - build(deps): bump github.com/docker/docker
<dependabot[bot]>
- 7006205 - feat(DSR): disable routing DSR traffic via kube-bridge
<Aaron U'Ren>
- 2ebcac6 - feat(linux_networking): add some additional logging
<Aaron U'Ren>
- eb04cbe - fact(linux_tunnels): split SetupOverlayTunnel
<Aaron U'Ren>
- 7a0fca3 - feat(linux_tunnels): convert to use netlink library
<Aaron U'Ren>
- 8504c52 - fix(DSR): setup source routing for all external IPs
<Aaron U'Ren>
- e6edc85 - fix(ipAddrDel): check to see if IP exists on interface before delete
<Aaron U'Ren>
- 69e58ed - feat(NSC): add some additional debugging to traffic director
<Aaron U'Ren>
- 94bfc0d - fix(ipAddrDel): check for routes before trying to delete
<Aaron U'Ren>
- e29b6a3 - fix(NSC): pass fwmark to traffic director as an int
<Aaron U'Ren>
- 3c89595 - fact(utils): factor out single subnet ip logic
<Aaron U'Ren>
- b070531 - fix: add proper nil rule src handling
<Aaron U'Ren>
- f2b0d78 - fact: add ip utils library & add unit testing
<Aaron U'Ren>
- 4795a07 - fix(ip rule): use NewRule() for all rule creations
<Aaron U'Ren>
- 5607605 - fix(linux_networking.go): add scope to local routes
<Aaron U'Ren>
- 80328ac - fix(linux_networking.go): filter routes to be deleted by table
<Aaron U'Ren>
- 2836065 - fix(linux_routing.go): choose first rt_tables file
<Aaron U'Ren>
- f59a4f5 - feat: convert execs to ip to netlink calls
<Aaron U'Ren>
- d7e14f7 - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- e04d62b - build(deps): bump github.com/aws/aws-sdk-go-v2/config
<dependabot[bot]>
- 1f3f5b9 - pkg/cmd/kube-router: Have gocritic ignore if-else chain
<qbnit0>
- 4b1c954 - Support in-cluster config with --master
<qbnit0>
- 2eeab05 - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- 46280e0 - build(deps): bump golang.org/x/net from 0.40.0 to 0.41.0
<dependabot[bot]>
- ab0d686 - build(deps): bump google.golang.org/grpc from 1.72.2 to 1.73.0
<dependabot[bot]>
- 36120e2 - build(deps): bump github.com/aws/aws-sdk-go-v2/config
<dependabot[bot]>
- b9d5cb5 - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- d606220 - build(deps): bump google.golang.org/grpc from 1.72.1 to 1.72.2
<dependabot[bot]>
- 82cb7ad - build(deps): bump github.com/docker/docker
<dependabot[bot]>
- d6ae8cc - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- 14cb612 - build(deps): bump google.golang.org/grpc from 1.72.0 to 1.72.1
<dependabot[bot]>
- aa5117d - build(deps): bump golang.org/x/net from 0.39.0 to 0.40.0
<dependabot[bot]>
- f8b691e - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- 7b99088 - build(deps): bump github.com/osrg/gobgp/v3 from 3.36.0 to 3.37.0
<dependabot[bot]>
- fc867eb - build(deps): bump golang.org/x/sys from 0.32.0 to 0.33.0
<dependabot[bot]>
- f86e3b0 - build(deps): bump github.com/vishvananda/netlink from 1.3.0 to 1.3.1
<dependabot[bot]>
- bb61315 - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- 81c4a27 - build(deps): bump golang.org/x/net from 0.38.0 to 0.39.0
<dependabot[bot]>
- ab95405 - build(deps): bump google.golang.org/grpc from 1.71.0 to 1.72.0
<dependabot[bot]>
- 0c495cc - build(deps): bump github.com/aws/aws-sdk-go-v2/config
<dependabot[bot]>
- 5d22117 - build(deps): bump github.com/prometheus/client_golang
<dependabot[bot]>
- 9788ada - build(deps): bump github.com/onsi/gomega from 1.36.2 to 1.37.0
<dependabot[bot]>
- 5389fe1 - build(deps): bump golang.org/x/sys from 0.31.0 to 0.32.0
<dependabot[bot]>
- df89045 - build(deps): bump github.com/osrg/gobgp/v3 from 3.29.0 to 3.36.0
<dependabot[bot]>
- f2b6d62 - build(deps): bump github.com/docker/docker
<dependabot[bot]>
- 43d6dd7 - build(deps): bump github.com/aws/aws-sdk-go-v2/service/ec2
<dependabot[bot]>
- 6a1d15c - Use golangci-lint 2.0.2
<Manuel Rüger>
- 16b48c3 - Build with go 1.24
<Manuel Rüger>
- d8cac91 - feat(options): allow disabling GoBGP grpc port
<Aaron U'Ren>
- de3e218 - feat(options): add flag for GoBGP grpc port
<Aaron U'Ren>
- ef09bbd - feat(go): update golang.org dependencies
<Aaron U'Ren>
- ff8d42f - Update aws-sdk to v2
<Manuel Rüger>
- e9a0f5e - build(deps): bump google.golang.org/protobuf from 1.36.5 to 1.36.6
<dependabot[bot]>
- 7e03652 - build(deps): bump github.com/ccoveille/go-safecast from 1.5.0 to 1.6.1
<dependabot[bot]>
- e0e47b2 - build(deps): bump google.golang.org/grpc from 1.69.4 to 1.71.0
<dependabot[bot]>
- f90cba3 - build(deps): bump github.com/prometheus/client_golang
<dependabot[bot]>
- 2b783fe - build(deps): bump github.com/docker/docker
<dependabot[bot]>
- 8f620d8 - build(deps): bump google.golang.org/protobuf from 1.36.4 to 1.36.5
<dependabot[bot]>
- 6be661a - build(deps): bump golang.org/x/net from 0.34.0 to 0.35.0
<dependabot[bot]>