refactor: rename deploy/k8s to deploy/kubernetes; add SetEnvKeyReplacer for env var support in K8s
This commit is contained in:
1 parent
d581441fa8
commit
bbf06204cc
15 files changed
+226
-44
No files matched your search
@@ -73,7 +73,7 @@
|
|||||||
./run.sh k8s delete # 清理资源(保留 PVC)
|
./run.sh k8s delete # 清理资源(保留 PVC)
|
||||||
```
|
```
|
||||||
|
|
||||||
**K8s 部署文件** (`deploy/k8s/`): namespace.yaml / secret.yaml / configmap.yaml / mysql.yaml / redis.yaml / deployment.yaml / ingress.yaml
|
**K8s 部署文件** (`deploy/kubernetes/`): namespace.yaml / secret.yaml / configmap.yaml / mysql.yaml / redis.yaml / deployment.yaml / ingress.yaml / quick-deploy.yaml
|
||||||
|
|
||||||
> ⚠️ 健康检查用 `/version`(无 DB 依赖),不用 `/health`(启动早期可能不响应)。
|
> ⚠️ 健康检查用 `/version`(无 DB 依赖),不用 `/health`(启动早期可能不响应)。
|
||||||
|
|
||||||
@@ -200,7 +200,7 @@ aiops/
|
|||||||
│ ├── task/ # 远程任务执行器
|
│ ├── task/ # 远程任务执行器
|
||||||
│ └── reporter/ # HTTP 上报
|
│ └── reporter/ # HTTP 上报
|
||||||
│
|
│
|
||||||
├── deploy/k8s/ # K8s 部署清单 (devops 命名空间)
|
├── deploy/kubernetes/ # K8s 部署清单 (devops 命名空间)
|
||||||
├── Dockerfile.embed # 4 阶段 Embed 镜像 (前端→后端→Agent→Runtime)
|
├── Dockerfile.embed # 4 阶段 Embed 镜像 (前端→后端→Agent→Runtime)
|
||||||
├── docker-compose.yml # 4 容器部署 (mysql+redis+backend+frontend)
|
├── docker-compose.yml # 4 容器部署 (mysql+redis+backend+frontend)
|
||||||
├── run.sh # 统一入口脚本
|
├── run.sh # 统一入口脚本
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ aiops/
|
|||||||
│ ├── task/ # 远程任务执行
|
│ ├── task/ # 远程任务执行
|
||||||
│ └── reporter/ # HTTP 上报
|
│ └── reporter/ # HTTP 上报
|
||||||
│
|
│
|
||||||
├── deploy/k8s/ # Kubernetes 部署清单
|
├── deploy/kubernetes/ # Kubernetes 部署清单
|
||||||
│ ├── namespace.yaml # devops 命名空间
|
│ ├── namespace.yaml # devops 命名空间
|
||||||
│ ├── secret.yaml # 密钥
|
│ ├── secret.yaml # 密钥
|
||||||
│ ├── configmap.yaml # 配置
|
│ ├── configmap.yaml # 配置
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -245,6 +246,7 @@ func loadConfig() *config.Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 环境变量覆盖 // Logan.Li
|
// 环境变量覆盖 // Logan.Li
|
||||||
|
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
|
||||||
viper.AutomaticEnv()
|
viper.AutomaticEnv()
|
||||||
|
|
||||||
// CLI flags 覆盖(最高优先级)// Logan.Li
|
// CLI flags 覆盖(最高优先级)// Logan.Li
|
||||||
|
|||||||
+2
-2
@@ -89,10 +89,10 @@ journalctl -u aiops -f # 日志
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /srv/aiops
|
cd /srv/aiops
|
||||||
kubectl apply -f deploy/k8s/
|
kubectl apply -f deploy/kubernetes/
|
||||||
```
|
```
|
||||||
|
|
||||||
详见 [deploy/k8s/README.md](../k8s/README.md)
|
详见 [deploy/kubernetes/README.md](../kubernetes/README.md)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
apiVersion: v1
|
|
||||||
kind: ConfigMap
|
|
||||||
metadata:
|
|
||||||
name: aiops-config
|
|
||||||
namespace: devops
|
|
||||||
data:
|
|
||||||
config.yaml: |
|
|
||||||
mode: release
|
|
||||||
port: "8080"
|
|
||||||
log_level: info
|
|
||||||
|
|
||||||
database:
|
|
||||||
driver: mysql
|
|
||||||
host: mysql
|
|
||||||
port: 3306
|
|
||||||
user: aiops
|
|
||||||
password: aiops_pass_2026
|
|
||||||
dbname: aiops
|
|
||||||
charset: utf8mb4
|
|
||||||
max_conn: 100
|
|
||||||
max_idle: 10
|
|
||||||
|
|
||||||
redis:
|
|
||||||
driver: redis
|
|
||||||
host: redis
|
|
||||||
port: 6379
|
|
||||||
password: ""
|
|
||||||
db: 0
|
|
||||||
|
|
||||||
jwt:
|
|
||||||
secret: "aiops-jwt-secret-key-2026"
|
|
||||||
expire_hour: 24
|
|
||||||
@@ -63,7 +63,7 @@ AIOps 平台在 Kubernetes 上的部署清单(Go/Gin 后端 + go:embed 前端
|
|||||||
### 方式二:手动 kubectl
|
### 方式二:手动 kubectl
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd deploy/k8s
|
cd deploy/kubernetes
|
||||||
|
|
||||||
# 1. 全量部署(文件按序: namespace → secret → configmap → mysql → redis → deployment)
|
# 1. 全量部署(文件按序: namespace → secret → configmap → mysql → redis → deployment)
|
||||||
kubectl apply -f namespace.yaml
|
kubectl apply -f namespace.yaml
|
||||||
@@ -146,6 +146,6 @@ kubectl -n devops get pvc
|
|||||||
./run.sh k8s delete
|
./run.sh k8s delete
|
||||||
|
|
||||||
# 或手动(持久卷需单独删)
|
# 或手动(持久卷需单独删)
|
||||||
kubectl delete -f deploy/k8s/
|
kubectl delete -f deploy/kubernetes/
|
||||||
kubectl -n devops delete pvc --all
|
kubectl -n devops delete pvc --all
|
||||||
```
|
```
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# config.yaml — 由 ConfigMap 挂载到 /app/config.yaml
|
||||||
|
# 注意:环境变量优先级高于此文件 (viper AutomaticEnv)
|
||||||
|
# 部署时通过 Deployment env 设置 DATABASE_HOST / REDIS_HOST 等覆盖以下值
|
||||||
|
# 此文件仅作为 fallback 默认值
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: ConfigMap
|
kind: ConfigMap
|
||||||
metadata:
|
metadata:
|
||||||
@@ -8,20 +12,25 @@ data:
|
|||||||
mode: release
|
mode: release
|
||||||
port: "8080"
|
port: "8080"
|
||||||
log_level: info
|
log_level: info
|
||||||
|
|
||||||
database:
|
database:
|
||||||
driver: mysql
|
driver: mysql
|
||||||
host: mysql
|
host: 10.10.10.75
|
||||||
port: 3306
|
port: 3306
|
||||||
user: root
|
user: root
|
||||||
password: aiops_root_2026
|
password: aiops_root_2026
|
||||||
dbname: aiops
|
dbname: aiops
|
||||||
charset: utf8mb4
|
charset: utf8mb4
|
||||||
|
max_conn: 100
|
||||||
|
max_idle: 10
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
driver: redis
|
driver: redis
|
||||||
host: redis
|
host: 10.10.10.75
|
||||||
port: 6379
|
port: 6379
|
||||||
password: ""
|
password: ""
|
||||||
db: 0
|
db: 0
|
||||||
|
|
||||||
jwt:
|
jwt:
|
||||||
secret: "aiops-jwt-secret-key-2026"
|
secret: "aiops-jwt-secret-key-2026"
|
||||||
expire_hour: 24
|
expire_hour: 24
|
||||||
@@ -2,12 +2,12 @@
|
|||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
# - 镜像 aiops:embed(前端通过 go:embed 内嵌进同一二进制)
|
# - 镜像 aiops:embed(前端通过 go:embed 内嵌进同一二进制)
|
||||||
# - 单端口 8080 = API + WebSocket + 前端 SPA 静态资源
|
# - 单端口 8080 = API + WebSocket + 前端 SPA 静态资源
|
||||||
# - 配置: ConfigMap aiops-config 挂载到 /app/config.yaml
|
# - 配置优先级: 环境变量 > config.yaml > 默认值 (viper AutomaticEnv)
|
||||||
|
# - 环境变量命名: 配置键 database.host → DATABASE_HOST (全大写, 点变下划线)
|
||||||
# - Service: NodePort 30080 → 8080
|
# - Service: NodePort 30080 → 8080
|
||||||
#
|
#
|
||||||
# 部署: kubectl apply -f deployment.yaml
|
# 部署: kubectl apply -f deployment.yaml
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
---
|
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
@@ -42,9 +42,61 @@ spec:
|
|||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
containerPort: 8080
|
containerPort: 8080
|
||||||
|
# ── 运行时环境变量 ──
|
||||||
|
# viper AutomaticEnv() 自动将 config.yaml 的键映射为环境变量:
|
||||||
|
# database.host → DATABASE_HOST
|
||||||
|
# database.port → DATABASE_PORT
|
||||||
|
# 依此类推
|
||||||
|
# 优先级: 环境变量 > config.yaml > 代码默认值
|
||||||
env:
|
env:
|
||||||
|
# ── 基础配置 ──
|
||||||
- name: TZ
|
- name: TZ
|
||||||
value: Asia/Shanghai
|
value: Asia/Shanghai
|
||||||
|
- name: MODE
|
||||||
|
value: "release"
|
||||||
|
- name: PORT
|
||||||
|
value: "8080"
|
||||||
|
- name: LOG_LEVEL
|
||||||
|
value: "info"
|
||||||
|
|
||||||
|
# ── 数据库 (MySQL) ──
|
||||||
|
- name: DATABASE_DRIVER
|
||||||
|
value: "mysql"
|
||||||
|
- name: DATABASE_HOST
|
||||||
|
value: "10.10.10.75"
|
||||||
|
- name: DATABASE_PORT
|
||||||
|
value: "3306"
|
||||||
|
- name: DATABASE_USER
|
||||||
|
value: "root"
|
||||||
|
- name: DATABASE_PASSWORD
|
||||||
|
value: "aiops_root_2026"
|
||||||
|
- name: DATABASE_DBNAME
|
||||||
|
value: "aiops"
|
||||||
|
- name: DATABASE_CHARSET
|
||||||
|
value: "utf8mb4"
|
||||||
|
- name: DATABASE_MAX_CONN
|
||||||
|
value: "100"
|
||||||
|
- name: DATABASE_MAX_IDLE
|
||||||
|
value: "10"
|
||||||
|
|
||||||
|
# ── 缓存 (Redis) ──
|
||||||
|
- name: REDIS_DRIVER
|
||||||
|
value: "redis"
|
||||||
|
- name: REDIS_HOST
|
||||||
|
value: "10.10.10.75"
|
||||||
|
- name: REDIS_PORT
|
||||||
|
value: "6379"
|
||||||
|
- name: REDIS_PASSWORD
|
||||||
|
value: ""
|
||||||
|
- name: REDIS_DB
|
||||||
|
value: "0"
|
||||||
|
|
||||||
|
# ── JWT 认证 ──
|
||||||
|
- name: JWT_SECRET
|
||||||
|
value: "aiops-jwt-secret-key-2026"
|
||||||
|
- name: JWT_EXPIRE_HOUR
|
||||||
|
value: "24"
|
||||||
|
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: config
|
- name: config
|
||||||
mountPath: /app/config.yaml
|
mountPath: /app/config.yaml
|
||||||
@@ -54,6 +106,7 @@ spec:
|
|||||||
mountPath: /app/uploads
|
mountPath: /app/uploads
|
||||||
- name: data
|
- name: data
|
||||||
mountPath: /app/data
|
mountPath: /app/data
|
||||||
|
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /version
|
path: /version
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,150 @@
|
|||||||
|
# quick-deploy.yaml — AIOps 快速部署 (ConfigMap + Deployment, 含 Service)
|
||||||
|
# 部署: kubectl apply -f quick-deploy.yaml
|
||||||
|
# 注意: 此文件自包含, 不依赖其他 YAML
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: aiops-config
|
||||||
|
namespace: devops
|
||||||
|
data:
|
||||||
|
config.yaml: |
|
||||||
|
mode: release
|
||||||
|
port: "8080"
|
||||||
|
log_level: info
|
||||||
|
|
||||||
|
database:
|
||||||
|
driver: mysql
|
||||||
|
host: 10.10.10.75
|
||||||
|
port: 3306
|
||||||
|
user: root
|
||||||
|
password: aiops_root_2026
|
||||||
|
dbname: aiops
|
||||||
|
charset: utf8mb4
|
||||||
|
max_conn: 100
|
||||||
|
max_idle: 10
|
||||||
|
|
||||||
|
redis:
|
||||||
|
driver: redis
|
||||||
|
host: 10.10.10.75
|
||||||
|
port: 6379
|
||||||
|
password: ""
|
||||||
|
db: 0
|
||||||
|
|
||||||
|
jwt:
|
||||||
|
secret: "aiops-jwt-secret-key-2026"
|
||||||
|
expire_hour: 24
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: aiops
|
||||||
|
namespace: devops
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: aiops
|
||||||
|
app.kubernetes.io/component: app
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
strategy:
|
||||||
|
type: RollingUpdate
|
||||||
|
rollingUpdate:
|
||||||
|
maxSurge: 1
|
||||||
|
maxUnavailable: 0
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: aiops
|
||||||
|
app.kubernetes.io/component: app
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/name: aiops
|
||||||
|
app.kubernetes.io/component: app
|
||||||
|
spec:
|
||||||
|
hostNetwork: true
|
||||||
|
dnsPolicy: ClusterFirstWithHostNet
|
||||||
|
containers:
|
||||||
|
- name: aiops
|
||||||
|
image: aiops:embed
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
# ── 环境变量 (优先级高于 config.yaml) ──
|
||||||
|
env:
|
||||||
|
- name: TZ
|
||||||
|
value: Asia/Shanghai
|
||||||
|
- name: MODE
|
||||||
|
value: "release"
|
||||||
|
- name: PORT
|
||||||
|
value: "8080"
|
||||||
|
- name: LOG_LEVEL
|
||||||
|
value: "info"
|
||||||
|
- name: DATABASE_DRIVER
|
||||||
|
value: "mysql"
|
||||||
|
- name: DATABASE_HOST
|
||||||
|
value: "10.10.10.75"
|
||||||
|
- name: DATABASE_PORT
|
||||||
|
value: "3306"
|
||||||
|
- name: DATABASE_USER
|
||||||
|
value: "root"
|
||||||
|
- name: DATABASE_PASSWORD
|
||||||
|
value: "aiops_root_2026"
|
||||||
|
- name: DATABASE_DBNAME
|
||||||
|
value: "aiops"
|
||||||
|
- name: DATABASE_CHARSET
|
||||||
|
value: "utf8mb4"
|
||||||
|
- name: DATABASE_MAX_CONN
|
||||||
|
value: "100"
|
||||||
|
- name: DATABASE_MAX_IDLE
|
||||||
|
value: "10"
|
||||||
|
- name: REDIS_DRIVER
|
||||||
|
value: "redis"
|
||||||
|
- name: REDIS_HOST
|
||||||
|
value: "10.10.10.75"
|
||||||
|
- name: REDIS_PORT
|
||||||
|
value: "6379"
|
||||||
|
- name: REDIS_PASSWORD
|
||||||
|
value: ""
|
||||||
|
- name: REDIS_DB
|
||||||
|
value: "0"
|
||||||
|
- name: JWT_SECRET
|
||||||
|
value: "aiops-jwt-secret-key-2026"
|
||||||
|
- name: JWT_EXPIRE_HOUR
|
||||||
|
value: "24"
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /app/config.yaml
|
||||||
|
subPath: config.yaml
|
||||||
|
readOnly: true
|
||||||
|
- name: uploads
|
||||||
|
mountPath: /app/uploads
|
||||||
|
- name: data
|
||||||
|
mountPath: /app/data
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 256Mi
|
||||||
|
limits:
|
||||||
|
cpu: "1"
|
||||||
|
memory: 1Gi
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: aiops-config
|
||||||
|
- name: uploads
|
||||||
|
emptyDir: {}
|
||||||
|
- name: data
|
||||||
|
emptyDir: {}
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: aiops
|
||||||
|
namespace: devops
|
||||||
|
spec:
|
||||||
|
type: NodePort
|
||||||
|
selector:
|
||||||
|
app.kubernetes.io/name: aiops
|
||||||
|
ports:
|
||||||
|
- port: 8080
|
||||||
|
targetPort: 8080
|
||||||
|
nodePort: 30080
|
||||||
File renamed without changes.
File renamed without changes.
@@ -550,7 +550,7 @@ cmd_binary() {
|
|||||||
# Kubernetes 部署 (embed 单容器模式)
|
# Kubernetes 部署 (embed 单容器模式)
|
||||||
# ============================================================
|
# ============================================================
|
||||||
K8S_NAMESPACE="devops"
|
K8S_NAMESPACE="devops"
|
||||||
K8S_MANIFEST_DIR="$SCRIPT_DIR/deploy/k8s"
|
K8S_MANIFEST_DIR="$SCRIPT_DIR/deploy/kubernetes"
|
||||||
K8S_IMAGE="aiops:embed"
|
K8S_IMAGE="aiops:embed"
|
||||||
K8S_NODE_PORT=30080
|
K8S_NODE_PORT=30080
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user