You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中`kubectl get provisioner`的等效替代方案有哪些?

如何用client-go实现类似kubectl get provisioner的功能

首先明确:Kubernetes原生没有名为Provisioner的内置资源对象,kubectl get provisioner实际是获取集群中可用的存储配置器名称(通常对应StorageClass的provisioner字段或CSI驱动名称)。由于client-go没有直接对应的API方法,可通过以下几种自定义方案实现:

方案一:从StorageClass中提取Provisioner名称

所有存储类(StorageClass)都会指定对应的provisioner,通过查询所有StorageClass并去重,即可得到集群中已配置的provisioner列表:

import (
    "context"
    "fmt"
    "k8s.io/client-go/kubernetes"
    "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func listProvisionersFromStorageClasses(clientset *kubernetes.Clientset) error {
    storageClasses, err := clientset.StorageV1().StorageClasses().List(context.TODO(), v1.ListOptions{})
    if err != nil {
        return err
    }

    provisionerSet := make(map[string]struct{})
    for _, sc := range storageClasses.Items {
        provisionerSet[sc.Provisioner] = struct{}{}
    }

    fmt.Println("Available provisioners:")
    for p := range provisionerSet {
        fmt.Printf("- %s\n", p)
    }
    return nil
}

方案二:查询CSIDriver资源(针对CSI类型的Provisioner)

如果集群使用CSI存储驱动,每个驱动都会注册一个CSIDriver资源,其Name字段就是对应的provisioner名称,直接查询该资源即可:

import (
    "context"
    "fmt"
    "k8s.io/client-go/kubernetes"
    "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func listProvisionersFromCSIDrivers(clientset *kubernetes.Clientset) error {
    csidrivers, err := clientset.StorageV1().CSIDrivers().List(context.TODO(), v1.ListOptions{})
    if err != nil {
        return err
    }

    fmt.Println("CSI provisioners:")
    for _, driver := range csidrivers.Items {
        fmt.Printf("- %s\n", driver.Name)
    }
    return nil
}

方案三:直接调用REST接口查询自定义Provisioner资源

如果你的集群中kubectl get provisioner是基于自定义CRD实现的,可通过client-go的RESTClient直接发起请求,前提是要知道该CRD的Group、Version和Resource信息:

import (
    "context"
    "fmt"
    "k8s.io/client-go/kubernetes"
    "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/runtime/schema"
    "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)

func listCustomProvisioners(clientset *kubernetes.Clientset) error {
    // 替换为自定义Provisioner CRD的实际Group、Version、Resource
    gvr := schema.GroupVersionResource{
        Group:    "storage.example.com",
        Version:  "v1",
        Resource: "provisioners",
    }

    var provisionersList unstructured.UnstructuredList
    err := clientset.RESTClient().Get().
        Resource(gvr.Resource).
        VersionedParams(&v1.ListOptions{}, clientset.Scheme().ParameterCodec).
        Do(context.TODO()).
        Into(&provisionersList)
    if err != nil {
        return err
    }

    fmt.Println("Custom provisioners:")
    for _, item := range provisionersList.Items {
        fmt.Printf("- %s\n", item.GetName())
    }
    return nil
}

注意事项

  • 方案一、二适用于Kubernetes原生场景,覆盖绝大多数存储配置器的查询需求;
  • 若使用自定义CRD实现的Provisioner资源,需提前确认其GroupVersionResource信息,再使用方案三。

内容的提问来源于stack exchange,提问作者NoName

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:33:20