环境:三台虚拟机部署的k8s集群
一、删除node
通过client-go实现,很简单
// DeleteNode 删除node节点
func DeleteNode(name string) (*common.Response, error) {
err := dao.ClientSet.CoreV1().Nodes().Delete(name, &metav1.DeleteOptions{})
if err != nil {
return nil, err
}
return &common.OK, nil
}
测试
func main() {
// 初始化日志库
log.InitLogger()
// client-go k8s初始化
if err := dao.InitKube(); err != nil {
zap.S().Panicln(err)
}
_, err := service.DeleteNode("node02")
if err != nil {
panic(err)
}
}
结果:node02已被删除
二、添加node
添加node稍微复杂一点,不能直接通过client-go的create进行添加,因为这种方式添加后node不会启动kubelet服务,这里通过ssh调用kubeadm进行join集群
1. ssh配置
2. master创建token
通过ssh调用master的kubeadm,创建token
func createToken() (string, error) {
config := ssh.Config{
Host: conf.MasterInfo.Host,
Port: conf.MasterInfo.Port,
User: conf.MasterInfo.User,
Type: ssh.TypePassword,
Password: conf.MasterInfo.Password,
}
newSsh, err := ssh.NewSsh(config)
if err != nil {
zap.S().Errorln(err)
return "", err
}
defer newSsh.CloseClient()
r, err := newSsh.SendCmd("kubeadm token create --print-join-command 2> /dev/null")
if err != nil {
zap.S().Errorln(err)
return "", err
}
zap.S().Debug(r)
return r, nil
}
3. 批量添加node
- 通过ssh到node,使用第2步创建的token,join到集群
- 在join之前,先reset
- 使用协程,进行批量添加
// CreateNode 添加node
func CreateNode(configs []ssh.Config) (*common.Response, error) {
//node := corev1.Node{
// ObjectMeta: metav1.ObjectMeta{
// Name: name,
// },
//}
//create, err := dao.ClientSet.CoreV1().Nodes().Create(&node)
//if err != nil {
// return nil, err
//}
//fmt.Println(create)
//return &common.OK, nil
token, err := createToken()
if err != nil {
zap.S().Errorln(err)
return nil, err
}
// 使用协程,并行批量添加
group := sync.WaitGroup{}
group.Add(len(configs))
for _, config := range configs {
go func(config ssh.Config) {
zap.S().Info(config)
newSsh, err := ssh.NewSsh(config)
defer newSsh.CloseClient()
if err != nil {
zap.S().Errorln(err)
group.Done()
}
// 在join之前,先reset
reset := "echo y|kubeadm reset"
if _, err = newSsh.SendCmd(reset + "&&" + token); err != nil {
zap.S().Errorln(err)
}
group.Done()
}(config)
}
group.Wait()
return &common.OK, nil
}
4.测试
func main() {
// 初始化日志库
log.InitLogger()
// client-go k8s初始化
if err := dao.InitKube(); err != nil {
zap.S().Panicln(err)
}
_, err := service.CreateNode([]ssh.Config{
{
// node02的ip
Host: "192.168.139.133",
Port: 22,
User: "root",
Type: ssh.TypePassword,
Password: "1234567890",
},
})
if err != nil {
panic(err)
}
}
5. 结果
node02成功加入集群,并且相关服务成功启动