logo

Kubernetes - Development

Last Updated: 2023-01-15

How to get the client?

You need a client to talk to the k8s cluster.

In controller-runtime: client.Client is defined in sigs.k8s.io/controller-runtime/pkg/client

controller-runtime depends on client-go. There 2 types of clients:

  • typed: k8s.io/client-go/kubernets.ClientSet
  • dynamic: k8s.io/client-go/dynamic.Interface

kubeconfig => clientSet

bytesArray := []byte(*kubeconfig)

clientConfig ,err:= clientcmd.NewClientConfigFromBytes(bytesArray)
if err!=nil {
	logs.Error(err.Error())
	return nil
}

restConfig, _ := clientConfig.ClientConfig()
clientSet, err := kubernetes.NewForConfig(restConfig)

kubeconfig => dynamic client

dynamic client has no knowledge about the resource you want to consume

config, err := rest.InClusterConfig()
if err != nil {
    return nil, err
}

dynClient, err := dynamic.NewForConfig(config)
if err != nil {
    return nil, err
}

How to create new obj?

import "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"

obj = &foo.Bar{
    ObjectMeta: metav1.ObjectMeta{
        Name:      "name",
        Namespace:  "namespace",
    },
}
controllerutil.CreateOrUpdate(ctx, client, obj, func () error {
    // mutation logic, i.e. modify obj based on existing states.
})

How to update status?

client.Status().Update(ctx, obj)

How to get object key?

client.ObjectKeyFromObject(adminKubeconfig)

How to retry?

retry.RetryOnConflict(retryBackoff, func() error {
    //logic
})

How to get kubeconfig from secrets?

capiconfig "sigs.k8s.io/cluster-api/util/kubeconfig"

nn := types.NamespacedName{
  Name: consts.RootAdminClusterName,
  Namespace: consts.RootAdminClusterNamespace,
}
kubeconfig, err := capiconfig.FromSecret(ctx, client, nn)

Client Getter to Client

clientConfig, err := clientGetter.ToRESTConfig()
if err != nil {
    return err
}
client, err := client.New(clientConfig, client.Options{})
if err != nil {
    return err
}