使用golang腳本基于kubeadm創(chuàng)建新的token(問(wèn)題分析)
說(shuō)明
1、這個(gè)腳本主要用于解決兩個(gè)問(wèn)題:
第一:其實(shí)使用python腳本也可以實(shí)現(xiàn),但是python要面對(duì)centos7的python2和openeuler的python3不一樣的問(wèn)題
第二:就是多架構(gòu)的問(wèn)題和離線的問(wèn)題。
第三:學(xué)習(xí)go腳本的實(shí)踐。
以上問(wèn)題都有可能導(dǎo)致這個(gè)python腳本可能不那么通用。
2、適用場(chǎng)景:
暫時(shí)用于配合我前面部署高可用K8S集群時(shí)用于過(guò)濾出token信息或者token過(guò)期時(shí)直接生成新的token。
其他擴(kuò)展還在考慮
腳本用到的邏輯
解析命令行參數(shù)
// 定義命令行參數(shù)
tokenFlag := flag.Bool("token", false, "重新生成與 kubeadm token create --print-join-command 相同的 token 信息")
flag.Parse()
Go
腳本使用Go語(yǔ)言的
flag包來(lái)解析命令行參數(shù)。它定義了一個(gè)名為tokenFlag的命令行標(biāo)志,用于確定是否重新生成加入命令。
cmd命令行函數(shù)
func generateToken() {
// 調(diào)用 kubeadm token create --print-join-command 命令來(lái)生成與 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 信息時(shí)發(fā)生錯(cuò)誤:", err)
}
}Go
generateToken函數(shù)的目的是重新生成加入集群的命令。它調(diào)用外部命令kubeadm token create --print-join-command來(lái)生成新的token和加入命令。這個(gè)命令與python的`subprocess.run`有異曲同工之妙
讀取文件和處理文件內(nèi)容的邏輯
// 打開(kāi)日志文件
file, err := os.Open("./k8s_init.log")
if err != nil {
fmt.Println("無(wú)法打開(kāi)日志文件:", err)
return
}
defer file.Close()
// 創(chuàng)建一個(gè)帶緩沖的文件讀取器
scanner := bufio.NewScanner(file)
// 設(shè)置標(biāo)志來(lái)跟蹤是否找到了控制平面和默認(rèn)行
inControlPlane := false
inDefaultLine := false
// 逐行讀取文件內(nèi)容
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) // 打印相關(guān)控制平面行
inControlPlane = false
} else if strings.Contains(line, "kubeadm join") {
fmt.Println(line) // 打印默認(rèn)行
inDefaultLine = true
} else if inDefaultLine && strings.Contains(line, "--discovery-token-ca-cert-hash") {
fmt.Println(line) // 打印相關(guān)默認(rèn)行
inDefaultLine = false
}
}
if err := scanner.Err(); err != nil {
fmt.Println("讀取文件時(shí)發(fā)生錯(cuò)誤:", err)
}Go
這部分邏輯在主函數(shù)的
else分支中。它打開(kāi)名為k8s_init.log的文件,然后逐行讀取文件內(nèi)容,查找控制平面和默認(rèn)行的標(biāo)識(shí),并打印相應(yīng)的行。這部分邏輯根據(jù)文件內(nèi)容的不同來(lái)區(qū)分并輸出控制平面和默認(rèn)行。腳本的主要功能是在根據(jù)命令行參數(shù)來(lái)決定是否生成與
kubeadm token create --print-join-command相同的token信息。如果-token命令行參數(shù)被提供,腳本會(huì)調(diào)用generateToken函數(shù)生成新的token信息;否則,它會(huì)讀取文件并處理文件內(nèi)容以區(qū)分控制平面和默認(rèn)行,并輸出相應(yīng)的信息。這使腳本可以用于生成Kubernetes集群的加入命令或分析日志文件中的內(nèi)容。
完整腳本
package main
import (
"bufio"
"flag"
"fmt"
"os"
"os/exec"
"strings"
)
func main() {
// 定義命令行參數(shù)
tokenFlag := flag.Bool("token", false, "重新生成與 kubeadm token create --print-join-command 相同的 token 信息")
flag.Parse()
if *tokenFlag {
generateToken()
} else {
// 打開(kāi)日志文件
file, err := os.Open("./k8s_init.log")
if err != nil {
fmt.Println("無(wú)法打開(kāi)日志文件:", err)
return
}
defer file.Close()
// 創(chuàng)建一個(gè)帶緩沖的文件讀取器
scanner := bufio.NewScanner(file)
// 設(shè)置標(biāo)志來(lái)跟蹤是否找到了控制平面和默認(rèn)行
inControlPlane := false
inDefaultLine := false
// 逐行讀取文件內(nèi)容
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) // 打印相關(guān)控制平面行
inControlPlane = false
} else if strings.Contains(line, "kubeadm join") {
fmt.Println(line) // 打印默認(rèn)行
inDefaultLine = true
} else if inDefaultLine && strings.Contains(line, "--discovery-token-ca-cert-hash") {
fmt.Println(line) // 打印相關(guān)默認(rèn)行
inDefaultLine = false
}
}
if err := scanner.Err(); err != nil {
fmt.Println("讀取文件時(shí)發(fā)生錯(cuò)誤:", err)
}
}
}
func generateToken() {
// 調(diào)用 kubeadm token create --print-join-command 命令來(lái)生成與 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 信息時(shí)發(fā)生錯(cuò)誤:", 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
總結(jié)
功能只是加了一個(gè)token參數(shù)用于刷新token而已,主要在于學(xué)習(xí)golang的文本處理,cmd命令執(zhí)行,這些都是運(yùn)維在使用go寫(xiě)腳本最先遇到的問(wèn)題。
后面想到功能會(huì)再增加,寫(xiě)的很爛,如果有問(wèn)題或者吐槽,歡迎留言。
到此這篇關(guān)于使用golang腳本基于kubeadm創(chuàng)建新的token的文章就介紹到這了,更多相關(guān)golang kubeadm創(chuàng)建token內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Golang創(chuàng)建單獨(dú)的WebSocket會(huì)話
WebSocket是一種在Web開(kāi)發(fā)中非常常見(jiàn)的通信協(xié)議,它提供了雙向、持久的連接,適用于實(shí)時(shí)數(shù)據(jù)傳輸和實(shí)時(shí)通信場(chǎng)景,本文將介紹如何使用 Golang 創(chuàng)建單獨(dú)的 WebSocket 會(huì)話,包括建立連接、消息傳遞和關(guān)閉連接等操作,需要的朋友可以參考下2023-12-12
淺談Go切片的值修改是否會(huì)覆蓋數(shù)組的值?
本文主要介紹了淺談Go切片的值修改是否會(huì)覆蓋數(shù)組的值,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下?2022-02-02
vscode 通過(guò)Go:Install/Update Tools命令安裝失敗的問(wèn)題解決
本文介紹了在VSCode開(kāi)發(fā)環(huán)境中通過(guò)Go:Install/UpdateTools命令安裝工具時(shí)遇到網(wǎng)絡(luò)問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12
golang模擬實(shí)現(xiàn)帶超時(shí)的信號(hào)量示例代碼
這篇文章主要給大家介紹了關(guān)于golang模擬實(shí)現(xiàn)帶超時(shí)的信號(hào)量的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09

