Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions pkg/agent/flannel/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
agentutil "github.com/k3s-io/k3s/pkg/agent/util"
"github.com/k3s-io/k3s/pkg/daemons/config"
"github.com/k3s-io/k3s/pkg/signals"
"github.com/k3s-io/k3s/pkg/vpn"
"github.com/k3s-io/k3s/pkg/util"
pkgerrors "github.com/pkg/errors"
"github.com/sirupsen/logrus"
Expand Down Expand Up @@ -232,6 +233,12 @@ func createFlannelConf(nodeConfig *config.Node) error {
if len(routes) == 0 {
return fmt.Errorf("incorrect netMode for flannel tailscale backend")
}
advertisedRoutes, err := vpn.GetAdvertisedRoutes()
if err == nil && advertisedRoutes != nil {
for _, advertisedRoute := range advertisedRoutes {
routes = append(routes, advertisedRoute.String())
}
}
backendConf = strings.ReplaceAll(tailscaledBackend, "%Routes%", strings.Join(routes, ","))
case config.FlannelBackendWireguardNative:
backendConf = wireguardNativeBackend
Expand Down
33 changes: 32 additions & 1 deletion pkg/vpn/vpn.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"net"
"net/netip"
"net/url"
"strings"

Expand All @@ -20,10 +21,16 @@ const (

type TailscaleOutput struct {
TailscaleIPs []string `json:"TailscaleIPs"`
BackendState string `json:"BackendState"`
}

type TailscalePrefsOutput struct {
AdvertiseRoutes []netip.Prefix `json:"AdvertiseRoutes"`
}

// VPNInfo includes node information of the VPN. It is a general struct in case we want to add more vpn integrations
type VPNInfo struct {
BackendState string
IPv4Address net.IP
IPv6Address net.IP
NodeID string
Expand All @@ -49,6 +56,11 @@ func StartVPN(vpnAuthConfigFile string) error {
logrus.Infof("Starting VPN: %s", authInfo.Name)
switch authInfo.Name {
case "tailscale":
vpnInfo, err := getTailscaleInfo()
if err == nil && vpnInfo.BackendState == "Running" {
logrus.Debugf("Tailscale is already running, skipping tailscale up")
return nil
}
args := []string{
"up", "--authkey", authInfo.JoinKey, "--timeout=30s", "--reset",
}
Expand Down Expand Up @@ -148,7 +160,26 @@ func getTailscaleInfo() (VPNInfo, error) {
ipv4Address, _ := util.GetFirst4String(tailscaleOutput.TailscaleIPs)
ipv6Address, _ := util.GetFirst6String(tailscaleOutput.TailscaleIPs)

return VPNInfo{IPv4Address: net.ParseIP(ipv4Address), IPv6Address: net.ParseIP(ipv6Address), NodeID: "", ProviderName: "tailscale", VPNInterface: tailscaleIf}, nil
return VPNInfo{BackendState: tailscaleOutput.BackendState, IPv4Address: net.ParseIP(ipv4Address), IPv6Address: net.ParseIP(ipv6Address), NodeID: "", ProviderName: "tailscale", VPNInterface: tailscaleIf}, nil
}

// get Tailscale advertised route list
func GetAdvertisedRoutes() ([]netip.Prefix, error) {
output, err := util.ExecCommand("tailscale", []string{"debug", "prefs"})
if err != nil {
return nil, fmt.Errorf("failed to run tailscale debug prefs: %v", err)
}

logrus.Debugf("Output from tailscale debug prefs: %v", output)

var tailscaleOutput TailscalePrefsOutput
err = json.Unmarshal([]byte(output), &tailscaleOutput)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal tailscale output: %v", err)
}

return tailscaleOutput.AdvertiseRoutes, nil

}

// processCLIArgs separates the extraArgs part from the command.
Expand Down
Loading