目录

Client-go多集群客户端

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

动机

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

编码

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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")
}

总结

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