无法 return 任何 k8s client-go 对象
Unable to return any k8s client-go objects
我必须遵循以下代码:
包分析器
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
这似乎没有意义。我试图直接 return v1beta1.DeploymentList
本身,但我得到了同样的错误。我以前在 Golang 中从未遇到过这种情况。
这种模式在k8s.io/client-go
中似乎是故意的。
- 这背后的原理是什么?
- 像这样编写函数的惯用方式是什么?
- golang 的 feature/pattern 是什么允许一个人编写这样的函数,其他人可以调用和检查 returned 对象但不能 return 它们进一步?
另附上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
)
所以问题出在错误的导入上。
基本上Deployments
都是在apps/v1beta2
中定义的。我正在做的是导入 "k8s.io/api/apps/v1beta1"
。我需要将其更改为 "k8s.io/api/apps/v1beta2"
另外为了获取我需要参考 clientset.AppsV1beta2()
而不是 clientset.ExtensionsV1beta1()
您返回的类型与声明的类型相同但是它抛出错误,cannot use deploys.Items (variable of type []v1beta1.Deployment) as []v1beta1.Deployment value in the return statement.
因为你导入了部署apiGroupextensions/v1beta1对应的("k8s.io/api/apps/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{})
我必须遵循以下代码:
包分析器
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
这似乎没有意义。我试图直接 return v1beta1.DeploymentList
本身,但我得到了同样的错误。我以前在 Golang 中从未遇到过这种情况。
这种模式在k8s.io/client-go
中似乎是故意的。
- 这背后的原理是什么?
- 像这样编写函数的惯用方式是什么?
- golang 的 feature/pattern 是什么允许一个人编写这样的函数,其他人可以调用和检查 returned 对象但不能 return 它们进一步?
另附上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
)
所以问题出在错误的导入上。
基本上Deployments
都是在apps/v1beta2
中定义的。我正在做的是导入 "k8s.io/api/apps/v1beta1"
。我需要将其更改为 "k8s.io/api/apps/v1beta2"
另外为了获取我需要参考 clientset.AppsV1beta2()
而不是 clientset.ExtensionsV1beta1()
您返回的类型与声明的类型相同但是它抛出错误,cannot use deploys.Items (variable of type []v1beta1.Deployment) as []v1beta1.Deployment value in the return statement.
因为你导入了部署apiGroupextensions/v1beta1对应的("k8s.io/api/apps/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{})