前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s客户端简介

k8s客户端简介

原创
作者头像
Xkrroeon
发布2022-09-07 17:16:26
1K0
发布2022-09-07 17:16:26
举报
文章被收录于专栏:云原生与存储云原生与存储

Overview

主要内容是理解并使用client-go四种客户端,为什么需要四种客户端,场景分别是什么,如何初始化四种客户端,并使用四个客户端分别去获取资源。

客户端

Client-go提供了四种客户端,简单描述如下

客户端名称

源码目录

简单描述

RESTClient

client-go/rest/

基础客户端,对HTTP Request进行封装,提供了对应的 RESTful 方法与 Kubernetes APIServer RESTful API 进行交互

Clientset

client-go/kubernetes/

在RESTClient基础上对k8s内置资源进行了封装, 例如AppsV1().Deployments或者CoreV1.Pods,缺点是只能访问k8s内建资源,不能访问CRD自定义资源

DynamicClient

client-go/dynamic/

在RESTClient基础上对任意类型的资源进行了封装,可以对任意的K8S API对象执行通用操作,包括CRD自定义资源

DiscoveryClient

client-go/discovery/

也是在RESTClient基础上封装的,上述客户端都是针对k8s资源对象管理的,而DiscoveryClient用于发现API Server支持的资源组,资源版本和资源信息

RESTClient

RESTClient 是所有客户端的父类,它可以操作 Kubernetes 所有的内置资源对象以及 CRD。RESTClient 底层使用了golang的 net/http 库,将调用 APIServer 的请求进行了封装,对参数和返回结果进行序列化及反序列化。

示例

使用RESTClient 获取指定的deployment资源信息:

代码语言:javascript
复制
func TestRESTClient(t *testing.T) {
    conf, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
    if err != nil {
        t.Fatal(err)
    }
​
    conf.APIPath = "apis"
    conf.GroupVersion = &appsv1.SchemeGroupVersion
    conf.NegotiatedSerializer = legacyscheme.Codecs
​
    client, err := rest.RESTClientFor(conf)
    if err != nil {
        t.Fatal(err)
    }
​
    var deployment appsv1.Deployment
    if err := client.Get().Namespace("rook-ceph").Resource("deployments").Name("rook-ceph-operator").
        Do(context.TODO()).Into(&deployment); err != nil {
        t.Fatal(err)
    }
​
    t.Log(deployment)
}

Clientset

Clientset是根据k8s所有内置资源组的每一个version实现的客户端集合,通过这些资源对象客户端提供的操作方法,即可对 Kubernetes 内置的资源对象进行 Create、Update、Get、List、Delete 等操作。

示例

使用Clientset获取指定的deployment资源信息:

代码语言:javascript
复制
func TestClientset(t *testing.T) {
    conf, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
    if err != nil {
        t.Fatal(err)
    }
​
    client, err := kubernetes.NewForConfig(conf)
    if err != nil {
        t.Fatal(err)
    }
​
    deployment, err := client.AppsV1().Deployments("rook-ceph").Get(context.TODO(), "rook-ceph-operator", metav1.GetOptions{})
    if err != nil {
        t.Fatal(err)
    }
​
    t.Log(deployment)
}

DynamicClient

DynamicClient 是一种动态客户端,通过动态指定资源组、资源版本和资源等信息来操作任意的 k8s 资源对象。

示例

使用DynamicClient 获取指定的deployment资源信息:

代码语言:javascript
复制
func TestDynamicClient(t *testing.T) {
    conf, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
    if err != nil {
        t.Fatal(err)
    }
​
    client, err := dynamic.NewForConfig(conf)
    if err != nil {
        t.Fatal(err)
    }
​
    unst, err := client.Resource(schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}).
        Namespace("rook-ceph").Get(context.TODO(), "rook-ceph-operator", metav1.GetOptions{})
    if err != nil {
        t.Fatal(err)
    }
​
    var deployment appsv1.Deployment
    if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unst.UnstructuredContent(), &deployment); err != nil {
        t.Fatal(err)
    }
​
    t.Log(deployment)
}

DiscoveryClient

DiscoveryClient 是用于查看当前 k8s 集群支持那些资源组、资源版本、资源信息,与以上3种客户端的功能不同。

示例

使用DiscoveryClient 获取当前k8s集群所支持的gvr:

代码语言:javascript
复制
func TestDiscoveryClient(t *testing.T) {
    conf, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
    if err != nil {
        t.Fatal(err)
    }
​
    client, err := discovery.NewDiscoveryClientForConfig(conf)
    if err != nil {
        t.Fatal(err)
    }
​
    _, APIResourceList, err := client.ServerGroupsAndResources()
    if err != nil {
        t.Fatal(err)
    }
​
    for _, r := range APIResourceList {
        gv, err := schema.ParseGroupVersion(r.GroupVersion)
        if err != nil {
            t.Fatal(err)
        }
        for _, resource := range r.APIResources {
            t.Logf("name: %v, group: %v, version %v\n", resource.Name, gv.Group, gv.Version)
        }
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Overview
  • 客户端
    • RESTClient
      • 示例
    • Clientset
      • 示例
    • DynamicClient
      • 示例
    • DiscoveryClient
      • 示例
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档