client-go实战之四:dynamicClient

2021-07-09  本文已影响0人  程序员欣宸

欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

系列文章链接

  1. client-go实战之一:准备工作
  2. client-go实战之二:RESTClient
  3. client-go实战之三:Clientset
  4. client-go实战之四:dynamicClient
  5. client-go实战之五:DiscoveryClient

本篇概览

相关知识储备

Object.runtime

type Object interface {
    GetObjectKind() schema.ObjectKind
    DeepCopyObject() Object
}

Unstructured

{
    "id": 101,
    "name": "Tom"
}
type Person struct {
    ID int
    Name String
}
type Unstructured struct {
    // Object is a JSON compatible map with string, float, int, bool, []interface{}, or
    // map[string]interface{}
    // children.
    Object map[string]interface{}
}
在这里插入图片描述

重要知识点:Unstructured与资源对象的相互转换

// 实例化一个PodList数据结构,用于接收从unstructObj转换后的结果
podList := &apiv1.PodList{}

// unstructObj
err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.UnstructuredContent(), podList)
在这里插入图片描述 在这里插入图片描述

关于dynamicClient

type dynamicClient struct {
    client *rest.RESTClient
}
func (c *dynamicClient) Resource(resource schema.GroupVersionResource) NamespaceableResourceInterface {
    return &dynamicResourceClient{client: c, resource: resource}
}
在这里插入图片描述
  1. 与Clientset不同,dynamicClient为各种类型的资源都提供统一的操作API,资源需要包装为Unstructured数据结构;
  2. 内部使用了Restclient与kubernetes交互;

需求确认

源码下载

名称 链接 备注
项目主页 https://github.com/zq2599/blog_demos 该项目在GitHub上的主页
git仓库地址(https) https://github.com/zq2599/blog_demos.git 该项目源码的仓库地址,https协议
git仓库地址(ssh) git@github.com:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议
在这里插入图片描述 在这里插入图片描述

编码

go mod init dynamicclientdemo
go get k8s.io/api@v0.20.0
go get k8s.io/client-go@v0.20.0
package main

import (
    "context"
    "flag"
    "fmt"
    apiv1 "k8s.io/api/core/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/runtime"
    "k8s.io/apimachinery/pkg/runtime/schema"
    "k8s.io/client-go/dynamic"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/homedir"
    "path/filepath"
)

func main() {

    var kubeconfig *string

    // home是家目录,如果能取得家目录的值,就可以用来做默认值
    if home:=homedir.HomeDir(); home != "" {
        // 如果输入了kubeconfig参数,该参数的值就是kubeconfig文件的绝对路径,
        // 如果没有输入kubeconfig参数,就用默认路径~/.kube/config
        kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
    } else {
        // 如果取不到当前用户的家目录,就没办法设置kubeconfig的默认目录了,只能从入参中取
        kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
    }

    flag.Parse()

    // 从本机加载kubeconfig配置文件,因此第一个参数为空字符串
    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)

    // kubeconfig加载失败就直接退出了
    if err != nil {
        panic(err.Error())
    }

    dynamicClient, err := dynamic.NewForConfig(config)

    if err != nil {
        panic(err.Error())
    }

    // dynamicClient的唯一关联方法所需的入参
    gvr := schema.GroupVersionResource{Version: "v1", Resource: "pods"}

    // 使用dynamicClient的查询列表方法,查询指定namespace下的所有pod,
    // 注意此方法返回的数据结构类型是UnstructuredList
    unstructObj, err := dynamicClient.
        Resource(gvr).
        Namespace("kube-system").
        List(context.TODO(), metav1.ListOptions{Limit: 100})

    if err != nil {
        panic(err.Error())
    }

    // 实例化一个PodList数据结构,用于接收从unstructObj转换后的结果
    podList := &apiv1.PodList{}

    // 转换
    err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.UnstructuredContent(), podList)

    if err != nil {
        panic(err.Error())
    }

    // 表头
    fmt.Printf("namespace\t status\t\t name\n")

    // 每个pod都打印namespace、status.Phase、name三个字段
    for _, d := range podList.Items {
        fmt.Printf("%v\t %v\t %v\n",
            d.Namespace,
            d.Status.Phase,
            d.Name)
    }
}
  1. Resource方法指定了本次操作的资源类型;
  2. List方法向kubernetes发起请求;
  3. FromUnstructured将Unstructured数据结构转成PodList,其原理前面已经分析过;
zhaoqin@zhaoqindeMBP-2 dynamicclientdemo % go run main.go
namespace        status          name
kube-system      Running         coredns-7f89b7bc75-5pdwc
kube-system      Running         coredns-7f89b7bc75-nvbvm
kube-system      Running         etcd-hedy
kube-system      Running         kube-apiserver-hedy
kube-system      Running         kube-controller-manager-hedy
kube-system      Running         kube-flannel-ds-v84vc
kube-system      Running         kube-proxy-hlppx
kube-system      Running         kube-scheduler-hedy

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos

上一篇 下一篇

猜你喜欢

热点阅读