Files
aiops/deploy/k8s/README.md
T
Logan 4631b02f13 feat: 三种部署方式 — embed单容器 + 二进制部署 + K8s
新增三种部署方式(原有 docker-compose 不受影响):

1. Docker embed 单容器 (docker-compose.embed.yml):
   - go:embed 前端嵌入后端二进制
   - 不需要 nginx 容器,3容器→2容器
   - 镜像仅 54.8MB (vs 原来 1.16GB)
   - 用法: make docker-embed

2. 二进制部署 (deploy/binary/):
   - make build-binary 生成单二进制
   - install.sh 自动创建 systemd 服务
   - 适合无 Docker 环境
   - 用法: scp aiops + install.sh, bash install.sh install

3. Kubernetes 部署 (deploy/k8s/):
   - devops 命名空间全套 yaml
   - MySQL StatefulSet + Redis StatefulSet + Backend Deployment
   - ConfigMap + Secret + Ingress
   - 用法: kubectl apply -f deploy/k8s/

核心改动:
- backend/cmd/embed.go: go:embed 前端 + SPA fallback 路由
- backend/Dockerfile.embed: 四阶段构建 (前端→后端embed→agent→runtime)
- Makefile: build-binary + docker-embed 目标
- deploy/README.md: 四种部署方式对比文档
2026-06-21 14:20:29 +08:00

5.8 KiB
Raw Blame History

AIOps Kubernetes 部署

AIOps 平台在 Kubernetes 上的部署清单(Go/Gin 后端 + go:embed 前端 + MySQL 8.0 + Redis 7)。

所有资源部署在 devops 命名空间。

目录结构

文件 说明
namespace.yaml devops 命名空间
configmap.yaml 后端 config.yaml(ConfigMap)+ MySQL/JWT 密码(Secret)
mysql.yaml MySQL 8.0 StatefulSet + Headless/ClusterIP Service + 8Gi 持久卷
redis.yaml Redis 7 StatefulSet + Headless/ClusterIP Service + 2Gi 持久卷
backend.yaml 后端 Deployment(端口 8080=API/WS,80=embed 前端)+ ClusterIP Service
ingress.yaml Ingress:/api、/ws → 8080;/ → 80

架构与端口

                ┌──────────────── Ingress (nginx) ────────────────┐
   /api, /ws ──▶│                                                  │──▶ aiops-backend:8080 (API + WebSocket)
        /     ──▶│                                                  │──▶ aiops-backend:80   (go:embed 前端)
                └──────────────────────────────────────────────────┘
                                   │
                    ┌──────────────┴──────────────┐
                    ▼                              ▼
              aiops-backend                   aiops-backend
                   │ (DB_HOST=mysql)             │ (REDIS_HOST=redis)
                   ▼                              ▼
              MySQL 8.0 (StatefulSet)        Redis 7 (StatefulSet)
              aiops / aiops_pass_2026         无密码, db 0
              数据库 aiops, 8Gi PV            2Gi PV
  • 8080:API + WebSocket
  • 80:前端(go:embed 嵌入后端二进制,由后端进程提供静态资源)
  • 配置文件 config.yaml 中 DB/Redis 连接均以环境变量 ${VAR} 占位,由 Deployment 的 env 注入;密码走 Secret。

前置条件

  1. 一个可用的 Kubernetes 集群(≥ 1.22)。
  2. 已安装 nginx Ingress Controller。
  3. 集群具备可用的 StorageClass(MySQL/Redis 的 volumeClaimTemplates 依赖动态卷供应)。
    • minikube / kind 自带默认 StorageClass(如 standard)。
    • 如需指定,取消各 StatefulSet 中 storageClassName 的注释。
  4. 后端镜像 aiops-backend:latest 已构建并推送到集群可访问的镜像仓库(或本地 kind load docker-image / minikube image load)。

部署步骤

按顺序 apply(资源间存在依赖:Secret → 数据库 → 后端 → Ingress):

cd deploy/k8s

# 1. 命名空间(必须最先)
kubectl apply -f namespace.yaml

# 2. 配置 + 密码(ConfigMap / Secret)
kubectl apply -f configmap.yaml

# 3. MySQL(启动后自动建库 aiops 与用户 aiops)
kubectl apply -f mysql.yaml

# 4. Redis
kubectl apply -f redis.yaml

# 5. 等待数据库就绪
kubectl -n devops rollout status statefulset/mysql
kubectl -n devops rollout status statefulset/redis

# 6. 后端
kubectl apply -f backend.yaml
kubectl -n devops rollout status deployment/aiops-backend

# 7. Ingress(部署前修改 host 与 ingressClassName)
kubectl apply -f ingress.yaml

一键全量部署(文件名按字典序,namespace 会最先应用):

kubectl apply -f deploy/k8s/

访问

  • 将 Ingress 中的 host(默认 aiops.local)解析到 Ingress Controller 的入口 IP:
    echo "<INGRESS_IP>  aiops.local" | sudo tee -a /etc/hosts
    
  • 浏览器打开 http://aiops.local 即前端;API 在 http://aiops.local/api。

常用运维命令

# 查看所有资源
kubectl -n devops get all,configmap,secret,ingress,pvc

# 查看后端日志
kubectl -n devops logs -f deployment/aiops-backend

# 进入 MySQL
kubectl -n devops exec -it mysql-0 -- mysql -uaiops -paiops_pass_2026 aiops

# 进入 Redis
kubectl -n devops exec -it redis-0 -- redis-cli

# 进入后端容器
kubectl -n devops exec -it deployment/aiops-backend -- sh

# 查看 PVC 绑定状态
kubectl -n devops get pvc

配置与密码

项目 来源 值
MySQL 业务账号 Secret aiops-secret 用户 aiops / 密码 aiops_pass_2026 / 库 aiops
MySQL root Secret aiops-secret aiops_root_2026
JWT Secret aiops-secret jwt-secret(生产请替换为强随机值)
Redis 无密码 db 0

⚠️ 生产环境请勿使用仓库内默认密码。修改 configmap.yaml 中 Secret 的值后重新 apply, 或使用 kubectl create secret 覆盖。

资源限额

组件 CPU 请求/上限 内存请求/上限
backend 100m / 500m 512Mi / 1Gi
mysql 250m / 1 1Gi / 2Gi
redis 50m / 250m 128Mi / 256Mi

关于配置的环境变量占位

config.yaml(位于 ConfigMap)中 DB/Redis 的 host/port/user/password/dbname、JWT secret 均写成 ${ENV_VAR} 占位形式,实际值在 backend.yaml 的 env 段注入: 非敏感的 host/port/user/dbname 直接给值(指向 K8s Service),密码则 valueFrom 引用 Secret。

后端基于 viper 读取配置。若 ${VAR} 占位需要由环境变量直接替换嵌套键 (如 DB_PASSWORD → database.password),建议在程序启动时设置键名映射:

viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))

否则可改为在 config.yaml 中直接写明连接串、密码仅由 Secret 注入。两种方式均可, 当前清单采用「环境变量占位 + Secret」的标准 K8s 模式。

清理

kubectl delete -f deploy/k8s/
# 持久卷需单独删除(PVC 由 StatefulSet 保护,删除 STS 后 PVC 仍保留)
kubectl -n devops delete pvc --all