如何通过Golang代码获取当前Kubernetes服务端版本
Kubernetes服务端版本获取实现方案
两种实现方式底层逻辑完全一致,都是直接调用apiserver的/version接口,仅单次HTTP请求,性能无差异,可根据项目已有依赖选择即可。
方案1:基于client-go实现(最通用)
如果项目直接依赖client-go,这是最直接的实现方式,kubectl底层也是调用该接口获取版本:
package main import ( "log" "path/filepath" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" ) func main() { // 加载kubeconfig,集群内运行时可传空字符串自动读取ServiceAccount配置 var kubeconfigPath string if home := homedir.HomeDir(); home != "" { kubeconfigPath = filepath.Join(home, ".kube", "config") } config, err := clientcmd.BuildConfigFromFlags("", kubeconfigPath) if err != nil { log.Fatalf("加载kubeconfig失败: %v", err) } // 初始化clientset clientset, err := kubernetes.NewForConfig(config) if err != nil { log.Fatalf("初始化clientset失败: %v", err) } // 直接调用DiscoveryClient接口获取版本 serverVersion, err := clientset.Discovery().ServerVersion() if err != nil { log.Fatalf("获取服务端版本失败: %v", err) } // 可直接取对应字段使用,GitVersion和kubectl version输出的版本号完全一致 log.Printf("K8s服务端版本:%s,大版本:%s,小版本:%s", serverVersion.GitVersion, serverVersion.Major, serverVersion.Minor) }
需要导入的依赖:k8s.io/client-go/kubernetes
方案2:基于controller-runtime实现
如果是Operator项目已经依赖了controller-runtime,不需要额外引入client-go的完整依赖,复用已加载的RestConfig即可实现:
package main import ( "log" "k8s.io/client-go/discovery" "sigs.k8s.io/controller-runtime/pkg/client/config" ) func main() { // 复用controller-runtime的配置加载逻辑 cfg, err := config.GetConfig() if err != nil { log.Fatalf("加载集群配置失败: %v", err) } // 直接用配置构造DiscoveryClient dClient, err := discovery.NewDiscoveryClientForConfig(cfg) if err != nil { log.Fatalf("初始化DiscoveryClient失败: %v", err) } serverVersion, err := dClient.ServerVersion() if err != nil { log.Fatalf("获取服务端版本失败: %v", err) } log.Printf("K8s服务端版本:%s", serverVersion.GitVersion) }
内容的提问来源于stack exchange,提问作者jtee
相关产品推荐
相关产品推荐

