# 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): ```bash 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 会最先应用): ```bash kubectl apply -f deploy/k8s/ ``` ## 访问 - 将 Ingress 中的 `host`(默认 `aiops.local`)解析到 Ingress Controller 的入口 IP: ```bash echo " aiops.local" | sudo tee -a /etc/hosts ``` - 浏览器打开 `http://aiops.local` 即前端;API 在 `http://aiops.local/api`。 ## 常用运维命令 ```bash # 查看所有资源 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`),建议在程序启动时设置键名映射: ```go viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) ``` 否则可改为在 `config.yaml` 中直接写明连接串、密码仅由 Secret 注入。两种方式均可, 当前清单采用「环境变量占位 + Secret」的标准 K8s 模式。 ## 清理 ```bash kubectl delete -f deploy/k8s/ # 持久卷需单独删除(PVC 由 StatefulSet 保护,删除 STS 后 PVC 仍保留) kubectl -n devops delete pvc --all ```