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
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"`
|
|
}
|