天天看點

client-go閱讀和使用(一) Client用戶端對象

1.RESTClient用戶端

  • 最基礎的用戶端。其他用戶端都是基于它實作。ClientSet用戶端

2.ClientSet用戶端

  • 最經常使用的用戶端。需要提前知道Resource所在的Group和對應的Version資訊。
  • 不能直接通路CRD資源。需要通過client-gen重新生成ClientSet才能通路。
// Clientset contains the clients for groups. Each group has exactly one
// version included in a Clientset.
type Clientset struct {
    *discovery.DiscoveryClient
    argoprojV1alpha1 *argoprojv1alpha1.ArgoprojV1alpha1Client
}

// ArgoprojV1alpha1 retrieves the ArgoprojV1alpha1Client
func (c *Clientset) ArgoprojV1alpha1() argoprojv1alpha1.ArgoprojV1alpha1Interface {
    return c.argoprojV1alpha1
}

// Discovery retrieves the DiscoveryClient
func (c *Clientset) Discovery() discovery.DiscoveryInterface {
    if c == nil {
        return nil
    }
    return c.DiscoveryClient
}

// NewForConfig creates a new Clientset for the given config.
// If config's RateLimiter is not set and QPS and Burst are acceptable,
// NewForConfig will generate a rate-limiter in configShallowCopy.
func NewForConfig(c *rest.Config) (*Clientset, error) {
    configShallowCopy := *c
    if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 {
        if configShallowCopy.Burst <= 0 {
            return nil, fmt.Errorf("burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0")
        }
        configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst)
    }
    var cs Clientset
    var err error
    cs.argoprojV1alpha1, err = argoprojv1alpha1.NewForConfig(&configShallowCopy)
    if err != nil {
        return nil, err
    }

    cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy)
    if err != nil {
        return nil, err
    }
    return &cs, nil
}
           

3.DynamicClient用戶端

  • 可以對任意kubernetes資源進行RESTful操作,包括crd
  • 轉換成Unstructured結構類型,Unstructured結構類型是通過map[string]interface{}轉換的
type ResourceInterface interface {
   Create(ctx context.Context, obj *unstructured.Unstructured, options metav1.CreateOptions, subresources ...string) (*unstructured.Unstructured, error)
   Update(ctx context.Context, obj *unstructured.Unstructured, options metav1.UpdateOptions, subresources ...string) (*unstructured.Unstructured, error)
   UpdateStatus(ctx context.Context, obj *unstructured.Unstructured, options metav1.UpdateOptions) (*unstructured.Unstructured, error)
   Delete(ctx context.Context, name string, options metav1.DeleteOptions, subresources ...string) error
   DeleteCollection(ctx context.Context, options metav1.DeleteOptions, listOptions metav1.ListOptions) error
   Get(ctx context.Context, name string, options metav1.GetOptions, subresources ...string) (*unstructured.Unstructured, error)
   List(ctx context.Context, opts metav1.ListOptions) (*unstructured.UnstructuredList, error)
   Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error)
   Patch(ctx context.Context, name string, pt types.PatchType, data []byte, options metav1.PatchOptions, subresources ...string) (*unstructured.Unstructured, error)
}
           
// Unstructured allows objects that do not have Golang structs registered to be manipulated
// generically. This can be used to deal with the API objects from a plug-in. Unstructured
// objects still have functioning TypeMeta features-- kind, version, etc.
//
// WARNING: This object has accessors for the v1 standard metadata. You *MUST NOT* use this
// type if you are dealing with objects that are not in the server meta v1 schema.
//
// TODO: make the serialization part of this type distinct from the field accessors.
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// +k8s:deepcopy-gen=true
type Unstructured struct {
   // Object is a JSON compatible map with string, float, int, bool, []interface{}, or
   // map[string]interface{}
   // children.
   Object map[string]interface{}
}

var _ metav1.Object = &Unstructured{}
var _ runtime.Unstructured = &Unstructured{}
var _ metav1.ListInterface = &Unstructured{}
           

4.DiscoveryClient用戶端

  • 主要用于發現Kubernetes API Server所支援的資源組,資源版本,資源資訊。
  • 可以将上述資訊存儲到本地,用于本地緩存(cache)。
// DiscoveryInterface holds the methods that discover server-supported API groups,
// versions and resources.
type DiscoveryInterface interface {
   RESTClient() restclient.Interface
   ServerGroupsInterface
   ServerResourcesInterface
   ServerVersionInterface
   OpenAPISchemaInterface
}

// CachedDiscoveryInterface is a DiscoveryInterface with cache invalidation and freshness.
// Note that If the ServerResourcesForGroupVersion method returns a cache miss
// error, the user needs to explicitly call Invalidate to clear the cache,
// otherwise the same cache miss error will be returned next time.
type CachedDiscoveryInterface interface {
   DiscoveryInterface
   // Fresh is supposed to tell the caller whether or not to retry if the cache
   // fails to find something (false = retry, true = no need to retry).
   //
   // TODO: this needs to be revisited, this interface can't be locked properly
   // and doesn't make a lot of sense.
   Fresh() bool
   // Invalidate enforces that no cached data that is older than the current time
   // is used.
   Invalidate()
}