无法返回任何k8s客户端go对象

无法返回任何k8s客户端go对象,go,kubernetes,client-go,Go,Kubernetes,Client Go,我必须输入以下代码: 包装分析器 import ( "context" "os" "path/filepath" "k8s.io/api/apps/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "k8s.io/c

我必须输入以下代码:

包装分析器

import (
    "context"
    "os"
    "path/filepath"

    "k8s.io/api/apps/v1beta1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

    "k8s.io/client-go/kubernetes"
    _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
    "k8s.io/client-go/tools/clientcmd"
)

func getClientSetFromConfig() (*kubernetes.Clientset, error) {
    kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube/config")
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        panic(err)
    }

    return kubernetes.NewForConfig(config)
}

func GetDeploys() []v1beta1.Deployment {
    clientset, err := getClientSetFromConfig()
    if err != nil {
        panic(err)
    }

    deploys, err := clientset.ExtensionsV1beta1().Deployments("").List(context.Background(), metav1.ListOptions{})
    if err != nil {
        panic(err)
    }

    return deploys.Items
}
我得到以下错误:

cannot use deploys.Items (variable of type []v1beta1.Deployment) as []v1beta1.Deployment value in return statement
这似乎没有道理。我试图直接返回
v1beta1.DeploymentList
,但我得到了相同的错误。我以前在Golang从未遇到过这种情况

k8s.io/client go
中,这种模式似乎是经过深思熟虑的

  • 这背后的理由是什么
  • 这样写函数的惯用方式是什么
  • golang的什么特性/模式允许编写这样的函数,其他人可以调用和检查返回的对象,但不能进一步返回它们
另外,附加
go.mod
文件以供参考

module upgrades

go 1.14

require (
    github.com/fsnotify/fsnotify v1.4.9 // indirect
    github.com/imdario/mergo v0.3.9 // indirect
    github.com/mitchellh/go-homedir v1.1.0
    github.com/mitchellh/mapstructure v1.3.2 // indirect
    github.com/pelletier/go-toml v1.8.0 // indirect
    github.com/spf13/afero v1.2.2 // indirect
    github.com/spf13/cast v1.3.1 // indirect
    github.com/spf13/cobra v1.0.0
    github.com/spf13/jwalterweatherman v1.1.0 // indirect
    github.com/spf13/pflag v1.0.5 // indirect
    github.com/spf13/viper v1.7.0
    github.com/tealeg/xlsx v1.0.5
    golang.org/x/sys v0.0.0-20200610111108-226ff32320da // indirect
    gopkg.in/ini.v1 v1.57.0 // indirect
    k8s.io/api v0.18.3
    k8s.io/apimachinery v0.18.3
    k8s.io/client-go v0.18.3
    k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 // indirect
)

所以问题在于错误的进口

基本上,
部署
是在
apps/v1beta2
中定义的。我所做的是导入
“k8s.io/api/apps/v1beta1”
。我需要将其更改为
“k8s.io/api/apps/v1beta2”


另外,为了获取我需要引用的
clientset.AppsV1beta2()
而不是
clientset.ExtensionsV1beta1()

,您返回的类型与声明的类型相同,但它引发了一个错误,
无法在return语句中将deploys.Items(类型为[]v1beta1.Deployment的变量)用作[]v1beta1.Deployment值

因为您导入了与部署apiGroup extensions/v1beta1对应的错误包(
“k8s.io/api/apps/v1beta1”

  • 如果您正在导入软件包
    “k8s.io/api/apps/v1beta1”
    ,则应通过以下方式获取部署:

    deployments,\:=clientset.AppsV1beta1().deployments(“”).List(metav1.ListOptions{})

  • 如果您正在导入包
    “k8s.io/api/extensions/v1beta1”
    ,则可以列出如下部署:


  • deployments,\:=clientset.ExtensionsV1beta1().deployments(“”.List(metav1.ListOptions{})

    必须显示所有导入语句和所有相关代码。很可能有两个软件包使用了不同的版本(您是否提供了一些东西?。@Volker我认为这与不同的软件包版本无关,我可以看到
    k8s.io/api
    k8s.io/apimachine
    k8s.io/client go
    中的所有3个都在
    v0.18.3
    上。另外,如果我只是打印部署而不是返回部署,它也可以正常工作