k8s多集群go-client实现

k8s多集群go-client实现

背景

通常我们使用k8s go-client进行基于k8s的容器平台开发,go-client 使用方法GetOutClusterClient读取本地kubeconfig实现,但是多集群这样操作不太方便。

操作方法

  1. 数据库存储多集群信息,包括masterIP,kubeconfig和元数据信息(扩展);
  2. 从数据库捞出集群信息;
  3. 实例化clientset;

核心代码

func InitClient(clusterName string) (*kubernetes.Clientset, *rest.Config, error) {
	//数据库取出集群信息
	master, kubeconfig, err := GetClusterInfo(clusterName)
	if err != nil {
		logs.Error("get db for cluster kubeconfig error. %v ", err)
		return nil, nil, err
	}
	kubeconfigJson, err := yaml.YAMLToJSON([]byte(kubeconfig))
	if err != nil {
		logs.Error("yaml to json err")
	}
	configV1 := clientcmdapiv1.Config{}
	err = json.Unmarshal(kubeconfigJson, &configV1)
	if err != nil {
		logs.Error("json unmarshal kubeconfig error. %v ", err)
		return nil, nil, err
	}
	configObject, err := clientcmdlatest.Scheme.ConvertToVersion(&configV1, clientcmdapi.SchemeGroupVersion)
	if err != nil {
		logs.Error("ConvertToVersion error. %v ", err)
		return nil, nil, err
	}
	configInternal := configObject.(*clientcmdapi.Config)

	// 实例化配置信息
	clientConfig, err := clientcmd.NewDefaultClientConfig(*configInternal, &clientcmd.ConfigOverrides{
		ClusterDefaults: clientcmdapi.Cluster{Server: master},
	}).ClientConfig()

	if err != nil {
		logs.Error("build client config error. %v ", err)
		return nil, nil, err
	}
	clientConfig.QPS = defaultQPS
	clientConfig.Burst = defaultBurst
	// 实例化客户端
	clientSet, err := kubernetes.NewForConfig(clientConfig)

	if err != nil {
		logs.Error("(%s) kubernetes.NewForConfig(%v) error.%v", master, err, clientConfig)
		return nil, nil, err
	}
	return clientSet, clientConfig, nil

}

func GetOutClusterClient(name string) (*K8sClient, error) {
	clientSet, config, err := InitClient(name)
	if err != nil {
		return nil, err
	}
	return &K8sClient{Clientset: clientSet, Config: config}, nil
}

@me:[email protected]

你可能感兴趣的:(k8s,go,paas)