Use client generator to generate all k8s clients and add respective client-go metrics (#2668)

* Define client generator to generate all k8s clients
* Increase QPS and burst values
* Capture client-go metrics
* Support for controller runtime metrics

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>
This commit is contained in:
Sanket Sudake
2022-12-13 14:19:36 +05:30
committed by GitHub
parent 31f4f8c57e
commit 5fae765323
26 changed files with 252 additions and 137 deletions
+57 -72
View File
@@ -19,7 +19,6 @@ package crd
import (
"context"
"errors"
"os"
"time"
"go.uber.org/zap"
@@ -29,64 +28,76 @@ import (
"k8s.io/client-go/kubernetes"
_ "k8s.io/client-go/plugin/pkg/client/auth"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
metricsclient "k8s.io/metrics/pkg/client/clientset/versioned"
"sigs.k8s.io/controller-runtime/pkg/client/config"
"github.com/fission/fission/pkg/generated/clientset/versioned"
"github.com/fission/fission/pkg/utils"
)
// GetKubernetesClient gets a kubernetes client using the kubeconfig file at the
// environment var $KUBECONFIG, or an in-cluster config if that's
// undefined.
func GetKubernetesClient() (*rest.Config, kubernetes.Interface, apiextensionsclient.Interface, metricsclient.Interface, error) {
var config *rest.Config
var err error
// get the config, either from kubeconfig or using our
// in-cluster service account
kubeConfig := os.Getenv("KUBECONFIG")
if len(kubeConfig) != 0 {
config, err = clientcmd.BuildConfigFromFlags("", kubeConfig)
if err != nil {
return nil, nil, nil, nil, err
}
} else {
config, err = rest.InClusterConfig()
if err != nil {
return nil, nil, nil, nil, err
}
}
// creates the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, nil, nil, nil, err
}
apiExtClientset, err := apiextensionsclient.NewForConfig(config)
if err != nil {
return nil, nil, nil, nil, err
}
metricsClient, _ := metricsclient.NewForConfig(config)
return config, clientset, apiExtClientset, metricsClient, nil
type ClientGenerator struct {
restConfig *rest.Config
}
func MakeFissionClient() (versioned.Interface, kubernetes.Interface, apiextensionsclient.Interface, metricsclient.Interface, error) {
config, kubeClient, apiExtClient, metricsClient, err := GetKubernetesClient()
if err != nil {
return nil, nil, nil, nil, err
func (cg *ClientGenerator) getRestConfig() (*rest.Config, error) {
if cg.restConfig != nil {
return cg.restConfig, nil
}
// make a CRD REST client with the config
crdClient, err := versioned.NewForConfig(config)
var err error
cg.restConfig, err = config.GetConfig()
if err != nil {
return nil, nil, nil, nil, err
return nil, err
}
return cg.restConfig, nil
}
return crdClient, kubeClient, apiExtClient, metricsClient, nil
func (cg *ClientGenerator) GetFissionClient() (versioned.Interface, error) {
config, err := cg.getRestConfig()
if err != nil {
return nil, err
}
return versioned.NewForConfig(config)
}
func (cg *ClientGenerator) GetKubernetesClient() (kubernetes.Interface, error) {
config, err := cg.getRestConfig()
if err != nil {
return nil, err
}
return kubernetes.NewForConfig(config)
}
func (cg *ClientGenerator) GetApiExtensionsClient() (apiextensionsclient.Interface, error) {
config, err := cg.getRestConfig()
if err != nil {
return nil, err
}
return apiextensionsclient.NewForConfig(config)
}
func (cg *ClientGenerator) GetMetricsClient() (metricsclient.Interface, error) {
config, err := cg.getRestConfig()
if err != nil {
return nil, err
}
return metricsclient.NewForConfig(config)
}
func (cg *ClientGenerator) GetDynamicClient() (dynamic.Interface, error) {
config, err := cg.getRestConfig()
if err != nil {
return nil, err
}
return dynamic.NewForConfig(config)
}
func NewClientGenerator() *ClientGenerator {
return &ClientGenerator{}
}
func NewClientGeneratorWithRestConfig(restConfig *rest.Config) *ClientGenerator {
return &ClientGenerator{restConfig: restConfig}
}
// WaitForCRDs does a timeout to check if CRDs have been installed
@@ -111,29 +122,3 @@ func WaitForCRDs(ctx context.Context, logger *zap.Logger, fissionClient versione
}
}
}
// GetDynamicClient creates and returns new dynamic client or returns an error
func GetDynamicClient() (dynamic.Interface, error) {
var config *rest.Config
var err error
// get the config, either from kubeconfig or using our
// in-cluster service account
kubeConfig := os.Getenv("KUBECONFIG")
if len(kubeConfig) != 0 {
config, err = clientcmd.BuildConfigFromFlags("", kubeConfig)
if err != nil {
return nil, err
}
} else {
config, err = rest.InClusterConfig()
if err != nil {
return nil, err
}
}
dynamicClient, err := dynamic.NewForConfig(config)
if err != nil {
return nil, err
}
return dynamicClient, nil
}