August 02, 2020
Read Kubernetes API data using Golang
Get the API client.
import (
"fmt"
"context"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// use the current context in kubeconfig
config, err := clientcmd.BuildConfigFromFlags("", "<path_to_KUBECONFIG>")
if err != nil {
panic(err.Error())
}
// create the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
Usage examples:
- read data about servers
nodeList, err := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err.Error())
}
- read data about pods
namespace := "example" // leave empty to get data from all namespaces
podList, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err.Error())
}
In the above examples, ListOptions
can take two important strings, field selectors and label selectors. This can be used for filtering results.
metav1.ListOptions{
LabelSelector: "labelName=labelKey",
FieldSelector: "spec.nodeName=<node_name>", // Example for filtering by node name
}
Field selectors and label selectors on this case operate in the same way that the CLI options for kubectl do. So, the same rules apply here.
Further reading
Official docs on Field Selectors and Labels.