RESTClient是所有客户端的父类
它提供了RESTful对应方法的封装,如:Get Put Post等,通过这些封装的方法和K8s的APIServer
进行交互。
获取pod列表信息:
前提条件:
1.要有k8s的配置文件
2.保证开发机能连接到集群
首先加载配置文件,生成config对象
config, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
if err != nil {
panic(err.Error())
}
配置api路径
config.APIPath = "api" //pods ,/api/v1/pods
//config.APIPath= "apis" //deploy ,/apis/apps/v1/namespaces/{namespace}/deployments/{deployment}
配置分组版本
config.GroupVersion = &corev1.SchemeGroupVersion //无名资源组 , group:”“ ,version”v1“
配置数据的编解码工具
config.NegotiatedSerializer = scheme.Codecs
实例化restclient
对象
restClient, err := rest.RESTClientFor(config)
if err != nil {
panic(err.Error())
}
定义接受返回值的变量
result := &corev1.PodList{}
和APIserver交互
err = restClient.Get(). //get请求方式
Namespace("kube-system"). //指定命名空间
Resource("pods"). //指定需要查询的资源。传递资源名称
VersionedParams(&metav1.ListOptions{}, scheme.ParameterCodec). //参数及参加参数的序列化工具
Do(context.TODO()). //触发请求
Into(result) //写入返回结果
if err != nil {
panic(err.Error())
}
查看结果
for _, item := range result.Items{
fmt.Printf("namespace :%v , name: %v \n", item.Namespace,item.Name)
}
所有代码:
package main
import (
"context"
"fmt"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/kubectl/pkg/scheme"
)
func main() {
config, err := clientcmd.BuildConfigFromFlags("", "~/.kube/config")
if err != nil {
panic(err.Error())
}
config.APIPath = "api" //pods ,/api/v1/pods
config.GroupVersion = &corev1.SchemeGroupVersion //无名资源组 , group:”“ ,version”v1“
config.NegotiatedSerializer = scheme.Codecs
restClient, err := rest.RESTClientFor(config)
if err != nil {
panic(err.Error())
}
result := &corev1.PodList{}
err = restClient.Get(). //get请求方式
Namespace("kube-system"). //指定命名空间
Resource("pod"). //指定需要查询的资源。传递资源名称
VersionedParams(&metav1.ListOptions{}, scheme.ParameterCodec). //参数及参加参数的序列化工具
Do(context.TODO()). //触发请求
Into(result) //写入返回结果
if err != nil {
panic(err.Error())
}
/*
GET定义了一个请求方式,返回了一个Request结构体对象。这个结构体对象,就是结构体访问APIserver请求用的
依次执行了Namespace,Resource,VersionedParams,构建与APIserver交互的参数。
Do方法通过request发起请求,然后通过transformResponse解析请求返回,并绑定到对应资源对象的结构体对象上,这里的话,就表示corev1.PodList的对象。
request方法先检查了有没有可用的Client,然后开始调用http包的功能
*/
for _, item := range result.Items{
fmt.Printf("namespace :%v , name: %v \n", item.Namespace,item.Name)
}
}