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
相关产品推荐
相关产品推荐

