Skip to main content
Glama
kube_client.go2.83 kB
package utils import ( "fmt" "os" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/klog/v2" ) // GetRestConfigByClusterID 中文函数注释:可选注入的解析器,根据 ClusterID 返回对应的 RestConfig。 // 通过在外部(service 包)设置该回调,避免 utils 包直接依赖具体的集群服务,便于 lease、leader 等模块复用。 var GetRestConfigByClusterID func(clusterID string) *rest.Config // GetClientSet 中文函数注释:获取 Kubernetes ClientSet。 // 优先顺序: // 1. 指定 ClusterID(外部集群) // 2. InCluster 配置 // 3. 本地 KUBECONFIG 或 ~/.kube/config // 返回值第二个布尔含义:是否存在可用集群(用于决定是否进行选举/租约相关操作)。 func GetClientSet(clusterID string) (*kubernetes.Clientset, bool, error) { // 如果提供了 ClusterID,优先尝试使用指定集群的配置 if clusterID != "" { klog.V(6).Infof("[leader] 尝试使用指定的 ClusterID 获取配置:%s", clusterID) // 通过注入的回调解析 ClusterID → RestConfig,避免直接依赖 service 包 if GetRestConfigByClusterID != nil { restCfg := GetRestConfigByClusterID(clusterID) if restCfg != nil { clientset, err := kubernetes.NewForConfig(restCfg) if err == nil { klog.V(6).Infof("[leader] 已使用指定集群的配置创建 ClientSet:%s", clusterID) // 找到可用集群 return clientset, true, nil } klog.V(6).Infof("[leader] 使用指定集群创建 ClientSet 失败:%v,继续尝试 InCluster 配置", err) } else { klog.V(6).Infof("[leader] 指定集群未提供 RestConfig:%s,继续尝试 InCluster 配置", clusterID) } } else { klog.V(6).Infof("[leader] 未注入 ClusterID 解析器,继续尝试 InCluster 配置") } } // 尝试 InCluster 模式 config, err := rest.InClusterConfig() if err == nil { clientset, cErr := kubernetes.NewForConfig(config) if cErr == nil { return clientset, true, nil } klog.V(6).Infof("InCluster 创建 ClientSet 失败:%v,继续尝试本地 kubeconfig", cErr) } klog.V(6).Infof("未指定宿主集群ID、未检测到InCluster模式,获取 ClientSet 失败:%v", err) return nil, false, nil } // DetectNamespace 中文函数注释:自动检测当前运行的命名空间;InCluster 读取 SA 文件,否则返回 default。 func DetectNamespace() string { data, err := os.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace") if err == nil { return string(data) } return "default" } // GenerateInstanceID 生成当前实例的唯一身份标识,规则为 hostname-随机3位。 func GenerateInstanceID() string { id, err := os.Hostname() if err != nil || id == "" { id = "unknown-host" } return fmt.Sprintf("%s-%s", id, RandNLengthString(3)) }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/weibaohui/k8m'

If you have feedback or need assistance with the MCP directory API, please join our Discord server