You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
3.7 KiB

package test
import (
"context"
"k8s-manager/handler/common"
"log"
"k8s.io/apimachinery/pkg/runtime"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/tools/clientcmd"
)
// DynamicClientPods native resource
func DynamicClientPods() {
// 1. 加载配置
config, err := clientcmd.BuildConfigFromFlags("", "../"+common.KubeConfigPath)
if err != nil {
log.Fatalln(err)
}
// 2. 获取客户端
dynamicClient, err := dynamic.NewForConfig(config)
if err != nil {
log.Fatalln(err)
}
// 3. 获取资源,pod list
// 基于 gvr 来获取
gvr := schema.GroupVersionResource{
Group: "",
Version: "v1",
Resource: "pods",
}
// 发出请求,获取资源
namespace := "kube-system"
unstructruedList, err := dynamicClient.
Resource(gvr).
Namespace(namespace).
List(context.Background(), metav1.ListOptions{})
if err != nil {
log.Fatalln(err)
}
// 4. 从未结构化类型转换到具体的资源类型,重要
// 定义目标类型,由于是原生资源,可以直接使用包中定义的类型
podList := &corev1.PodList{}
// untructured to podlist 转换
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unstructruedList.UnstructuredContent(), podList); err != nil {
log.Fatalln(err)
}
// 5. 处理结果
for _, pod := range podList.Items {
log.Printf("Name: %s Status: %s\n", pod.Name, pod.Status.Phase)
}
// 结构说明,动态客户端类型
//dynamic.DynamicClient{}
// 未结构化类型
//runtime.Unstructured{}
}
// DynamicClientCrontabs custome resource
func DynamicClientCrontabs() {
// 1. 加载配置
config, err := clientcmd.BuildConfigFromFlags("", "../"+common.KubeConfigPath)
if err != nil {
log.Fatalln(err)
}
// 2. 获取客户端
dynamicClient, err := dynamic.NewForConfig(config)
if err != nil {
log.Fatalln(err)
}
// 3. 获取资源,crontab list
// 基于 gvr 来获取
gvr := schema.GroupVersionResource{
Group: "stable.example.com",
Version: "v1",
Resource: "crontabs",
}
// 发出请求,获取资源
unstructruedList, err := dynamicClient.
Resource(gvr).
List(context.Background(), metav1.ListOptions{})
if err != nil {
log.Fatalln(err)
}
// 4. 从未结构化类型转换到具体的资源类型,重要
// 定义目标类型,由于是原生资源,可以直接使用包中定义的类型
list := &CrontabList{}
// untructured to podlist 转换
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unstructruedList.UnstructuredContent(), list); err != nil {
log.Fatalln(err)
}
// 5. 处理结果
for _, item := range list.Items {
log.Printf("Name: %s Cron: %s\n", item.Name, item.Spec.CronSpec)
}
}
// CrontabList is a list of Crontab.
// 定义资源类型
type CrontabList struct {
// 类型元信息
metav1.TypeMeta `json:",inline"`
// 列表元信息
metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
// 自定义资源列表
Items []Crontab `json:"items" protobuf:"bytes,2,rep,name=items"`
}
// Pod is a collection of containers that can run on a host. This resource is created
// by clients and scheduled onto hosts.
type Crontab struct {
// 类型元信息
metav1.TypeMeta `json:",inline"`
// 列表元信息
metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
// 特定字段
Spec CrontabSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
}
// PodSpec is a description of a pod.
type CrontabSpec struct {
// 自定义的字段
CronSpec string `json:"cronSpec,omitempty" protobuf:"bytes,1,opt,name=cronSpec"`
Image string `json:"image,omitempty" protobuf:"bytes,2,opt,name=image"`
}