2017-04-18 167 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在檢索到的對象中是空的。解決這個問題的最好方法是什麼? –