Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use protobuf in gardener components #3467

Merged
merged 6 commits into from
Feb 2, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
24 changes: 17 additions & 7 deletions cmd/gardener-apiserver/app/gardener_apiserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,26 +158,31 @@ func (o *Options) config(kubeAPIServerConfig *rest.Config, kubeClient *kubernete

// Initialize admission plugins
o.Recommended.ExtraAdmissionInitializers = func(c *genericapiserver.RecommendedConfig) ([]admission.PluginInitializer, error) {
protobufLoopbackConfig := *gardenerAPIServerConfig.LoopbackClientConfig
if protobufLoopbackConfig.ContentType == "" {
protobufLoopbackConfig.ContentType = runtime.ContentTypeProtobuf
ialidzhikov marked this conversation as resolved.
Show resolved Hide resolved
}

// core client
coreClient, err := gardencoreclientset.NewForConfig(gardenerAPIServerConfig.LoopbackClientConfig)
coreClient, err := gardencoreclientset.NewForConfig(&protobufLoopbackConfig)
if err != nil {
return nil, err
}
o.CoreInformerFactory = gardencoreinformers.NewSharedInformerFactory(coreClient, gardenerAPIServerConfig.LoopbackClientConfig.Timeout)
o.CoreInformerFactory = gardencoreinformers.NewSharedInformerFactory(coreClient, protobufLoopbackConfig.Timeout)

// versioned core client
versionedCoreClient, err := gardenversionedcoreclientset.NewForConfig(gardenerAPIServerConfig.LoopbackClientConfig)
versionedCoreClient, err := gardenversionedcoreclientset.NewForConfig(&protobufLoopbackConfig)
if err != nil {
return nil, err
}
o.ExternalCoreInformerFactory = gardenexternalcoreinformers.NewSharedInformerFactory(versionedCoreClient, gardenerAPIServerConfig.LoopbackClientConfig.Timeout)
o.ExternalCoreInformerFactory = gardenexternalcoreinformers.NewSharedInformerFactory(versionedCoreClient, protobufLoopbackConfig.Timeout)

// settings client
settingsClient, err := settingsclientset.NewForConfig(gardenerAPIServerConfig.LoopbackClientConfig)
settingsClient, err := settingsclientset.NewForConfig(&protobufLoopbackConfig)
if err != nil {
return nil, err
}
o.SettingsInformerFactory = settingsinformer.NewSharedInformerFactory(settingsClient, gardenerAPIServerConfig.LoopbackClientConfig.Timeout)
o.SettingsInformerFactory = settingsinformer.NewSharedInformerFactory(settingsClient, protobufLoopbackConfig.Timeout)

// dynamic client
dynamicClient, err := dynamic.NewForConfig(kubeAPIServerConfig)
Expand Down Expand Up @@ -223,8 +228,13 @@ func (o Options) run(stopCh <-chan struct{}) error {
return err
}

protobufConfig := *kubeAPIServerConfig
if protobufConfig.ContentType == "" {
protobufConfig.ContentType = runtime.ContentTypeProtobuf
ialidzhikov marked this conversation as resolved.
Show resolved Hide resolved
}

// kube client
kubeClient, err := kubernetes.NewForConfig(kubeAPIServerConfig)
kubeClient, err := kubernetes.NewForConfig(&protobufConfig)
if err != nil {
return err
}
Expand Down
44 changes: 37 additions & 7 deletions pkg/client/kubernetes/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,10 @@ import (
"errors"
"fmt"

gardencoreclientset "github.com/gardener/gardener/pkg/client/core/clientset/versioned"
versionutils "github.com/gardener/gardener/pkg/utils/version"

corev1 "k8s.io/api/core/v1"
apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
kubernetesclientset "k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
Expand All @@ -32,6 +31,12 @@ import (
apiserviceclientset "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset"
"sigs.k8s.io/controller-runtime/pkg/cache"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"

gardencoreclientset "github.com/gardener/gardener/pkg/client/core/clientset/versioned"
gardenercorescheme "github.com/gardener/gardener/pkg/client/core/clientset/versioned/scheme"
settingsscheme "github.com/gardener/gardener/pkg/client/settings/clientset/versioned/scheme"
versionutils "github.com/gardener/gardener/pkg/utils/version"
)

var (
Expand All @@ -44,6 +49,16 @@ var (
// KubeConfig is the key to the kubeconfig
const KubeConfig = "kubeconfig"

func init() {
// enable protobuf for Gardener API for controller-runtime clients
protobufSchemeBuilder := runtime.NewSchemeBuilder(
gardenercorescheme.AddToScheme,
settingsscheme.AddToScheme,
timebertt marked this conversation as resolved.
Show resolved Hide resolved
)

utilruntime.Must(apiutil.AddToProtobufScheme(protobufSchemeBuilder.AddToScheme))
}

// NewClientFromFile creates a new Client struct for a given kubeconfig. The kubeconfig will be
// read from the filesystem at location <kubeconfigPath>. If given, <masterURL> overrides the
// master URL in the kubeconfig.
Expand Down Expand Up @@ -270,22 +285,26 @@ func newClientSet(conf *Config) (Interface, error) {
runtimeClient = directClient
}

kubernetes, err := kubernetesclientset.NewForConfig(conf.restConfig)
// prepare rest config with contentType defaulted to protobuf for client-go style clients that either talk to
// kubernetes or aggregated APIs that support protobuf.
cfg := defaultContentTypeProtobuf(conf.restConfig)

kubernetes, err := kubernetesclientset.NewForConfig(cfg)
if err != nil {
return nil, err
}

gardenCore, err := gardencoreclientset.NewForConfig(conf.restConfig)
gardenCore, err := gardencoreclientset.NewForConfig(cfg)
if err != nil {
return nil, err
}

apiRegistration, err := apiserviceclientset.NewForConfig(conf.restConfig)
apiRegistration, err := apiserviceclientset.NewForConfig(cfg)
if err != nil {
return nil, err
}

apiExtension, err := apiextensionsclientset.NewForConfig(conf.restConfig)
apiExtension, err := apiextensionsclientset.NewForConfig(cfg)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -315,5 +334,16 @@ func newClientSet(conf *Config) (Interface, error) {
}

func setConfigDefaults(conf *Config) error {
// we can't default to protobuf ContentType here, otherwise controller-runtime clients will also try to talk to
// CRD resources (e.g. extension CRs in the Seed) using protobuf, but CRDs don't support protobuf
// see https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#advanced-features-and-flexibility
return setClientOptionsDefaults(conf.restConfig, &conf.clientOptions)
}

func defaultContentTypeProtobuf(c *rest.Config) *rest.Config {
config := *c
if config.ContentType == "" {
config.ContentType = runtime.ContentTypeProtobuf
}
return &config
}