diff --git a/.changeset/khaki-rocks-do.md b/.changeset/khaki-rocks-do.md new file mode 100644 index 0000000000..a9eb55d533 --- /dev/null +++ b/.changeset/khaki-rocks-do.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Add WebSocket support to `kubernetes-backend` proxy. diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 8e8fd54c77..7e03d863b8 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -135,20 +135,26 @@ export class KubernetesProxy { const logger = this.logger.child({ cluster: originalCluster.name }); middleware = createProxyMiddleware({ logProvider: () => logger, + ws: true, secure: !originalCluster.skipTLSVerify, changeOrigin: true, + pathRewrite: { [`^${originalReq.baseUrl}`]: '' }, router: async req => { - // Re-evaluate the cluster on each request, in case it has changed - const cluster = await this.getClusterForRequest(req); + const isWS = req.headers.upgrade === 'websocket'; + const cluster = isWS + ? originalCluster + : await this.getClusterForRequest(req); const url = new URL(cluster.url); + const ca = bufferFromFileOrString('', cluster.caData)?.toString(); + + // Re-evaluate the cluster on each request, in case it has changed return { protocol: url.protocol, host: url.hostname, port: url.port, - ca: bufferFromFileOrString('', cluster.caData)?.toString(), + ca, }; }, - pathRewrite: { [`^${originalReq.baseUrl}`]: '' }, onError: (error, req, res) => { const wrappedError = new ForwardedError( `Cluster '${originalCluster.name}' request error`,