From 9118869d049cebca59a24ae86c92eb877aca6509 Mon Sep 17 00:00:00 2001 From: Monis Khan Date: Sat, 18 Jul 2020 23:52:18 -0400 Subject: [PATCH] Use protobuf with built-in Kube REST APIs Signed-off-by: Monis Khan --- cmd/placeholder-name/app/app.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/cmd/placeholder-name/app/app.go b/cmd/placeholder-name/app/app.go index 5b7a5c41..028622df 100644 --- a/cmd/placeholder-name/app/app.go +++ b/cmd/placeholder-name/app/app.go @@ -22,6 +22,7 @@ import ( "golang.org/x/sync/errgroup" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apiserver/pkg/authentication/authenticator" "k8s.io/client-go/kubernetes" @@ -73,19 +74,22 @@ credential from somewhere to an internal credential to be used for authenticating to the Kubernetes API.`, RunE: func(cmd *cobra.Command, args []string) error { // Load the Kubernetes client configuration (kubeconfig), - kubeconfig, err := restclient.InClusterConfig() + kubeConfig, err := restclient.InClusterConfig() if err != nil { return fmt.Errorf("could not load in-cluster configuration: %w", err) } + // explicitly use protobuf when talking to built-in kube APIs + protoKubeConfig := createProtoKubeConfig(kubeConfig) + // Connect to the core Kubernetes API. - k8s, err := kubernetes.NewForConfig(kubeconfig) + k8s, err := kubernetes.NewForConfig(protoKubeConfig) if err != nil { return fmt.Errorf("could not initialize Kubernetes client: %w", err) } // Connect to the Kubernetes aggregation API. - aggregation, err := aggregationv1client.NewForConfig(kubeconfig) + aggregation, err := aggregationv1client.NewForConfig(protoKubeConfig) if err != nil { return fmt.Errorf("could not initialize Kubernetes client: %w", err) } @@ -259,3 +263,13 @@ func runGracefully(ctx context.Context, srv *http.Server, eg *errgroup.Group, f defer cancel() return srv.Shutdown(shutdownCtx) } + +// createProtoKubeConfig returns a copy of the input config with the ContentConfig set to use protobuf. +// do not use this config to communicate with any CRD based APIs. +func createProtoKubeConfig(kubeConfig *restclient.Config) *restclient.Config { + protoKubeConfig := restclient.CopyConfig(kubeConfig) + const protoThenJSON = runtime.ContentTypeProtobuf + "," + runtime.ContentTypeJSON + protoKubeConfig.AcceptContentTypes = protoThenJSON + protoKubeConfig.ContentType = runtime.ContentTypeProtobuf + return protoKubeConfig +}