分享
  1. 首页
  2. 文章

51CTO-杜宽-【云原生全栈开发】基于Go和Vue的K8s多集群管理自动化运维平台开发项目实战部分

huoke1 · · 300 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

获课:keyouit.xyz/15219/ Go驱动后端,Vue赋能前端:K8s多集群自动化运维平台全栈开发指南 一、平台架构设计 1.1 整体架构 [用户界面] ←(HTTPS)→ [前端服务(Vue)] ←(gRPC/REST)→ [后端服务(Go)] ←(K8s Client)→ [K8s集群] ↑ ↓ [数据库] ←(ORM)→ [后端服务(Go)] ←(消息队列)→ [异步任务] 1.2 核心组件 前端:Vue 3 + TypeScript + Pinia + Element Plus 后端:Go 1.20+ + Gin/Fiber + gRPC + K8s Client-go 基础设施:Kubernetes多集群 + Prometheus + Grafana + ArgoCD 数据库:PostgreSQL(主) + Redis(缓存) + TimescaleDB(时序数据) 二、后端开发(Go实现) 2.1 项目结构 /cmd /api-server # API服务入口 /worker # 异步任务处理 /pkg /k8s # K8s客户端封装 /model # 数据模型 /repository # 数据访问层 /service # 业务逻辑 /utils # 工具函数 /api /proto # gRPC协议定义 /swagger # API文档 /configs # 配置管理 /deployments # K8s部署清单 2.2 核心实现 K8s多集群管理 go type MultiClusterManager struct { clusters map[string]*rest.Config mu sync.RWMutex } func NewMultiClusterManager() *MultiClusterManager { return &MultiClusterManager{ clusters: make(map[string]*rest.Config), } } func (m *MultiClusterManager) AddCluster(name string, config *rest.Config) { m.mu.Lock() defer m.mu.Unlock() m.clusters[name] = config } func (m *MultiClusterManager) GetClient(name string) (kubernetes.Interface, error) { m.mu.RLock() defer m.mu.RUnlock() config, exists := m.clusters[name] if !exists { return nil, fmt.Errorf("cluster %s not found", name) } return kubernetes.NewForConfig(config) } REST API实现(Gin示例) go func NewAPIServer() *gin.Engine { r := gin.Default() // 集群管理路由 clusterGroup := r.Group("/clusters") { clusterGroup.POST("", clusterCtrl.CreateCluster) clusterGroup.GET("", clusterCtrl.ListClusters) clusterGroup.GET("/:name", clusterCtrl.GetCluster) clusterGroup.DELETE("/:name", clusterCtrl.DeleteCluster) } // 资源操作路由 resourceGroup := r.Group("/resources") { resourceGroup.GET("/:cluster/namespaces", resourceCtrl.ListNamespaces) resourceGroup.GET("/:cluster/pods", resourceCtrl.ListPods) resourceGroup.POST("/:cluster/deployments", resourceCtrl.ApplyDeployment) } return r } gRPC服务实现 protobuf // api/proto/cluster.proto service ClusterService { rpc GetClusterInfo(ClusterRequest) returns (ClusterResponse); rpc ListNodes(NodesRequest) returns (NodesResponse); rpc ExecuteCommand(CommandRequest) returns (stream CommandResponse); } message ClusterRequest { string cluster_name = 1; } message CommandRequest { string cluster_name = 1; string namespace = 2; string pod_name = 3; string command = 4; } 三、前端开发(Vue 3实现) 3.1 项目结构 /src /api # API请求封装 /assets # 静态资源 /components # 公共组件 /composables # 组合式函数 /router # 路由配置 /stores # Pinia状态管理 /styles # 全局样式 /utils # 工具函数 /views # 页面组件 /vite-env.d.ts # Vite环境声明 main.ts # 应用入口 3.2 核心实现 API请求封装 typescript // src/api/k8s.ts import request from '@/utils/request' export const getClusters = () => { return request({ url: '/clusters', method: 'get' }) } export const getClusterResources = (clusterName: string) => { return request({ url: `/resources/${clusterName}/pods`, method: 'get' }) } export const executeCommand = (data: CommandRequest) => { return request({ url: `/resources/${data.clusterName}/exec`, method: 'post', data }) } 集群管理页面示例 vue <!-- src/views/cluster/List.vue --> <template> <div class="cluster-container"> <el-table :data="clusters" style="width: 100%"> <el-table-column prop="name" label="集群名称" /> <el-table-column prop="endpoint" label="API地址" /> <el-table-column label="操作"> <template #default="{ row }"> <el-button size="small" @click="handleConnect(row)">连接</el-button> <el-button size="small" type="danger" @click="handleDelete(row)">删除</el-button> </template> </el-table-column> </el-table> <el-dialog v-model="dialogVisible" title="集群详情"> <pre>{{ currentCluster }}</pre> </el-dialog> </div> </template> <script setup lang="ts"> import { ref, onMounted } from 'vue' import { getClusters } from '@/api/k8s' import type { Cluster } from '@/types/k8s' const clusters = ref<Cluster[]>([]) const dialogVisible = ref(false) const currentCluster = ref<Cluster | null>(null) const fetchClusters = async () => { try { const res = await getClusters() clusters.value = res.data } catch (error) { console.error('获取集群列表失败:', error) } } const handleConnect = (cluster: Cluster) => { currentCluster.value = cluster dialogVisible.value = true // 这里可以添加连接集群的逻辑 } const handleDelete = (cluster: Cluster) => { // 删除集群逻辑 } onMounted(() => { fetchClusters() }) </script> 状态管理(Pinia示例) typescript // src/stores/cluster.ts import { defineStore } from 'pinia' import { ref } from 'vue' import type { Cluster } from '@/types/k8s' export const useClusterStore = defineStore('cluster', () => { const clusters = ref<Cluster[]>([]) const currentCluster = ref<Cluster | null>(null) const setClusters = (list: Cluster[]) => { clusters.value = list } const setCurrentCluster = (cluster: Cluster | null) => { currentCluster.value = cluster } return { clusters, currentCluster, setClusters, setCurrentCluster } }) 四、K8s集成与自动化运维 4.1 多集群管理方案 集群注册机制: 通过API或UI添加集群配置 验证集群可达性和权限 存储集群凭证(使用K8s Secret或Vault) 动态客户端加载: go func (m *MultiClusterManager) LoadClustersFromConfigMap(namespace, configMapName string) error { // 从指定ConfigMap中读取集群配置 // 动态添加到集群管理器中 } 4.2 自动化运维功能实现 批量操作实现 go func (s *ResourceService) BatchApplyResources(clusterName string, manifests []byte) error { client, err := s.clusterMgr.GetClient(clusterName) if err != nil { return err } // 使用client-go的DynamicClient或Unstructured对象处理多种资源 decoder := yaml.NewYAMLOrJSONDecoder(bytes.NewReader(manifests), 4096) for { var raw runtime.RawExtension if err := decoder.Decode(&raw); err != nil { if err == io.EOF { break } return err } // 处理每个资源 gvk := schema.GroupVersionKind{} if unstructuredObj, _, err := unstructured.UnstructuredJSONScheme.Decode(raw.Raw, nil, &gvk); err == nil { obj := unstructuredObj.(*unstructured.Unstructured) // 根据资源类型执行不同操作 // ... } } return nil } 运维监控集成 go func (s *MonitorService) GetClusterMetrics(clusterName string) (*metrics.ClusterMetrics, error) { client, err := s.clusterMgr.GetClient(clusterName) if err != nil { return nil, err } // 获取节点指标 nodes, err := client.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) if err != nil { return nil, err } // 这里可以集成Prometheus客户端获取实际指标 metrics := &metrics.ClusterMetrics{ NodeCount: len(nodes.Items), // 其他指标... } return metrics, nil } 五、部署与运维 5.1 平台自身部署方案 Helm Chart结构 k8s-ops-platform/ ├── Chart.yaml ├── values.yaml ├── templates/ │ ├── api-server-deployment.yaml │ ├── worker-deployment.yaml │ ├── frontend-deployment.yaml │ ├── postgresql-deployment.yaml │ └── ingress.yaml └── charts/ └── common/ # 共享的依赖和工具 CI/CD流水线示例(GitLab CI) yaml stages: - build - test - deploy build-backend: stage: build image: golang:1.20 script: - cd backend - go mod tidy - go build -o api-server cmd/api-server/main.go - docker build -t registry.example.com/k8s-ops/api-server:$CI_COMMIT_SHA . - docker push registry.example.com/k8s-ops/api-server:$CI_COMMIT_SHA build-frontend: stage: build image: node:18 script: - cd frontend - npm install - npm run build - docker build -t registry.example.com/k8s-ops/frontend:$CI_COMMIT_SHA . - docker push registry.example.com/k8s-ops/frontend:$CI_COMMIT_SHA deploy-to-k8s: stage: deploy image: bitnami/helm:latest script: - helm upgrade --install k8s-ops-platform ./k8s-ops-platform --set apiServer.image.tag=$CI_COMMIT_SHA --set frontend.image.tag=$CI_COMMIT_SHA -n ops-platform 5.2 运维监控方案 关键指标监控 API响应时间 任务执行成功率 集群资源使用率 平台组件健康状态 告警规则示例(Prometheus) yaml groups: - name: k8s-ops-platform.alerts rules: - alert: HighAPILatency expr: histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service)) > 1 for: 10m labels: severity: warning annotations: summary: "High API latency on {{ $labels.service }}" description: "99th percentile latency is {{ $value }}s for service {{ $labels.service }}" 六、进阶优化方向 性能优化 后端:使用pprof进行性能分析,优化gRPC流处理 前端:代码分割、懒加载、Web Worker处理大数据 安全性增强 实现RBAC权限控制 添加审计日志 集成OIDC认证 扩展性提升 插件化架构设计 支持更多K8s发行版(OpenShift, Rancher等) 添加Webhook支持 AI运维集成 异常检测 智能预测 自动修复建议 七、开发资源推荐 Go相关 client-go官方文档 Gin Web框架 gRPC-Go Vue相关 Vue 3官方文档 Pinia状态管理 Element Plus组件库 K8s相关 Kubernetes官方文档 Kubebuilder (CRD开发) ArgoCD (GitOps) 通过以上架构设计和实现方案,您可以构建一个功能完善、性能优良的K8s多集群自动化运维平台,实现集群管理、资源监控、批量操作等核心功能,大幅提升K8s环境的运维效率。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
300 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏