无法为Kubernetes API类型声明声明Kind类型

时间:2017-04-18 03:05:53

标签: go kubernetes

我对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?

1 个答案:

答案 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结构的类型应该是(并且对于客户端库)显而易见。