• discovery :提供 DiscoveryClient 发现客户端
  • dynamic :提供 DynamicClient 动态客户端
  • informers :每种 kubernetes 资源的 Informer 实现
  • kubernetes :提供 ClientSet 客户端
  • listers :为每一个 Kubernetes 资源提供 Lister 功能,该功能对 Get 和 List 请求提供只读的缓存数据
  • plugin :提供 OpenStack、GCP 和 Azure 等云服务商授权插件
  • rest :提供 RESTClient 客户端,对 Kubernetes API Server 执行 RESTful 操作
  • scale :提供 ScaleClient 客户端,用于扩容或缩容 Deployment、ReplicaSet、Relication Controller 等资源对象
  • tools :提供常用工具,例如 SharedInformer、Reflector、DealtFIFO 及 Indexers。提供 Client 查询和缓存机制,以减少向 kube-apiserver 发起的请求数等
  • transport :提供安全的 TCP 连接,支持 Http Stream,某些操作需要在客户端和容器之间传输二进制流,例如 exec、attach 等操作。该功能由内部的 spdy 包提供支持
  • util :提供常用方法,例如 WorkQueue 功能队列、Certificate 证书管理等
  • Client 客户端对象

    client-go 支持四种客户端对象:

        ClientSet    DynamicClient    DiscoveryClient
            |              |                 |
            ▼              ▼                 ▼
     -------------------------------------------------
    |                  RESTClient                     |
     -------------------------------------------------
     -------------------------------------------------
    |                   kubeconfig                    |
     -------------------------------------------------
    

    RESTClient 客户端

    RESTClient 是最基础的客户端,是对 HTTP Request 进行了封装:

    func main() {
      config, err := clientcmd.BuildConfigFromFlags("", "~/.kube/config")
      config.APIPath = "api"
      config.GroupVersion = &corev1.SchemeGroupVersion
      config.NegotiatedSerializer = scheme.Codecs
      restClient, err := rest.RESTClientFor(config)
      result := &corev1.PodList{}
      err = restClient.Get().
      Namespace("default").
      Resource("pods").
      VersionedParams(&metav1.ListOptions{Limit:500}, scheme.ParameterCodec).
      Do().
      Into(result)
    

    ClientSet 客户端

    ClientSet 在 RESTClient 的基础上封装了对 Resource 和 Version 的管理方法:

    ClientSet 仅能访问 Kubernetes 自身内置的资源(即客户端集合内的资源),不能直接访问 CRD 自定义资源。

    func main() {
      config, err := clientcmd.BuildConfigFromFlags("", "~/.kube/config")
      clientset, err := kubernetes.NewForConfig(config)
      podClient := clientset.CoreV1().Pods(apiv1.NamespaceDefault)
      list, err := podClient.List(metav1.ListOptions{Limit:500})
    

    DynamicClient 客户端

    DynamicClient 是一种动态客户端,它可对任意 Kubernetes 资源进行 RESTful 操作,包括 CRD 自定义资源。

    package main
    import (
    	"fmt"
    	apiv1 "k8s.io/api/core/v1"
    	corev1 "k8s.io/api/core/v1"
    	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    	"k8s.io/apimachinery/pkg/runtime/schema"
    	"k8s.io/client-go/dynamic"
    	"k8s.io/client-go/tools/clientcmd"
    	"k8s.io/kubernetes/staging/src/k8s.io/apimachinery/pkg/runtime"
    func main() {
    	config, err := clientcmd.BuildConfigFromFlags("", "~/.kube/config")
    	if err != nil {
    		panic(err)
    	dynamicClient, err := dynamic.NewForConfig(config)
    	if err != nil {
    		panic(err)
    	gvr := schema.GroupVersionResource{Version: "v1", Resource: "pods"}
    	unstructObj, err := dynamicClient.Resource(gvr).Namespace(apiv1.NamespaceDefault).
    		List(metav1.ListOptions{Limit: 500})
    	if err != nil {
    		panic(err)
    	podList := corev1.PodList{}
    	err = runtime.DefaultUnstructuredConverter.FromUnstructured(
    		unstructObj.UnstructuredContent(), podList)
    	if err != nil {
    		panic(err)
    	for _, d := range podList.Items {
    		fmt.Printf("NAMESPACE: %v \t NAME:%v \t STATU: %+v\n",
    			d.Namespace, d.Name, d.Status.Phase)
    

    DiscoveryClient 客户端

    DiscoveryClient 主要用于发现 Kubernetes API Server 所支持的资源组、资源版本、资源信息。

    package main
    import (
    	"fmt"
    	"k8s.io/apimachinery/pkg/runtime/schema"
    	"k8s.io/client-go/discovery"
    	"k8s.io/client-go/tools/clientcmd"
    func main() {
    	config, err := clientcmd.BuildConfigFromFlags("", "~/.kube/config")
    	if err != nil {
    		panic(err)
    	discoveryClient, err := discovery.NewDiscoveryClientForConfig(config)
    	if err != nil {
    		panic(err)
    	_, APIResourceList, err := discoveryClient.ServerGroupsAndResources()
    	if err != nil {
    		panic(err)
    	for _, list := range APIResourceList {
    		gv, err := schema.ParseGroupVersion(list.GroupVersion)
    		if err != nil {
    			panic(err)
    		for _, resource := range list.APIResources {
    			fmt.Printf("name: %v, group: %v, version: %v\n",
    				resource.Name, gv.Group, gv.Version)