环境:三台虚拟机部署的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配置

参考go通过ssh远程执行cmd

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成功加入集群,并且相关服务成功启动
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐