client-go如何根据yaml模板创建出API对象

594 阅读1分钟

概要

client-go可以根据内存中的API对象,向API Server发送创建请求,创建出一个API对象。在某些场景中,我们的yaml模板是固定的,需要通过yaml文件模板创建出API对象。

实现步骤

1. 根据yaml创建出API对象

因为Kubernetes是有CRD的,因此本节可分为内置对象的创建和CRD对象的创建

1.1 创建内置对象

以apps/v1/development为例,代码如下

import (
    appsv1 "k8s.io/api/apps/v1"
)

func fun() interface{} {
    buf ,_ := ioutils.ReadFile(filename) 
    var deployment = &appsv1.Deployment{}
    _, _, err = scheme.Codecs.UniversalDeserializer().Decode(buf, nil, deployment)
    if err != nil {
            klog.Fatalf("Decode err %v", err)
    }
    klog.Infof("deploy is %s", deployment.Name)
    return deployment
}

1.2 创建CRD对象

需要引入crd实现所在的包,假设是crd.example.come/pkg/apis/crd/v1alpha1

import (
    "k8s.io/client-go/kubernetes/scheme"
    crdv1alpha1 "crd.example.come/pkg/apis/crd/v1alpha1"
    "k8s.io/apimachinery/pkg/runtime/serializer"
)
func fun() interface{} {
        sch := runtime.NewScheme()
	err = scheme.AddToScheme(sch)
	if err != nil {
		klog.Fatalf("scheme err %v", err)
	}
	err = crdv1alpha1.AddToScheme(sch)
	if err != nil {
		klog.Fatalf("crdv1alpha1 err %v", err)
	}
	decodeFunc := serializer.NewCodecFactory(sch).UniversalDeserializer().Decode
	obj, gvk, err := decodeFunc(buf, nil, nil)
	if err != nil {
		klog.Fatalf("Decode err %v", err)
	}
	klog.Infof("gvk is %v", gvk)

	crd, ok := obj.(*crdv1alpha1.crd)
        return crd
}

2.读取yaml模板,并填充数据

go官方有2个template包,这里应该使用text/template

func fun() interface{} {
    buf, _ := ioutil.ReadFile(deploymentTemplPath)
    t := template.New("deployment")
    t, err = t.Parse(string(buf))
    if err != nil {
            klog.Fatalf("Parse err %v", err)
    }
    var data DeployTemplData
    var buf bytes.Buffer
    err := t.Execute(&buf, data)
    if err != nil {
            klog.Fatalf("Execute err %v", err)
    }
    return buf.Bytes()
}

template包基础知识

template包其实非常简单,它使用{{ .Field }}来表示传入的data的公开成员Field,因为Go不允许成员和成员函数同名,所以这个Field也可以是一个成员函数名。

其他常用的功能包括 Range, print,if-else, | 等。

参考链接

  1. medium.com/@harshjniit…
  2. www.cnblogs.com/lczmx/p/132…