Skip to content
Merged
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
2 changes: 1 addition & 1 deletion VERSION.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.94.1
1.96.5
38 changes: 14 additions & 24 deletions k8s-operator/api-proxy/proxy.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Tailscale Inc & AUTHORS
// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

//go:build !plan9
Expand All @@ -21,14 +21,14 @@ import (
"strings"
"time"

"github.com/pires/go-proxyproto"
"go.uber.org/zap"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apiserver/pkg/endpoints/request"
"k8s.io/client-go/rest"
"k8s.io/client-go/transport"
"tailscale.com/client/local"
"tailscale.com/client/tailscale/apitype"
"tailscale.com/envknob"
ksr "tailscale.com/k8s-operator/sessionrecording"
"tailscale.com/kube/kubetypes"
"tailscale.com/net/netx"
Expand All @@ -43,13 +43,7 @@ import (
var (
// counterNumRequestsproxies counts the number of API server requests proxied via this proxy.
counterNumRequestsProxied = clientmetric.NewCounter("k8s_auth_proxy_requests_proxied")
// NOTE: adding this metric so we can keep track of users during deprecation
counterExperimentalEventsVarUsed = clientmetric.NewCounter("ts_experimental_kube_api_events_var_used")
whoIsKey = ctxkey.New("", (*apitype.WhoIsResponse)(nil))
)

const (
eventsEnabledVar = "TS_EXPERIMENTAL_KUBE_API_EVENTS"
whoIsKey = ctxkey.New("", (*apitype.WhoIsResponse)(nil))
)

// NewAPIServerProxy creates a new APIServerProxy that's ready to start once Run
Expand Down Expand Up @@ -103,7 +97,6 @@ func NewAPIServerProxy(zlog *zap.SugaredLogger, restConfig *rest.Config, ts *tsn
upstreamURL: u,
ts: ts,
sendEventFunc: sessionrecording.SendEvent,
eventsEnabled: envknob.Bool(eventsEnabledVar),
}
ap.rp = &httputil.ReverseProxy{
Rewrite: func(pr *httputil.ProxyRequest) {
Expand Down Expand Up @@ -134,11 +127,6 @@ func (ap *APIServerProxy) Run(ctx context.Context) error {
TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)),
}

if ap.eventsEnabled {
counterExperimentalEventsVarUsed.Add(1)
ap.log.Warnf("DEPRECATED: %q environment variable is deprecated, and will be removed in v1.96. See documentation for more detail.", eventsEnabledVar)
}

mode := "noauth"
if ap.authMode {
mode = "auth"
Expand All @@ -163,10 +151,18 @@ func (ap *APIServerProxy) Run(ctx context.Context) error {
}
} else {
var err error
proxyLn, err = net.Listen("tcp", "localhost:80")
baseLn, err := net.Listen("tcp", "localhost:80")
if err != nil {
return fmt.Errorf("could not listen on :80: %w", err)
}
proxyLn = &proxyproto.Listener{
Listener: baseLn,
ReadHeaderTimeout: 10 * time.Second,
ConnPolicy: proxyproto.ConnPolicyFunc(func(opts proxyproto.ConnPolicyOptions) (proxyproto.Policy,
error) {
return proxyproto.REQUIRE, nil
}),
}
serve = ap.hs.Serve
}

Expand Down Expand Up @@ -205,10 +201,6 @@ type APIServerProxy struct {
upstreamURL *url.URL

sendEventFunc func(ap netip.AddrPort, event io.Reader, dial netx.DialFunc) error

// Flag used to enable sending API requests as events to tsrecorder.
// Deprecated: events are now set via ACLs (see https://tailscale.com/kb/1246/tailscale-ssh-session-recording#turn-on-session-recording-in-your-tailnet-policy-file)
eventsEnabled bool
}

// serveDefault is the default handler for Kubernetes API server requests.
Expand Down Expand Up @@ -237,8 +229,7 @@ func (ap *APIServerProxy) serveDefault(w http.ResponseWriter, r *http.Request) {
return
}

// NOTE: (ChaosInTheCRD) ap.eventsEnabled deprecated, remove in v1.96
if c.enableEvents || ap.eventsEnabled {
if c.enableEvents {
if err = ap.recordRequestAsEvent(r, who, c.recorderAddresses, c.failOpen); err != nil {
msg := fmt.Sprintf("error recording Kubernetes API request: %v", err)
ap.log.Errorf(msg)
Expand Down Expand Up @@ -308,8 +299,7 @@ func (ap *APIServerProxy) sessionForProto(w http.ResponseWriter, r *http.Request
return
}

// NOTE: (ChaosInTheCRD) ap.eventsEnabled deprecated, remove in v1.96
if c.enableEvents || ap.eventsEnabled {
if c.enableEvents {
if err = ap.recordRequestAsEvent(r, who, c.recorderAddresses, c.failOpen); err != nil {
msg := fmt.Sprintf("error recording Kubernetes API request: %v", err)
ap.log.Errorf(msg)
Expand Down
2 changes: 1 addition & 1 deletion net/netmon/interfaces.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Tailscale Inc & AUTHORS
// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

package netmon
Expand Down
2 changes: 1 addition & 1 deletion tsnet/example/tsnet-services/tsnet-services.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Tailscale Inc & AUTHORS
// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

// The tsnet-services example demonstrates how to use tsnet with Services.
Expand Down
12 changes: 5 additions & 7 deletions tsnet/example_tsnet_listen_service_multiple_ports_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Tailscale Inc & AUTHORS
// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

package tsnet_test
Expand All @@ -19,21 +19,19 @@ import (
// Service on multiple ports. In this example, we run an HTTPS server on 443 and
// an HTTP server handling pprof requests to the same runtime on 6060.
func ExampleServer_ListenService_multiplePorts() {
s := &tsnet.Server{
Hostname: "tsnet-services-demo",
srv := &tsnet.Server{
Hostname: "shu",
}
defer s.Close()

ln, err := s.ListenService("svc:my-service", tsnet.ServiceModeHTTP{
ln, err := srv.ListenService("svc:my-service", tsnet.ServiceModeHTTP{
HTTPS: true,
Port: 443,
})
if err != nil {
log.Fatal(err)
}
defer ln.Close()

pprofLn, err := s.ListenService("svc:my-service", tsnet.ServiceModeTCP{
pprofLn, err := srv.ListenService("svc:my-service", tsnet.ServiceModeTCP{
Port: 6060,
})
if err != nil {
Expand Down
18 changes: 7 additions & 11 deletions tsnet/example_tsnet_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Tailscale Inc & AUTHORS
// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

package tsnet_test
Expand Down Expand Up @@ -205,19 +205,17 @@ func ExampleServer_ListenFunnel_funnelOnly() {

// ExampleServer_ListenService demonstrates how to advertise an HTTPS Service.
func ExampleServer_ListenService() {
s := &tsnet.Server{
Hostname: "tsnet-services-demo",
srv := &tsnet.Server{
Hostname: "atum",
}
defer s.Close()

ln, err := s.ListenService("svc:my-service", tsnet.ServiceModeHTTP{
ln, err := srv.ListenService("svc:my-service", tsnet.ServiceModeHTTP{
HTTPS: true,
Port: 443,
})
if err != nil {
log.Fatal(err)
}
defer ln.Close()

log.Printf("Listening on https://%v\n", ln.FQDN)
log.Fatal(http.Serve(ln, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
Expand All @@ -238,19 +236,17 @@ func ExampleServer_ListenService_reverseProxy() {
Host: targetAddress,
})

s := &tsnet.Server{
Hostname: "tsnet-services-demo",
srv := &tsnet.Server{
Hostname: "tefnut",
}
defer s.Close()

ln, err := s.ListenService("svc:my-service", tsnet.ServiceModeHTTP{
ln, err := srv.ListenService("svc:my-service", tsnet.ServiceModeHTTP{
HTTPS: true,
Port: 443,
})
if err != nil {
log.Fatal(err)
}
defer ln.Close()

log.Printf("Listening on https://%v\n", ln.FQDN)
log.Fatal(http.Serve(ln, reverseProxy))
Expand Down
Loading
Loading