我对golang相对较新,需要一些指向正确方向的帮助。
我试图声明一个新的Deployment
类型。
我的导入如下:
import (
"encoding/json"
"fmt"
yaml "gopkg.in/yaml.v2"
"io/ioutil"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
)
当我尝试创建像:
这样的部署对象时 test := v1beta1.Deployment{
Spec: v1beta1.DeploymentSpec{
Template: v1.PodTemplateSpec{
Spec: v1.PodSpec{
Containers: []v1.Container{{
Name: "test",
Image: "image_url",
},
},
},
},
},
}
它可以工作,但返回的部署对象没有Kind
,这是识别对象所必需的。
根据https://github.com/kubernetes/kubernetes/blob/master/pkg/apis/extensions/types.go#L162
有一个嵌入式metav1.TypeMeta
,其中包含我需要的Kind
对象。 (供参考:https://github.com/kubernetes/apimachinery/blob/master/pkg/apis/meta/v1/types.go#L38)
我尝试在结构文字中声明metav1.TypeMeta
,如:
test := v1beta1.Deployment{
metav1.TypeMeta: metav1.TypeMeta{Kind: "Deployment"}
Spec: v1beta1.DeploymentSpec{
Template: v1.PodTemplateSpec{
Spec: v1.PodSpec{
Containers: []v1.Container{{
Name: "test",
Image: "image_url",
},
},
},
},
},
}
但我得到了
unknown field '"k8s.io/apimachinery/pkg/apis/meta/v1".TypeMeta' in struct literal of type v1beta1.Deployment
我怀疑这是由于metav1.TypeMeta
结构中的Deployment
声明是未导出的字段。
我应该如何申报Kind?
答案 0 :(得分:0)
使用嵌入式结构时,键通常是没有包的类型名称。您可以像这样声明TypeMeta
:
test := v1beta1.Deployment{
TypeMeta: metav1.TypeMeta{
APIVersion: "apps/v1beta1",
Kind: "Deployment",
},
}
但是,如果您计划自己保留这些对象(例如,生成YAML文件),则通常只需在任何Kubernetes API对象上手动设置TypeMeta
。
使用Kubernetes客户端API(例如,使用k8s.io/client-go包)与API服务器通信时,您将不需要TypeMeta
属性,因为所有API操作都是强类型的无论如何,可以安全地推断出所有元数据。毕竟,API版本和v1beta1.Deployment
结构的类型应该是(并且对于客户端库)显而易见。