mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/kube-vip/kube-vip.git
synced 2026-09-20 08:03:47 +08:00
WireGuard for services (#1414)
* add tunnel manager Signed-off-by: Daniel Nägele <daniel@naegele.dev> * add wireguard endpoints and services Signed-off-by: Daniel Nägele <daniel@naegele.dev> * add udp support Signed-off-by: Daniel Nägele <daniel@naegele.dev> * fix endpoint watching Signed-off-by: Daniel Nägele <daniel@naegele.dev> * refactor code Signed-off-by: Daniel Nägele <daniel@naegele.dev> * fix after rebase Signed-off-by: Daniel Nägele <daniel@naegele.dev> --------- Signed-off-by: Daniel Nägele <daniel@naegele.dev> Co-authored-by: Marcel Fest <marcel.fest@live.de>
This commit is contained in:
@@ -20,6 +20,7 @@ import (
|
||||
"github.com/kube-vip/kube-vip/pkg/servicecontext"
|
||||
"github.com/kube-vip/kube-vip/pkg/utils"
|
||||
"github.com/kube-vip/kube-vip/pkg/vip"
|
||||
"github.com/kube-vip/kube-vip/pkg/wireguard"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/vishvananda/netlink"
|
||||
v1 "k8s.io/api/core/v1"
|
||||
@@ -57,6 +58,9 @@ type Processor struct {
|
||||
nodeLabelManager labelManager
|
||||
|
||||
electionMgr *election.Manager
|
||||
|
||||
// TunnelMgr manages multiple WireGuard tunnels (one per service VIP)
|
||||
TunnelMgr *wireguard.TunnelManager
|
||||
}
|
||||
|
||||
// labelManager is the interface for the node label manager to add/remove labels
|
||||
@@ -94,6 +98,7 @@ func NewServicesProcessor(config *kubevip.Config, bgpServer *bgp.Server,
|
||||
leaseMgr: leaseMgr,
|
||||
nodeLabelManager: nodeLabelManager,
|
||||
electionMgr: electionMgr,
|
||||
TunnelMgr: wireguard.NewTunnelManager(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,7 +213,39 @@ func (p *Processor) AddOrModify(ctx context.Context, event watch.Event, serviceF
|
||||
p.svcMap.Store(svc.UID, svcCtx)
|
||||
}
|
||||
|
||||
if p.config.EnableServicesElection || // Service Election
|
||||
// WireGuard services always need endpoint watching for DNAT rule updates
|
||||
// This is independent of leader election settings (which are for control plane HA)
|
||||
if p.config.EnableWireguard && !svcCtx.IsWatched {
|
||||
// Call serviceFunc first to set up the WireGuard tunnel
|
||||
err = serviceFunc(svcCtx, svc)
|
||||
if err != nil {
|
||||
log.Error(err.Error())
|
||||
if errors.Is(err, &utils.PanicError{}) {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
|
||||
go func() {
|
||||
defer func() {
|
||||
if svcCtx != nil {
|
||||
svcCtx.IsWatched = false
|
||||
}
|
||||
}()
|
||||
|
||||
// Start endpoint watcher for WireGuard services (uses EndpointSlices by default)
|
||||
var provider providers.Provider
|
||||
if p.config.EnableEndpoints {
|
||||
provider = providers.NewEndpoints()
|
||||
} else {
|
||||
provider = providers.NewEndpointslices()
|
||||
}
|
||||
if err = p.watchEndpoint(svcCtx, p.config.NodeName, svc, provider); err != nil {
|
||||
log.Error(err.Error())
|
||||
}
|
||||
}()
|
||||
|
||||
svcCtx.IsWatched = true
|
||||
} else if p.config.EnableServicesElection || // Service Election
|
||||
((p.config.EnableRoutingTable || p.config.EnableBGP) && // Routing table mode or BGP
|
||||
(!p.config.EnableLeaderElection && !p.config.EnableServicesElection)) { // No leaderelection or services election
|
||||
|
||||
|
||||
Reference in New Issue
Block a user