如何解决扩展 kubernetes client-go
我正在编写一个控制器来监视 kubernetes service 对象,并在它们包含某个标签时创建 trafficsplits。
由于原生kubernetes go客户端不支持trafficsplit对象,我不得不想办法扩展客户端,让它识别自定义资源。 我发现这个 guide 很有帮助,让我可以像这样解决这个问题 -
import (
"splitClientV1alpha1 "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned/typed/split/v1alpha1"
"k8s.io/client-go/kubernetes"
...
)
// getting ./kube/config from file
kubehome := filepath.Join(homedir.HomeDir(),".kube","config")
// Building the config from file
kubeConfig,err = clientcmd.BuildConfigFromFlags("",kubehome)
if err != nil {
return fmt.Errorf("error loading kubernetes configuration: %w",err)
}
// Creating the native client object
kubeClient,err := kubernetes.NewForConfig(kubeConfig)
if err != nil {
return fmt.Errorf("error creating kubernetes client: %w",err)
}
// Creating another clientset exclusively for the custom resource
splitClient,err := splitClientV1alpha1.NewForConfig(kubeConfig)
if err != nil {
return fmt.Errorf("error creating split client: %s",err)
}
我觉得必须有一种方法可以使用 trafficsplit 模式扩展 kubeClient 对象,而不是像我那样创建一个单独的客户端。有什么办法可以做到这一点吗?
解决方法
这绝对有可能!你想使用 go 的结构扩展特性:)
基本上,我们创建了一个扩展 kubernetes.Clientset
和 splitClientV1alpha1.SplitV1alpha1Client
的结构,并使用与您上面的代码非常相似的代码对其进行初始化。然后我们可以在该结构上使用来自任一客户端的方法。
import (
"fmt"
splitClientV1alpha1 "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned/typed/split/v1alpha1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
"path/filepath"
)
type MyKubeClient struct {
kubernetes.Clientset
splitClientV1alpha1.SplitV1alpha1Client
}
func getClient() (*MyKubeClient,error) {
// getting ./kube/config from file
kubehome := filepath.Join(homedir.HomeDir(),".kube","config")
// Building the config from file
kubeConfig,err := clientcmd.BuildConfigFromFlags("",kubehome)
if err != nil {
return nil,fmt.Errorf("error loading kubernetes configuration: %w",err)
}
// Creating the native client object
kubeClient,err := kubernetes.NewForConfig(kubeConfig)
if err != nil {
return nil,fmt.Errorf("error creating kubernetes client: %w",err)
}
// Creating another clientset exclusively for the custom resource
splitClient,err := splitClientV1alpha1.NewForConfig(kubeConfig)
if err != nil {
return nil,fmt.Errorf("error creating split client: %s",err)
}
return &MyKubeClient{
Clientset: *kubeClient,SplitV1alpha1Client: *splitClient,},nil
}
func doSomething() error {
client,err := getClient()
if err != nil {
return err
}
client.CoreV1().Pods("").Create(...)
client.TrafficSplits(...)
}
如果您需要将自定义客户端传递给只需要原始 kubernetes.ClientSet
的函数,您可以使用:
func doSomething() error {
client,err := getClient()
if err != nil {
return err
}
useClientSet(&client.Clientset)
}
func useOriginalKubeClientSet(clientSet *kubernetes.Clientset) {
# ... do things
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。