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,分别支持将数据缓存在磁盘文件或内存中。