# Client-go多集群客户端


创建 Client-go 多集群客户端的方法。

<!--more-->

## 动机

最近在想要搞一个 web 后台来管理多个 kubernetes 集群，结合 gin 实现前端多集群切换，于是找了一下网上相关资料，找了几篇类似的，于是拿过来改一下代码，后面再结合一下 gin 就可以试试了。

## 编码

1. 为了简单性，我们用 serviceaccount 的 token 来创建 client-go 客户端。

2. 为了方便，我们省去了 ca 证书部分的验证。

```golang
package main

import (
    "context"
    "log"

    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
)

type K8sConfig struct {
    Name  string // 集群名称
    Host  string // 集群地址
    Token string // Token
}

type Controller struct{
    clients map[string]*rest.Config
}

var (
    allConfig = []K8sConfig{
        {
            Name:  "test",
            Host:  "https://192.168.21.120:6443",
            Token: "eyJhbGciOiJSUzI1NiIsImtpZCI6...", // 存放 serviceaccount对应secret的token
        },
        {
            Name:  "edge",
            Host:  "https://192.168.22.162:6443",
            Token: "eyJhbGciOiJSUzI1NiIsImtpZCI6...", // 存放 serviceaccount对应secret的token
        },
    }
    // 可继续添加其他集群配置
)

// 初始化客户端，并存入变量供后续使用
func (c *Controller) NewClustersConfig() {
    // 存放所有客户端的配置
    var clients = make(map[string]*rest.Config, 0)
    for _, env := range allConfig {
        clients[env.Name] = &rest.Config{
            Host:            env.Host,
            BearerToken:     env.Token,
            BearerTokenFile: "",
            TLSClientConfig: rest.TLSClientConfig{
                Insecure: true,  // 设置为true时 不需要CA
            },
        }
    }
    c.clients = clients
}

// GetPodByName 获取pod信息
func (c *Controller) GetPodByName (env, namespace, podname string) {
    clientset, err := kubernetes.NewForConfig(c.clients[env])
    if err != nil {
        log.Println("NewForConfig Err:", err)
        return
    }
    pod, err := clientset.CoreV1().Pods(namespace).Get(context.Background(), podname, metav1.GetOptions{})
    if err != nil {
        log.Println("GetPod Err:", err)
        return
    }
    log.Println("获取到pod:", pod.Name)
}

// 测试一下
func main() {
    c := &Controller{}
    c.NewClustersConfig()
    c.GetPodByName("test", "cattle-system", "cattle-cluster-agent-6b56976958-mdvzs")
    c.GetPodByName("edge", "kubeedge", "cloudcore-679b5bcc54-tdgct")
}
```

## 总结

现在试过已经没问题了，后面等有空的时候再想下前端要怎么实现。

