概要
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, | 等。