创建 Client-go 多集群客户端的方法。
动机
最近在想要搞一个 web 后台来管理多个 kubernetes 集群,结合 gin 实现前端多集群切换,于是找了一下网上相关资料,找了几篇类似的,于是拿过来改一下代码,后面再结合一下 gin 就可以试试了。
编码
-
为了简单性,我们用 serviceaccount 的 token 来创建 client-go 客户端。
-
为了方便,我们省去了 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")
}
|
总结
现在试过已经没问题了,后面等有空的时候再想下前端要怎么实现。