成功最有效的方法就是向有经验的人学习!

RESTClient技术原理简单分析

RESTClient

RESTClient原理

client-go作为K8s官方给我们提供的与apiserver进行交互的工具库,他提供了几个client供我们使用
首先在开始之前需要设置我们的环境
K8S版本:v1.23.3

minikube start --registry-mirror=https://registry.docker-cn.com --image-mirror-country cn --kubernetes-version=v1.23.3

client-go版本:v0.23.3

client-go的版本最好与k8s对应,可以使用client-go的v0.23.3或者是kubernetes-1.23.3两个版本都可以


client-go中提供的client类型:

  • RESTClient:最基础的客户端,提供最基础的封装。
  • Clientset:是一个client的集合,在client中包含了所有K8S内置资源的client,通过clientset便可以很方便的操作如pod,service这些资源。
  • dynamicClient:动态客户端,可以操作任意K8S的资源,包括CRD定义的资源。
  • DiscoveryClient:用于发现K8S提供的资源组,资源版本和资源信息,如:kubectl api-resources就是通过这个client实现的。

RESTClient的使用

  • RESTClientFor:为创建RESTClient准备config,比如限速器,编解码器等。
  • UnversionedRESTClientFor:与RESTClientFor类似,只是允许config.GroupVersion为空
config,err := clientcmd.BuildConfigFromFlags("",*kubeconfig)  //创建一个config
...
client,err := RESTClientFor(config)   //通过config创建一个restclient

RESTClient示例

package main

import (
    "context"
    "fmt"
    v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    config
    conf, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedFileName) //masterurl为空会从config里面获取
    if err != nil {
        panic(err)
    }

    //client
    conf.GroupVersion = &v1.SchemeGroupVersion
    conf.NegotiatedSerializer = scheme.Codecs
    conf.APIPath="/api"
    restClient, err := rest.RESTClientFor(conf)
    if err != nil {
        panic(err)
    }

    //get data
    pod := v1.Pod{}
    err = restClient.Get().Namespace("default").Resource("pods").Name("busybox-8spwk").Do(context.TODO()).Into(&pod)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf(pod.Name)
    }
}

Clientset的使用

主要用于操作K8S内建资源

...
config,err := clientcmd.BuildConfigFromFlags("",*kubeconfig)  //创建一个config
if err != nil {
  panic(err)
}
clientset,err := kubernetes.NewForConfig(config)
deploymentsClient := clientset.AppsV1().Deployments()
...

Clientset示例

package main

import (
    "context"
    "fmt"
    v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)
您暂时无权查看此隐藏内容!

dynamicClient的使用

可以操作K8S内建资源同时也可以操作自定义资源

...
config,err := clientcmd.BuildConfigFromFlags("",*kubeconfig)  //创建一个config
if err != nil {
  panic(err)
}
client,err := dynamic.NewForConfig(config)
...

DiscoveryClient的使用

这个client主要是用来查apiserver提供的api-sources

...
config,err := clientcmd.BuildConfigFromFlags("",*kubeconfig)  //创建一个config
if err != nil {
  panic(err)
}
client,err := discovery.NewDiscoveryClientForConfig(config)
...

另外还有两个DiscoveryClient,分别支持将数据缓存在磁盘文件或内存中。

内容查看本文隐藏内容查看需要消耗4土豆币,请先
土豆币按需购买,不退换,请考虑清楚后购买。
赞(1) 打赏
未经允许不得转载:陈桂林博客 » RESTClient技术原理简单分析

大佬们的评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

全新“一站式”建站,高质量、高售后的一条龙服务

橙子建站.极速智能建站8折购买虚拟主机

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏