Skip to content

Commit 4cc2852

Browse files
committed
Migrate kubectl exec to WebSockets from SPDY
Per [KEP-4006](https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/4006-transition-spdy-to-websockets), prioritize trying WebSockets first given it has been the default for 4 versions now and will be the standard going forward. Use a NewFallbackExecutor as is suggested in the KEP to avoid breaking existing use cases. Signed-off-by: andyvandy <vandenhoeven.andrew@gmail.com>
1 parent 5a0efcb commit 4cc2852

1 file changed

Lines changed: 11 additions & 1 deletion

File tree

pkg/driver/kubernetes/client.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"os"
88

99
corev1 "k8s.io/api/core/v1"
10+
"k8s.io/apimachinery/pkg/util/httpstream"
1011
"k8s.io/client-go/kubernetes"
1112
"k8s.io/client-go/kubernetes/scheme"
1213
"k8s.io/client-go/rest"
@@ -115,7 +116,16 @@ func (c *Client) Exec(ctx context.Context, options *ExecStreamOptions) error {
115116
Stderr: options.Stderr != nil,
116117
}, scheme.ParameterCodec)
117118

118-
exec, err := remotecommand.NewSPDYExecutor(c.config, "POST", execRequest.URL())
119+
// Use WebSocket executor which is the default as of Kubernetes 1.31. Fall back to SPDY for older clusters.
120+
websocketExec, err := remotecommand.NewWebSocketExecutor(c.config, "GET", execRequest.URL().String())
121+
if err != nil {
122+
return err
123+
}
124+
spdyExec, err := remotecommand.NewSPDYExecutor(c.config, "POST", execRequest.URL())
125+
if err != nil {
126+
return err
127+
}
128+
exec, err := remotecommand.NewFallbackExecutor(websocketExec, spdyExec, httpstream.IsUpgradeFailure)
119129
if err != nil {
120130
return err
121131
}

0 commit comments

Comments
 (0)