使用golang腳本基于kubeadm創(chuàng)建新的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 信息時發(fā)生錯誤:", 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() // 創(chuàng)建一個帶緩沖的文件讀取器 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("讀取文件時發(fā)生錯誤:", err) }
Go
這部分邏輯在主函數的
else
分支中。它打開名為k8s_init.log
的文件,然后逐行讀取文件內容,查找控制平面和默認行的標識,并打印相應的行。這部分邏輯根據文件內容的不同來區(qū)分并輸出控制平面和默認行。腳本的主要功能是在根據命令行參數來決定是否生成與
kubeadm token create --print-join-command
相同的token信息。如果-token
命令行參數被提供,腳本會調用generateToken
函數生成新的token信息;否則,它會讀取文件并處理文件內容以區(qū)分控制平面和默認行,并輸出相應的信息。這使腳本可以用于生成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() // 創(chuàng)建一個帶緩沖的文件讀取器 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("讀取文件時發(fā)生錯誤:", 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 信息時發(fā)生錯誤:", 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命令執(zhí)行,這些都是運維在使用go寫腳本最先遇到的問題。
后面想到功能會再增加,寫的很爛,如果有問題或者吐槽,歡迎留言。
到此這篇關于使用golang腳本基于kubeadm創(chuàng)建新的token的文章就介紹到這了,更多相關golang kubeadm創(chuàng)建token內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Golang創(chuàng)建單獨的WebSocket會話
WebSocket是一種在Web開發(fā)中非常常見的通信協(xié)議,它提供了雙向、持久的連接,適用于實時數據傳輸和實時通信場景,本文將介紹如何使用 Golang 創(chuàng)建單獨的 WebSocket 會話,包括建立連接、消息傳遞和關閉連接等操作,需要的朋友可以參考下2023-12-12vscode 通過Go:Install/Update Tools命令安裝失敗的問題解決
本文介紹了在VSCode開發(fā)環(huán)境中通過Go:Install/UpdateTools命令安裝工具時遇到網絡問題的解決方法,具有一定的參考價值,感興趣的可以了解一下2024-12-12