登录
首页 >  Golang >  Go问答

扩展 kubernetes client-go

来源:stackoverflow

时间:2024-03-16 20:18:30 501浏览 收藏

**摘要** 在扩展 Kubernetes 客户端时,您可能需要识别自定义资源,例如流量分割。虽然文档建议使用单独的客户端,但本文提供了一种替代方法,使用 Go 的结构扩展功能。通过创建扩展原始 Kubernetes 客户端和自定义客户端的结构,您可以访问两种客户端的方法,从而简化了使用自定义资源的过程。本文将逐步指导您完成此过程,并提供一个示例代码段,展示如何初始化和使用扩展的客户端。

问题内容

我正在编写一个控制器,用于监视 kubernetes 服务对象,并在它们包含特定标签时创建流量分割。

由于原生 kubernetes go 客户端不支持 trafficsplit 对象,我必须找到一种方法并扩展客户端,以便它能够识别自定义资源。 我发现这个指南很有帮助,让我能够像这样解决问题 -

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)
}

我觉得必须有一种方法可以使用流量分割模式扩展 kubeclient 对象,而不是像我一样创建单独的客户端。有什么办法可以实现这一点吗?


解决方案


这绝对是可能的!你想使用 go 的结构扩展功能:)

基本上,我们创建一个扩展 kubernetes.clientsetsplitclientv1alpha1.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
}

以上就是《扩展 kubernetes client-go》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>