为了账号安全,请及时绑定邮箱和手机立即绑定

无法返回任何 k8s client-go 对象

无法返回任何 k8s client-go 对象

Go
凤凰求蛊 2022-06-13 10:34:37
我必须遵循代码:包分析器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 upgradesgo 1.14require (    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)
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

您返回的类型与声明的类型相同,但它会引发错误, cannot use deploys.Items (variable of type []v1beta1.Deployment) as []v1beta1.Deployment value in the return statement.

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

  1. 如果您正在导入包"k8s.io/api/apps/v1beta1",那么您应该通过以下方式获取部署:

    deployments, _ := clientset.AppsV1beta1().Deployments("").List(metav1.ListOptions{})

  2. 如果您正在导入包"k8s.io/api/extensions/v1beta1",那么您可以列出部署,例如:

deployments, _:=clientset.ExtensionsV1beta1().Deployments("").List(metav1.ListOptions{})


查看完整回答
反对 回复 2022-06-13
?
温温酱

TA贡献1752条经验 获得超4个赞

所以问题在于错误的进口。

基本上Deployments都定义在apps/v1beta2. 我正在做的是导入"k8s.io/api/apps/v1beta1". 我需要将其更改为"k8s.io/api/apps/v1beta2"

也用于获取我需要引用clientset.AppsV1beta2()而不是clientset.ExtensionsV1beta1()


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信