使用golang脚本基于kubeadm创建新的token(问题分析)

 更新时间:2023年10月20日 15:29:59   作者:llody_55  
这篇文章主要介绍了使用golang脚本基于kubeadm创建新的token(问题分析),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

说明

1、这个脚本主要用于解决两个问题:

第一:其实使用python脚本也可以实现,但是python要面对centos7的python2和openeuler的python3不一样的问题

第二:就是多架构的问题和离线的问题。

第三:学习go脚本的实践。

以上问题都有可能导致这个python脚本可能不那么通用。

2、适用场景:

暂时用于配合我前面部署高可用K8S集群时用于过滤出token信息或者token过期时直接生成新的token。

其他扩展还在考虑

脚本用到的逻辑

解析命令行参数

// 定义命令行参数
tokenFlag := flag.Bool("token", false, "重新生成与 kubeadm token create --print-join-command 相同的 token 信息")
flag.Parse()

Go

脚本使用Go语言的flag包来解析命令行参数。它定义了一个名为tokenFlag的命令行标志,用于确定是否重新生成加入命令。

cmd命令行函数

func generateToken() {
	// 调用 kubeadm token create --print-join-command 命令来生成与 kubeadm token create --print-join-command 相同的 token 信息
	cmd := exec.Command("kubeadm", "token", "create", "--print-join-command")
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	err := cmd.Run()
	if err != nil {
		fmt.Println("生成 token 信息时发生错误:", err)
	}
}

Go

generateToken函数的目的是重新生成加入集群的命令。它调用外部命令kubeadm token create --print-join-command来生成新的token和加入命令。

这个命令与python的`subprocess.run`有异曲同工之妙

读取文件和处理文件内容的逻辑

// 打开日志文件
		file, err := os.Open("./k8s_init.log")
		if err != nil {
			fmt.Println("无法打开日志文件:", err)
			return
		}
		defer file.Close()
		// 创建一个带缓冲的文件读取器
		scanner := bufio.NewScanner(file)
		// 设置标志来跟踪是否找到了控制平面和默认行
		inControlPlane := false
		inDefaultLine := false
		// 逐行读取文件内容
		for scanner.Scan() {
			line := scanner.Text()
			// 如果找到包含 "--control-plane" 的行
			if strings.Contains(line, "--control-plane") {
				inControlPlane = true
				fmt.Println(line) // 打印控制平面行
			} else if inControlPlane && strings.Contains(line, "--discovery-token-ca-cert-hash") {
				fmt.Println(line) // 打印相关控制平面行
				inControlPlane = false
			} else if strings.Contains(line, "kubeadm join") {
				fmt.Println(line) // 打印默认行
				inDefaultLine = true
			} else if inDefaultLine && strings.Contains(line, "--discovery-token-ca-cert-hash") {
				fmt.Println(line) // 打印相关默认行
				inDefaultLine = false
			}
		}
		if err := scanner.Err(); err != nil {
			fmt.Println("读取文件时发生错误:", err)
		}

Go

这部分逻辑在主函数的else分支中。它打开名为k8s_init.log的文件,然后逐行读取文件内容,查找控制平面和默认行的标识,并打印相应的行。这部分逻辑根据文件内容的不同来区分并输出控制平面和默认行。

脚本的主要功能是在根据命令行参数来决定是否生成与kubeadm token create --print-join-command相同的token信息。如果-token命令行参数被提供,脚本会调用generateToken函数生成新的token信息;否则,它会读取文件并处理文件内容以区分控制平面和默认行,并输出相应的信息。这使脚本可以用于生成Kubernetes集群的加入命令或分析日志文件中的内容。

完整脚本

package main
import (
	"bufio"
	"flag"
	"fmt"
	"os"
	"os/exec"
	"strings"
)
func main() {
	// 定义命令行参数
	tokenFlag := flag.Bool("token", false, "重新生成与 kubeadm token create --print-join-command 相同的 token 信息")
	flag.Parse()
	if *tokenFlag {
		generateToken()
	} else {
		// 打开日志文件
		file, err := os.Open("./k8s_init.log")
		if err != nil {
			fmt.Println("无法打开日志文件:", err)
			return
		}
		defer file.Close()
		// 创建一个带缓冲的文件读取器
		scanner := bufio.NewScanner(file)
		// 设置标志来跟踪是否找到了控制平面和默认行
		inControlPlane := false
		inDefaultLine := false
		// 逐行读取文件内容
		for scanner.Scan() {
			line := scanner.Text()
			// 如果找到包含 "--control-plane" 的行
			if strings.Contains(line, "--control-plane") {
				inControlPlane = true
				fmt.Println(line) // 打印控制平面行
			} else if inControlPlane && strings.Contains(line, "--discovery-token-ca-cert-hash") {
				fmt.Println(line) // 打印相关控制平面行
				inControlPlane = false
			} else if strings.Contains(line, "kubeadm join") {
				fmt.Println(line) // 打印默认行
				inDefaultLine = true
			} else if inDefaultLine && strings.Contains(line, "--discovery-token-ca-cert-hash") {
				fmt.Println(line) // 打印相关默认行
				inDefaultLine = false
			}
		}
		if err := scanner.Err(); err != nil {
			fmt.Println("读取文件时发生错误:", err)
		}
	}
}
func generateToken() {
	// 调用 kubeadm token create --print-join-command 命令来生成与 kubeadm token create --print-join-command 相同的 token 信息
	cmd := exec.Command("kubeadm", "token", "create", "--print-join-command")
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	err := cmd.Run()
	if err != nil {
		fmt.Println("生成 token 信息时发生错误:", err)
	}
}

Go

使用方法

[root@node1 ~]# ./go_join_amd64 
  kubeadm join apiserver.cluster.local:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:13ddf570d3d11c5c0cda814e823610dae3922d825b60957c1ea288a666fd8f00 \
        --control-plane 
kubeadm join apiserver.cluster.local:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:13ddf570d3d11c5c0cda814e823610dae3922d825b60957c1ea288a666fd8f00 
[root@node1 ~]# ./go_join_amd64 -token
kubeadm join apiserver.cluster.local:6443 --token 5hygoq.z57dqi3bf2jlk61f --discovery-token-ca-cert-hash sha256:13ddf570d3d11c5c0cda814e823610dae3922d825b60957c1ea288a666fd8f00 

Bash

总结

功能只是加了一个token参数用于刷新token而已,主要在于学习golang的文本处理,cmd命令执行,这些都是运维在使用go写脚本最先遇到的问题。

后面想到功能会再增加,写的很烂,如果有问题或者吐槽,欢迎留言。

到此这篇关于使用golang脚本基于kubeadm创建新的token的文章就介绍到这了,更多相关golang kubeadm创建token内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言学习之JSON编码解析与使用

    Go语言学习之JSON编码解析与使用

    这篇文章主要为大家详细介绍了Go语言中JSON编码的解析与使用已经JSON与Map、结构体的互相转化,文中的示例代码讲解详细,需要的可以参考一下
    2023-02-02
  • Golang template 包基本原理分析

    Golang template 包基本原理分析

    这篇文章主要为大家介绍了Golang template 包基本原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 详解Golang如何在编译时注入版本信息

    详解Golang如何在编译时注入版本信息

    这篇文章主要为大家详细介绍了Golang如何在编译时实现注入版本信息,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-06-06
  • Go语言学习之操作MYSQL实现CRUD

    Go语言学习之操作MYSQL实现CRUD

    Go官方提供了database包,database包下有sql/driver。该包用来定义操作数据库的接口,这保证了无论使用哪种数据库,操作方式都是相同的。本文就来和大家聊聊Go语言如何操作MYSQL实现CRUD,希望对大家有所帮助
    2023-02-02
  • 深入解析Go语言中for循环的写法

    深入解析Go语言中for循环的写法

    这篇文章主要介绍了Go语言中for循环的写法,是Golang入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • Goland中Protobuf的安装、配置和使用

    Goland中Protobuf的安装、配置和使用

    本文记录了mac环境下protobuf的编译安装,并通过一个示例来演示proto自动生成go代码,本文使用的mac os 12.3系统,不建议使用homebrew安装,系统版本太高,会安装报错,所以自己下载新版压缩包编译构建安装
    2022-05-05
  • 对Golang import 导入包语法详解

    对Golang import 导入包语法详解

    今天小编就为大家分享一篇对Golang import 导入包语法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • go语言实现通过FTP库自动上传web日志

    go语言实现通过FTP库自动上传web日志

    这篇文章主要介绍了go语言实现通过FTP库自动上传web日志,非常简单实用,需要的小伙伴快来参考下吧。
    2015-03-03
  • 让go程序以后台进程或daemon方式运行方法探究

    让go程序以后台进程或daemon方式运行方法探究

    本文探讨了如何通过Go代码实现在后台运行的程序,最近我用Go语言开发了一个WebSocket服务,我希望它能在后台运行,并在异常退出时自动重新启动,我的整体思路是将程序转为后台进程,也就是守护进程(daemon)
    2024-01-01
  • jenkins配置golang 代码工程自动发布的实现方法

    jenkins配置golang 代码工程自动发布的实现方法

    这篇文章主要介绍了jenkins配置golang 代码工程自动发布,jks是个很好的工具,使用方法也很多,我只用了它简单的功能,对jenkins配置golang相关知识感兴趣的朋友一起看看吧
    2022-07-07

最新评论