The controller-runtime style Client is more convenient than client-go, and it is widely used in many kubebuilder/operator-sdk based products.
Here is a code snippet to show how to use it:
package main
import (
"context"
"fmt"
"time"
pedia "github.com/clusterpedia-io/client-go/client"
"github.com/clusterpedia-io/client-go/tools/builder"
"github.com/pkg/errors"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
)
func main() {
// build listOptions
options := builder.ListOptionsBuilder().
Clusters("lou1").
Namespaces("kube-system").
Offset(10).
Limit(5).
OrderBy("dsad", false).
Options()
cl, err := GetClient()
if err != nil {
panic(err)
}
pods := &corev1.PodList{}
err = ListResources(pods, &options, cl)
if err != nil {
panic(err)
}
for _, pod := range pods.Items {
fmt.Printf("Name: %v\n", pod.Name)
}
}
func GetClient() (client.Client, error) {
restConfig := ctrl.GetConfigOrDie()
restConfig.Timeout = 10 * time.Second
restConfig, _ = pedia.ConfigFor(restConfig)
scheme := runtime.NewScheme()
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
c, err := client.New(restConfig, client.Options{
Scheme: scheme,
})
if err != nil {
return nil, errors.Wrap(err, "unable to init client")
}
return c, nil
}
func ListResources(obj client.ObjectList, opts *metav1.ListOptions, cl client.Reader) error {
o := &client.ListOptions{Raw: opts, Limit: opts.Limit, Continue: opts.Continue}
return cl.List(context.TODO(), obj, o)
}