mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-13 13:55:41 +00:00
Enable kubectl proxy to set tcp keepalive
This commit is contained in:
parent
7a9a30a4f7
commit
204d994aca
@ -93,6 +93,7 @@ func NewCmdProxy(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.
|
|||||||
cmd.Flags().StringP("address", "", "127.0.0.1", "The IP address on which to serve on.")
|
cmd.Flags().StringP("address", "", "127.0.0.1", "The IP address on which to serve on.")
|
||||||
cmd.Flags().Bool("disable-filter", false, "If true, disable request filtering in the proxy. This is dangerous, and can leave you vulnerable to XSRF attacks, when used with an accessible port.")
|
cmd.Flags().Bool("disable-filter", false, "If true, disable request filtering in the proxy. This is dangerous, and can leave you vulnerable to XSRF attacks, when used with an accessible port.")
|
||||||
cmd.Flags().StringP("unix-socket", "u", "", "Unix socket on which to run the proxy.")
|
cmd.Flags().StringP("unix-socket", "u", "", "Unix socket on which to run the proxy.")
|
||||||
|
cmd.Flags().Duration("keepalive", 0, "keepalive specifies the keep-alive period for an active network connection. Set to 0 to disable keepalive.")
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,7 +142,9 @@ func RunProxy(f cmdutil.Factory, out io.Writer, cmd *cobra.Command) error {
|
|||||||
filter = nil
|
filter = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
server, err := proxy.NewServer(staticDir, apiProxyPrefix, staticPrefix, filter, clientConfig)
|
keepalive := cmdutil.GetFlagDuration(cmd, "keepalive")
|
||||||
|
|
||||||
|
server, err := proxy.NewServer(staticDir, apiProxyPrefix, staticPrefix, filter, clientConfig, keepalive)
|
||||||
|
|
||||||
// Separate listening from serving so we can report the bound port
|
// Separate listening from serving so we can report the bound port
|
||||||
// when it is chosen by os (eg: port == 0)
|
// when it is chosen by os (eg: port == 0)
|
||||||
|
@ -158,7 +158,7 @@ func (r *responder) Error(w http.ResponseWriter, req *http.Request, err error) {
|
|||||||
|
|
||||||
// makeUpgradeTransport creates a transport that explicitly bypasses HTTP2 support
|
// makeUpgradeTransport creates a transport that explicitly bypasses HTTP2 support
|
||||||
// for proxy connections that must upgrade.
|
// for proxy connections that must upgrade.
|
||||||
func makeUpgradeTransport(config *rest.Config) (proxy.UpgradeRequestRoundTripper, error) {
|
func makeUpgradeTransport(config *rest.Config, keepalive time.Duration) (proxy.UpgradeRequestRoundTripper, error) {
|
||||||
transportConfig, err := config.TransportConfig()
|
transportConfig, err := config.TransportConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -169,7 +169,12 @@ func makeUpgradeTransport(config *rest.Config) (proxy.UpgradeRequestRoundTripper
|
|||||||
}
|
}
|
||||||
rt := utilnet.SetOldTransportDefaults(&http.Transport{
|
rt := utilnet.SetOldTransportDefaults(&http.Transport{
|
||||||
TLSClientConfig: tlsConfig,
|
TLSClientConfig: tlsConfig,
|
||||||
|
DialContext: (&net.Dialer{
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
KeepAlive: keepalive,
|
||||||
|
}).DialContext,
|
||||||
})
|
})
|
||||||
|
|
||||||
upgrader, err := transport.HTTPWrappersForConfig(transportConfig, proxy.MirrorRequest)
|
upgrader, err := transport.HTTPWrappersForConfig(transportConfig, proxy.MirrorRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -179,7 +184,7 @@ func makeUpgradeTransport(config *rest.Config) (proxy.UpgradeRequestRoundTripper
|
|||||||
|
|
||||||
// NewServer creates and installs a new Server.
|
// NewServer creates and installs a new Server.
|
||||||
// 'filter', if non-nil, protects requests to the api only.
|
// 'filter', if non-nil, protects requests to the api only.
|
||||||
func NewServer(filebase string, apiProxyPrefix string, staticPrefix string, filter *FilterServer, cfg *rest.Config) (*Server, error) {
|
func NewServer(filebase string, apiProxyPrefix string, staticPrefix string, filter *FilterServer, cfg *rest.Config, keepalive time.Duration) (*Server, error) {
|
||||||
host := cfg.Host
|
host := cfg.Host
|
||||||
if !strings.HasSuffix(host, "/") {
|
if !strings.HasSuffix(host, "/") {
|
||||||
host = host + "/"
|
host = host + "/"
|
||||||
@ -194,7 +199,7 @@ func NewServer(filebase string, apiProxyPrefix string, staticPrefix string, filt
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
upgradeTransport, err := makeUpgradeTransport(cfg)
|
upgradeTransport, err := makeUpgradeTransport(cfg, keepalive)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -252,18 +257,6 @@ func newFileHandler(prefix, base string) http.Handler {
|
|||||||
return http.StripPrefix(prefix, http.FileServer(http.Dir(base)))
|
return http.StripPrefix(prefix, http.FileServer(http.Dir(base)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func singleJoiningSlash(a, b string) string {
|
|
||||||
aslash := strings.HasSuffix(a, "/")
|
|
||||||
bslash := strings.HasPrefix(b, "/")
|
|
||||||
switch {
|
|
||||||
case aslash && bslash:
|
|
||||||
return a + b[1:]
|
|
||||||
case !aslash && !bslash:
|
|
||||||
return a + "/" + b
|
|
||||||
}
|
|
||||||
return a + b
|
|
||||||
}
|
|
||||||
|
|
||||||
// like http.StripPrefix, but always leaves an initial slash. (so that our
|
// like http.StripPrefix, but always leaves an initial slash. (so that our
|
||||||
// regexps will work.)
|
// regexps will work.)
|
||||||
func stripLeaveSlash(prefix string, h http.Handler) http.Handler {
|
func stripLeaveSlash(prefix string, h http.Handler) http.Handler {
|
||||||
|
@ -452,7 +452,7 @@ func TestPathHandling(t *testing.T) {
|
|||||||
|
|
||||||
for _, tt := range table {
|
for _, tt := range table {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
p, err := NewServer("", tt.prefix, "/not/used/for/this/test", nil, cc)
|
p, err := NewServer("", tt.prefix, "/not/used/for/this/test", nil, cc, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("%#v: %v", tt, err)
|
t.Fatalf("%#v: %v", tt, err)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user