使用golang脚本基于kubeadm创建新的token(问题分析)
作者:llody_55
说明
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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
