Go(Gin) + React(Vite + shadcn/ui + Tailwind) 前后端分离,全中文 UI - 集群管理:Kubeconfig / Token 双接入,kubectl + helm 部署 - 主机管理:SSH 密钥 / 密码双认证,CPU/内存/磁盘使用率监控,SSH 错误中文友好提示 - 存储配置、部署管理、系统设置 - Docker 镜像内置 kubectl + helm,开箱即用 - run.sh 一键启停(start/stop/restart/status) Co-Authored-By: Claude <noreply@anthropic.com>
59 lines
1.4 KiB
Go
59 lines
1.4 KiB
Go
package services
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"regexp"
|
|
|
|
"lokideploy/models"
|
|
)
|
|
|
|
// resolveKubeconfig 取集群最终的 kubeconfig 文本(优先内存字段,其次磁盘文件)
|
|
func resolveKubeconfig(cluster *models.Cluster) (string, error) {
|
|
if cluster.KubeConfig != "" {
|
|
return cluster.KubeConfig, nil
|
|
}
|
|
if cluster.KubeConfigPath != "" {
|
|
data, err := os.ReadFile(cluster.KubeConfigPath)
|
|
if err != nil {
|
|
return "", fmt.Errorf("读取 kubeconfig 文件失败: %v", err)
|
|
}
|
|
return string(data), nil
|
|
}
|
|
return "", fmt.Errorf("集群未配置 kubeconfig")
|
|
}
|
|
|
|
// BuildKubeconfigFromToken 用 API Server + Token 构造最小 kubeconfig
|
|
// 采用 insecure-skip-tls-verify,便于内网/自签证书集群接入
|
|
func BuildKubeconfigFromToken(apiServer, token string) string {
|
|
return fmt.Sprintf(`apiVersion: v1
|
|
kind: Config
|
|
clusters:
|
|
- cluster:
|
|
insecure-skip-tls-verify: true
|
|
server: %s
|
|
name: loki-cluster
|
|
contexts:
|
|
- context:
|
|
cluster: loki-cluster
|
|
user: loki-user
|
|
name: loki-context
|
|
current-context: loki-context
|
|
users:
|
|
- name: loki-user
|
|
user:
|
|
token: %s
|
|
`, apiServer, token)
|
|
}
|
|
|
|
var apiServerRe = regexp.MustCompile(`(?m)^\s*server:\s*(\S+)`)
|
|
|
|
// ExtractAPIServer 从 kubeconfig 文本提取 server 地址(展示用)
|
|
func ExtractAPIServer(kubeconfig string) string {
|
|
m := apiServerRe.FindStringSubmatch(kubeconfig)
|
|
if len(m) >= 2 {
|
|
return m[1]
|
|
}
|
|
return ""
|
|
}
|