Skip to content

Commit 911efe7

Browse files
committed
clusterapi: refresh kubeconfig bearer tokens for management and workload kubeconfigs dynamically
1 parent ec783d2 commit 911efe7

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

cluster-autoscaler/cloudprovider/clusterapi/clusterapi_provider.go

+30-1
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@ limitations under the License.
1717
package clusterapi
1818

1919
import (
20+
"fmt"
21+
"net/http"
2022
"reflect"
2123

2224
corev1 "k8s.io/api/core/v1"
2325
"k8s.io/apimachinery/pkg/api/resource"
26+
utilnet "k8s.io/apimachinery/pkg/util/net"
2427
"k8s.io/client-go/discovery"
2528
"k8s.io/client-go/discovery/cached/memory"
2629
"k8s.io/client-go/dynamic"
@@ -158,13 +161,22 @@ func BuildClusterAPI(opts config.AutoscalingOptions, do cloudprovider.NodeGroupD
158161
if err != nil {
159162
klog.Fatalf("cannot build management cluster config: %v", err)
160163
}
164+
if managementConfig.BearerToken != "" && !opts.ClusterAPICloudConfigAuthoritative {
165+
managementConfig.Wrap(func(rt http.RoundTripper) http.RoundTripper {
166+
return &bearerAuthRoundTripper{rt: rt, kubeconfigPath: managementKubeconfig}
167+
})
168+
}
161169

162170
workloadKubeconfig := opts.KubeConfigPath
163-
164171
workloadConfig, err := clientcmd.BuildConfigFromFlags("", workloadKubeconfig)
165172
if err != nil {
166173
klog.Fatalf("cannot build workload cluster config: %v", err)
167174
}
175+
if workloadConfig.BearerToken != "" {
176+
workloadConfig.Wrap(func(rt http.RoundTripper) http.RoundTripper {
177+
return &bearerAuthRoundTripper{rt: rt, kubeconfigPath: workloadKubeconfig}
178+
})
179+
}
168180

169181
// Grab a dynamic interface that we can create informers from
170182
managementClient, err := dynamic.NewForConfig(managementConfig)
@@ -207,3 +219,20 @@ func BuildClusterAPI(opts config.AutoscalingOptions, do cloudprovider.NodeGroupD
207219

208220
return newProvider(cloudprovider.ClusterAPIProviderName, rl, controller)
209221
}
222+
223+
type bearerAuthRoundTripper struct {
224+
kubeconfigPath string
225+
rt http.RoundTripper
226+
}
227+
228+
func (rt bearerAuthRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
229+
req = utilnet.CloneRequest(req)
230+
kubeConfig, err := clientcmd.BuildConfigFromFlags("", rt.kubeconfigPath)
231+
if err != nil {
232+
return nil, fmt.Errorf("cannot build kube cluster config: %w", err)
233+
}
234+
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", kubeConfig.BearerToken))
235+
return rt.rt.RoundTrip(req)
236+
}
237+
238+
var _ http.RoundTripper = &bearerAuthRoundTripper{}

0 commit comments

Comments
 (0)