使用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语言中map集合的具体使用

    Go语言中map集合的具体使用

    本文主要介绍了Go语言中map集合的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 使用Golang创建单独的WebSocket会话

    使用Golang创建单独的WebSocket会话

    WebSocket是一种在Web开发中非常常见的通信协议,它提供了双向、持久的连接,适用于实时数据传输和实时通信场景,本文将介绍如何使用 Golang 创建单独的 WebSocket 会话,包括建立连接、消息传递和关闭连接等操作,需要的朋友可以参考下
    2023-12-12
  • go语言实现抓取高清图片

    go语言实现抓取高清图片

    本文给大家分享的是使用go语言实现的抓取高清美女图片的代码,原理非常简单,这里就不多废话了,主要是看到很多小伙伴使用python实现的,心血来潮就用go写了下,推荐给大家。
    2015-03-03
  • Go并发编程中sync/errGroup的使用

    Go并发编程中sync/errGroup的使用

    本文主要介绍了Go并发编程中sync/errGroup的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • go xorm存库处理null值问题

    go xorm存库处理null值问题

    这篇文章主要介绍了go xorm存库处理null值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 浅谈Go切片的值修改是否会覆盖数组的值 

    浅谈Go切片的值修改是否会覆盖数组的值 

    本文主要介绍了浅谈Go切片的值修改是否会覆盖数组的值,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 
    2022-02-02
  • vscode 通过Go:Install/Update Tools命令安装失败的问题解决

    vscode 通过Go:Install/Update Tools命令安装失败的问题解决

    本文介绍了在VSCode开发环境中通过Go:Install/UpdateTools命令安装工具时遇到网络问题的解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • Go设计模式之生成器模式详细讲解

    Go设计模式之生成器模式详细讲解

    生成器模式将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式的主要功能是构建复杂的产品,而且是细化地、分步骤地构建产品,也就是说生成器模式重在一步一步解决构建复杂对象的问题
    2023-01-01
  • 一文了解golang 占位符

    一文了解golang 占位符

    本文主要介绍了一文了解golang 占位符,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • golang模拟实现带超时的信号量示例代码

    golang模拟实现带超时的信号量示例代码

    这篇文章主要给大家介绍了关于golang模拟实现带超时的信号量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-09-09

最新评论