2017-04-18 166 views
1

我对golang比较新,需要一些帮助指向正确的方向。无法为Kubernetes API类型声明声明Kind类型

我试图申报一个新的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 struct是一个未导出的字段。

我该如何声明Kind?

回答

0

使用嵌入式结构时,密钥通常是没有包的类型名称。你可以声明TypeMeta这样的:

test := v1beta1.Deployment{ 
    TypeMeta: metav1.TypeMeta{ 
    APIVersion: "apps/v1beta1", 
    Kind: "Deployment", 
    }, 
} 

然而,任何Kubernetes API对象上手动设置TypeMeta通常只需要如果您打算保存这些对象自己(例如,生成YAML文件)。

当使用Kubernetes客户端API(例如,使用k8s.io/client-go包)交谈的API服务器,你就不需要在TypeMeta财产,因为所有的API操作强烈反正所有类型可以安全地推断元数据。毕竟,API版本和v1beta1.Deployment结构的类型应该(对于客户端库)是显而易见的。

+0

我正在使用客户端去获取资源,并需要使用“Kind”作为一些开关决定,但Kind在检索到的对象中是空的。解决这个问题的最好方法是什么? –