summaryrefslogtreecommitdiffhomepage
path: root/cmd/k8s-proxy/k8s-proxy.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/k8s-proxy/k8s-proxy.go')
-rw-r--r--cmd/k8s-proxy/k8s-proxy.go91
1 files changed, 61 insertions, 30 deletions
diff --git a/cmd/k8s-proxy/k8s-proxy.go b/cmd/k8s-proxy/k8s-proxy.go
index 9b2bb6749..fbcde1564 100644
--- a/cmd/k8s-proxy/k8s-proxy.go
+++ b/cmd/k8s-proxy/k8s-proxy.go
@@ -10,6 +10,7 @@ package main
import (
"context"
+ "encoding/json"
"errors"
"fmt"
"net"
@@ -104,6 +105,7 @@ func run(logger *zap.SugaredLogger) error {
if err != nil {
return fmt.Errorf("error getting rest config: %w", err)
}
+
clientset, err := kubernetes.NewForConfig(restConfig)
if err != nil {
return fmt.Errorf("error creating Kubernetes clientset: %w", err)
@@ -152,10 +154,12 @@ func run(logger *zap.SugaredLogger) error {
// TODO(tomhjp): Pass this setting directly into the store instead of using
// environment variables.
- if cfg.Parsed.APIServerProxy != nil && cfg.Parsed.APIServerProxy.IssueCerts.EqualBool(true) {
- os.Setenv("TS_CERT_SHARE_MODE", "rw")
- } else {
- os.Setenv("TS_CERT_SHARE_MODE", "ro")
+ if cfg.Parsed.APIServerProxy != nil {
+ if cfg.Parsed.APIServerProxy.IssueCerts.EqualBool(true) {
+ os.Setenv("TS_CERT_SHARE_MODE", "rw")
+ } else {
+ os.Setenv("TS_CERT_SHARE_MODE", "ro")
+ }
}
st, err := getStateStore(cfg.Parsed.State, logger)
@@ -275,43 +279,64 @@ func run(logger *zap.SugaredLogger) error {
}
var cm *certs.CertManager
- if shouldIssueCerts(cfg) {
- logger.Infof("Will issue TLS certs for Tailscale Service")
- cm = certs.NewCertManager(klc.New(lc), logger.Infof)
+
+ if cfg.Parsed.APIServerProxy != nil && cfg.Parsed.L4Proxy != nil {
+ return fmt.Errorf("proxy configured for both api-server-proxy and l4-proxy")
}
- if err := setServeConfig(ctx, lc, cm, apiServerProxyService(cfg)); err != nil {
- return err
+
+ if cfg.Parsed.APIServerProxy != nil {
+ // Setup for the API server proxy.
+ mode := kubetypes.APIServerProxyModeAuth
+ if cfg.Parsed.APIServerProxy != nil && cfg.Parsed.APIServerProxy.Mode != nil {
+ mode = *cfg.Parsed.APIServerProxy.Mode
+ }
+
+ ap, err := apiproxy.NewAPIServerProxy(logger.Named("apiserver-proxy"), restConfig, ts, mode, false)
+ if err != nil {
+ return fmt.Errorf("error creating api server proxy: %w", err)
+ }
+
+ group.Go(func() error {
+ if err := ap.Run(serveCtx); err != nil {
+ return fmt.Errorf("error running API server proxy: %w", err)
+ }
+
+ return nil
+ })
+
+ if shouldIssueCerts(cfg) {
+ logger.Infof("Will issue TLS certs for Tailscale Service")
+ cm = certs.NewCertManager(klc.New(lc), logger.Infof)
+ }
+ if err := setServeConfig(ctx, lc, cm, apiServerProxyService(cfg)); err != nil {
+ return err
+ }
+ } else if cfg.Parsed.L4Proxy != nil {
+ err := setupL4Proxies(serveCtx, ts, lc, logger, cfg, group)
+ if err != nil {
+ return fmt.Errorf("failed to setup l4 proxies: %w", err)
+ }
+ } else {
+ return fmt.Errorf("please configure proxy either as api-server-proxy or l4-proxy")
}
if cfg.Parsed.AdvertiseServices != nil {
- if _, err := lc.EditPrefs(ctx, &ipn.MaskedPrefs{
+ if prefs, err := lc.EditPrefs(ctx, &ipn.MaskedPrefs{
AdvertiseServicesSet: true,
Prefs: ipn.Prefs{
AdvertiseServices: cfg.Parsed.AdvertiseServices,
},
}); err != nil {
return fmt.Errorf("error setting prefs AdvertiseServices: %w", err)
+ } else {
+ prefsJSON, _ := json.Marshal(prefs)
+ logger.Infof("new prefs: %q", string(prefsJSON))
}
+ logger.Infof("Successfully set AdvertiseServices")
+ } else {
+ logger.Infof("No AdvertiseServices configured")
}
- // Setup for the API server proxy.
- mode := kubetypes.APIServerProxyModeAuth
- if cfg.Parsed.APIServerProxy != nil && cfg.Parsed.APIServerProxy.Mode != nil {
- mode = *cfg.Parsed.APIServerProxy.Mode
- }
- ap, err := apiproxy.NewAPIServerProxy(logger.Named("apiserver-proxy"), restConfig, ts, mode, false)
- if err != nil {
- return fmt.Errorf("error creating api server proxy: %w", err)
- }
-
- group.Go(func() error {
- if err := ap.Run(serveCtx); err != nil {
- return fmt.Errorf("error running API server proxy: %w", err)
- }
-
- return nil
- })
-
for {
select {
case <-ctx.Done():
@@ -325,6 +350,7 @@ func run(logger *zap.SugaredLogger) error {
case cfg = <-cfgChan:
// Handle config reload.
// TODO(tomhjp): Make auth mode reloadable.
+ // TODO(ChaosInTheCRD): Make UDP and TCP forwarders reloadable.
var prefs ipn.MaskedPrefs
cfgLogger := logger
currentPrefs, err := lc.GetPrefs(ctx)
@@ -347,12 +373,16 @@ func run(logger *zap.SugaredLogger) error {
prefs.Prefs.RouteAll = v
}
if !prefs.IsEmpty() {
+ logger.Infof("Advertising Service: %v", cfg.Parsed.AdvertiseServices)
if _, err := lc.EditPrefs(ctx, &prefs); err != nil {
return fmt.Errorf("error editing prefs: %w", err)
}
}
- if err := setServeConfig(ctx, lc, cm, apiServerProxyService(cfg)); err != nil {
- return fmt.Errorf("error setting serve config: %w", err)
+
+ if cfg.Parsed.APIServerProxy != nil {
+ if err := setServeConfig(ctx, lc, cm, apiServerProxyService(cfg)); err != nil {
+ return fmt.Errorf("error setting serve config: %w", err)
+ }
}
cfgLogger.Infof("Config reloaded")
@@ -441,6 +471,7 @@ func setServeConfig(ctx context.Context, lc *local.Client, cm *certs.CertManager
if err != nil {
return fmt.Errorf("error getting local client status: %w", err)
}
+
serviceHostPort := ipn.HostPort(fmt.Sprintf("%s.%s:443", name.WithoutPrefix(), status.CurrentTailnet.MagicDNSSuffix))
serveConfig := ipn.ServeConfig{