Tier0 EKS 集群完整架构文档
版本: v2.1 | 更新时间: 2026-01-18
一、系统架构总览
1.1 整体架构图
graph TB
Internet[Internet]
NLB[AWS NLB]
Ingress[Ingress Nginx]
Frontend[Frontend :3000]
Admin[Admin :3000]
Grafana[Grafana :3000]
Gateway[API Gateway gwsvr :8795]
Syssvr[syssvr :9540]
Ressvr[ressvr :5726]
Unssvr[unssvr :9623]
Internet --> NLB
NLB --> Ingress
Ingress --> Frontend
Ingress --> Admin
Ingress --> Grafana
Frontend --> Gateway
Admin --> Gateway
Gateway --> Syssvr
Gateway --> Ressvr
Gateway --> Unssvr
style NLB fill:#fff4e6
style Gateway fill:#f3e5f5
1.2 租户服务架构
graph TB
Gateway["gwsvr 网关服务
解析租户ID"] T1["tenant-***
租户1"] T2["tenant-***
租户2"] T3["tenant-***
租户3"] N1["NodeRED :1880"] E1["EventFlow :1889"] B1["Notebook :2718"] N2["NodeRED :1880"] E2["EventFlow :1889"] B2["Notebook :2718"] N3["NodeRED :1880"] E3["EventFlow :1889"] B3["Notebook :2718"] Gateway --> T1 Gateway --> T2 Gateway --> T3 T1 --> N1 T1 --> E1 T1 --> B1 T2 --> N2 T2 --> E2 T2 --> B2 T3 --> N3 T3 --> E3 T3 --> B3 style Gateway fill:#f3e5f5 style T1 fill:#e8f5e9 style T2 fill:#e8f5e9 style T3 fill:#e8f5e9
解析租户ID"] T1["tenant-***
租户1"] T2["tenant-***
租户2"] T3["tenant-***
租户3"] N1["NodeRED :1880"] E1["EventFlow :1889"] B1["Notebook :2718"] N2["NodeRED :1880"] E2["EventFlow :1889"] B2["Notebook :2718"] N3["NodeRED :1880"] E3["EventFlow :1889"] B3["Notebook :2718"] Gateway --> T1 Gateway --> T2 Gateway --> T3 T1 --> N1 T1 --> E1 T1 --> B1 T2 --> N2 T2 --> E2 T2 --> B2 T3 --> N3 T3 --> E3 T3 --> B3 style Gateway fill:#f3e5f5 style T1 fill:#e8f5e9 style T2 fill:#e8f5e9 style T3 fill:#e8f5e9
二、请求流转链路
2.1 用户访问前端
graph TB
Browser["用户浏览器"]
DNS["Route 53
DNS 解析"] NLB["AWS NLB
L4 负载均衡
TCP:80/443"] Ingress["Ingress Nginx
L7 路由
Host: tier0-eks-frontend.tier0.dev
Path: /"] Frontend["Frontend
React/Vue 前端
静态资源 + API 代理
:3000"] Browser -->|HTTPS| DNS DNS --> NLB NLB --> Ingress Ingress --> Frontend style DNS fill:#e1f5ff style NLB fill:#fff4e6 style Ingress fill:#f3e5f5 style Frontend fill:#e8f5e9
DNS 解析"] NLB["AWS NLB
L4 负载均衡
TCP:80/443"] Ingress["Ingress Nginx
L7 路由
Host: tier0-eks-frontend.tier0.dev
Path: /"] Frontend["Frontend
React/Vue 前端
静态资源 + API 代理
:3000"] Browser -->|HTTPS| DNS DNS --> NLB NLB --> Ingress Ingress --> Frontend style DNS fill:#e1f5ff style NLB fill:#fff4e6 style Ingress fill:#f3e5f5 style Frontend fill:#e8f5e9
2.2 API 请求链路
graph TB
API["前端 API 请求
POST /api/v1/device/list"] Ingress["Ingress Nginx"] Gateway["gwsvr 网关"] Auth["JWT验证
租户ID提取
权限校验
限流熔断"] Syssvr["syssvr"] Ressvr["ressvr"] Unssvr["unssvr"] Tenant["tenant service"] subgraph DataLayer["数据层"] PG["PostgreSQL"] Redis["Redis"] ETCD["ETCD"] end API --> Ingress Ingress --> Gateway Gateway --> Auth Auth --> Syssvr Auth --> Ressvr Auth --> Unssvr Auth --> Tenant Syssvr --> PG Ressvr --> PG Unssvr --> PG Tenant --> PG Syssvr --> Redis Ressvr --> Redis Syssvr --> ETCD style Gateway fill:#f3e5f5 style Auth fill:#fff3e0 style DataLayer fill:#e8f5e9
POST /api/v1/device/list"] Ingress["Ingress Nginx"] Gateway["gwsvr 网关"] Auth["JWT验证
租户ID提取
权限校验
限流熔断"] Syssvr["syssvr"] Ressvr["ressvr"] Unssvr["unssvr"] Tenant["tenant service"] subgraph DataLayer["数据层"] PG["PostgreSQL"] Redis["Redis"] ETCD["ETCD"] end API --> Ingress Ingress --> Gateway Gateway --> Auth Auth --> Syssvr Auth --> Ressvr Auth --> Unssvr Auth --> Tenant Syssvr --> PG Ressvr --> PG Unssvr --> PG Tenant --> PG Syssvr --> Redis Ressvr --> Redis Syssvr --> ETCD style Gateway fill:#f3e5f5 style Auth fill:#fff3e0 style DataLayer fill:#e8f5e9
2.3 租户服务请求链路
graph TB
User["用户请求 NodeRED
GET /nodered/tenant-***/"] Ingress["Ingress Nginx
匹配规则"] Gateway["gwsvr 网关"] Parse["解析路径
提取租户ID
验证权限
构建目标
代理请求"] NodeRED["NodeRED :1880
流程编辑器"] EMQX["EMQX :1883
mid命名空间"] User --> Ingress Ingress --> Gateway Gateway --> Parse Parse -->|内部路由| NodeRED NodeRED -->|MQTT连接| EMQX style Gateway fill:#f3e5f5 style Parse fill:#fff3e0 style NodeRED fill:#e8f5e9
GET /nodered/tenant-***/"] Ingress["Ingress Nginx
匹配规则"] Gateway["gwsvr 网关"] Parse["解析路径
提取租户ID
验证权限
构建目标
代理请求"] NodeRED["NodeRED :1880
流程编辑器"] EMQX["EMQX :1883
mid命名空间"] User --> Ingress Ingress --> Gateway Gateway --> Parse Parse -->|内部路由| NodeRED NodeRED -->|MQTT连接| EMQX style Gateway fill:#f3e5f5 style Parse fill:#fff3e0 style NodeRED fill:#e8f5e9
2.4 IoT 设备数据链路
graph TB
Device["IoT 设备"]
NLB["AWS NLB"]
EMQX["EMQX MQTT Broker"]
Auth["认证插件"]
PG["PostgreSQL"]
Rule["规则引擎"]
Webhook["Webhook"]
NodeRED["NodeRED"]
TS["TimescaleDB"]
Device -->|MQTT| NLB
NLB --> EMQX
EMQX --> Auth
Auth --> PG
EMQX --> Rule
Rule --> Webhook
Webhook --> NodeRED
NodeRED --> TS
style EMQX fill:#fff4e6
style Rule fill:#f3e5f5
三、基础设施详情
3.1 网络架构
graph TB
Internet["Internet"]
IGW["Internet Gateway"]
NLB["Network Load Balancer"]
subgraph VPC["VPC vpc-***"]
subgraph Public1["Public Subnet AZ1"]
NAT1["NAT Gateway"]
end
subgraph Public2["Public Subnet AZ2"]
NAT2["NAT Gateway"]
end
subgraph Private1["Private Subnet AZ1"]
EKS1["EKS Nodes"]
PG1["PostgreSQL Primary"]
end
subgraph Private2["Private Subnet AZ2"]
EKS2["EKS Nodes"]
PG2["PostgreSQL Standby"]
end
end
Internet --> IGW
IGW --> NLB
NLB --> EKS1
NLB --> EKS2
EKS1 --> NAT1
EKS2 --> NAT2
NAT1 --> IGW
NAT2 --> IGW
style VPC fill:#e3f2fd
style Public1 fill:#fff3e0
style Public2 fill:#fff3e0
style Private1 fill:#f3e5f5
style Private2 fill:#f3e5f5
3.2 EKS 集群配置
| 配置项 | 值 | 说明 |
| 集群名称 | tier0-eks-pre | 预生产环境 |
| K8s 版本 | 1.34 | 最新稳定版 |
| 节点组 | managed | AWS 托管节点组 |
| 节点数量 | 6 | 跨 3 个 AZ |
| 节点类型 | t3.medium/large | 按需调整 |
| OIDC | 已启用 | IAM Roles for Service Accounts |
| CNI | AWS VPC CNI | 原生 VPC 网络 |
| CSI | EBS CSI, EFS CSI | 存储驱动 |
3.3 EC2 PostgreSQL HA 集群
graph TB
NLB["Internal NLB
postgres-nlb-***.elb.ap-southeast-1.amazonaws.com
:5432"] subgraph Primary["Primary 主库
IP: 172.31.x.x
Instance: t3.medium"] PG1["PostgreSQL :5432"] Node1["Node Exporter :9100"] PGExp1["PG Exporter :9187"] end subgraph Standby["Standby 从库
IP: 172.31.x.x
Instance: t3.medium"] PG2["PostgreSQL :5432"] Node2["Node Exporter :9100"] PGExp2["PG Exporter :9187"] end K8S1["K8s Service
postgres-leader
ExternalName"] K8S2["K8s Service
postgres-replica
ClusterIP 只读"] NLB --> PG1 NLB --> PG2 PG1 -->|流复制| PG2 K8S1 --> NLB K8S2 --> PG2 style Primary fill:#e8f5e9 style Standby fill:#fff3e0 style NLB fill:#e3f2fd
postgres-nlb-***.elb.ap-southeast-1.amazonaws.com
:5432"] subgraph Primary["Primary 主库
IP: 172.31.x.x
Instance: t3.medium"] PG1["PostgreSQL :5432"] Node1["Node Exporter :9100"] PGExp1["PG Exporter :9187"] end subgraph Standby["Standby 从库
IP: 172.31.x.x
Instance: t3.medium"] PG2["PostgreSQL :5432"] Node2["Node Exporter :9100"] PGExp2["PG Exporter :9187"] end K8S1["K8s Service
postgres-leader
ExternalName"] K8S2["K8s Service
postgres-replica
ClusterIP 只读"] NLB --> PG1 NLB --> PG2 PG1 -->|流复制| PG2 K8S1 --> NLB K8S2 --> PG2 style Primary fill:#e8f5e9 style Standby fill:#fff3e0 style NLB fill:#e3f2fd
四、服务详情
4.1 业务服务矩阵
| 服务 | 端口 | 功能 | 依赖 |
|---|---|---|---|
| gwsvr | 8795 | API 网关、路由、认证 | Redis, ETCD, PostgreSQL |
| syssvr | 9540 | 系统管理、用户、权限 | PostgreSQL, Redis |
| ressvr | 5726 | 资源管理、设备、产品 | PostgreSQL, Redis, EMQX |
| unssvr | 9623/9633 | 通用服务、文件、通知 | PostgreSQL, S3 |
| timedjob | 3256 | 定时任务执行 | PostgreSQL, Redis |
| timedscheduler | 9284 | 任务调度 | PostgreSQL, ETCD |
| frontend | 3000 | Web 前端 | gwsvr (API) |
| platform-admin | 3000 | 管理后台 | gwsvr (API) |
4.2 中间件服务
| 组件 | 命名空间 | 端口 | 说明 |
|---|---|---|---|
| Redis | default | 6379 | 缓存、会话、分布式锁 |
| ETCD | default | 2379 | 配置中心、服务发现 |
| EMQX | mid | 1883/8883 | MQTT Broker |
| PostgreSQL | EC2 | 5432 | 主数据库 |
4.3 租户服务
| 服务 | 端口 | 功能 |
|---|---|---|
| NodeRED | 1880 | 可视化流程编辑器 |
| EventFlow | 1889 | 事件流处理引擎 |
| Notebook | 2718 | 数据分析笔记本 |
五、监控系统
5.1 监控架构
graph TB
subgraph Exporters["数据采集层"]
Node["Node Exporter :9100"]
PGExp["PG Exporter :9187"]
RedisExp["Redis Exporter :9121"]
EMQXExp["EMQX Metrics :18083"]
CWExp["CloudWatch Exporter :9106"]
end
Prom["Prometheus
7天存储 50Gi
121条告警规则"] Grafana["Grafana
7个面板
实时监控"] Alert["Alertmanager
飞书通知
告警路由"] Loki["Loki
日志聚合
7天保留"] Node --> Prom PGExp --> Prom RedisExp --> Prom EMQXExp --> Prom CWExp --> Prom Prom --> Grafana Prom --> Alert Prom --> Loki style Prom fill:#fff4e6 style Grafana fill:#e8f5e9 style Alert fill:#ffebee style Loki fill:#f3e5f5
7天存储 50Gi
121条告警规则"] Grafana["Grafana
7个面板
实时监控"] Alert["Alertmanager
飞书通知
告警路由"] Loki["Loki
日志聚合
7天保留"] Node --> Prom PGExp --> Prom RedisExp --> Prom EMQXExp --> Prom CWExp --> Prom Prom --> Grafana Prom --> Alert Prom --> Loki style Prom fill:#fff4e6 style Grafana fill:#e8f5e9 style Alert fill:#ffebee style Loki fill:#f3e5f5
5.2 Grafana 面板列表
| 面板名称 | 说明 | 关键指标 |
| PostgreSQL EC2 HA - Complete | 数据库完整监控 | QPS, 连接数, 缓存命中率, 复制延迟 |
| Production Overview | 生产环境总览 | 节点状态, Pod 状态, 资源使用 |
| SLA Monitoring | SLA 监控 | 可用性, 响应时间, 错误率 |
| Business Monitoring | 业务监控 | API QPS, 延迟, 错误 |
| Tenant Details | 租户详情 | 租户资源使用, 请求量 |
| Logs Dashboard | 日志监控 | 日志量, 错误日志, 级联筛选 |
| Business Logs | 业务日志 | 业务服务日志 |
5.3 告警规则分类
| 类别 | 数量 | 示例 |
| Critical | 7 | NodeDown, PodCrashLooping, PostgreSQLDown |
| Warning | 14 | HighCPU, HighMemory, HighDiskUsage |
| Info | 3 | PodRestarted, DeploymentUpdated |
| Recording | 8 | 预计算规则 |
六、域名与入口
| 域名 | 服务 | 端口 | 说明 |
|---|---|---|---|
| tier0-eks-frontend.tier0.dev | Frontend | 3000 | 用户前端 |
| tier0-admin-dev.tier0.dev | Platform Admin | 3000 | 管理后台 |
| grafana.tier0.dev | Grafana | 3000 | 监控面板 |
| locust.tier0.dev | Locust | 8089 | 压测工具 |
| emqx-dashboard (NLB) | EMQX Dashboard | 18083 | MQTT 管理 |
| emqx-service (NLB) | EMQX | 1883/8883 | MQTT 服务 |
七、运维手册
7.1 常用命令
# 查看所有服务状态
kubectl get pods -A | grep -v Running
# 查看业务服务日志
kubectl logs -n default -l app=gwsvr --tail=100 -f
# 查看租户服务
kubectl get pods -n tenant-tenant-***
# 扩缩容
kubectl scale deployment -n default gwsvr --replicas=2
# 启动压测
kubectl scale deployment -n locust locust-master --replicas=1
kubectl scale deployment -n locust locust-worker --replicas=3
# 查看监控 targets
kubectl port-forward -n monitoring svc/prometheus-operated 9090:9090
7.2 故障排查
# Pod 异常
kubectl describe pod -n
kubectl logs -n --previous
# 网络问题
kubectl exec -it -- curl -v http://service:port
# 数据库连接
kubectl exec -it -- psql -h postgres-leader -U *** -d ***
# 查看事件
kubectl get events -n --sort-by='.lastTimestamp'
八、目录结构
/data/cdk-kiro/
├── tier0/ # 一键部署
│ ├── config/
│ │ └── env.template # 环境变量模板
│ ├── infrastructure/
│ │ └── terraform/ # Terraform 模块
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── modules/
│ │ ├── vpc/
│ │ ├── eks/
│ │ ├── efs/
│ │ ├── s3/
│ │ └── iam/
│ ├── business/
│ │ ├── services/ # 业务服务 YAML
│ │ ├── tenants/ # 租户配置
│ │ ├── configmaps/ # ConfigMap
│ │ └── ingress/ # Ingress 配置
│ ├── monitoring/
│ │ ├── postgres-complete-monitoring.yaml
│ │ └── production-monitoring-rules.yaml
│ └── scripts/
│ ├── deploy.sh # 主部署脚本
│ ├── deploy-infrastructure.sh
│ ├── deploy-business.sh
│ └── common.sh
├── monitoring/ # 监控配置
├── locust/ # 压测工具
│ ├── k8s/
│ │ └── locust-deployment.yaml
│ └── scripts/
│ └── database_load_test.py
├── docs/ # 文档
│ ├── v2-current/
│ │ └── tier0-complete-architecture.md
│ └── v1-archive/
└── backups/
九、连接信息与凭证
9.1 数据库连接
PostgreSQL (EC2 HA)
| 配置项 | 值 |
| 主库地址 | `postgres-leader.default.svc.cluster.local:5432` |
| 从库地址 | `postgres-replica.default.svc.cluster.local:5432` |
| NLB 地址 | `postgres-nlb-***.elb.ap-southeast-1.amazonaws.com:5432` |
| 数据库名 | `***` |
| 用户名 | `***` |
| 密码 | `***` |
| DSN | `postgres://***:***@postgres-leader:5432/***?sslmode=disable` |
# K8s 内部连接
psql -h postgres-leader -U *** -d ***
# 外部连接 (通过 NLB)
psql -h postgres-nlb-***.elb.ap-southeast-1.amazonaws.com -U *** -d ***
Redis
| 配置项 | 值 |
| 地址 | `redis.default.svc.cluster.local:6379` |
| 密码 | 无 (内网访问) |
# 连接测试
kubectl exec -it deployment/redis -n default -- redis-cli ping
ETCD
| 配置项 | 值 |
| 地址 | `etcd.default.svc.cluster.local:2379` |
| Endpoints | `http://etcd.default.svc.cluster.local:2379` |
# 连接测试
kubectl exec -it etcd-0 -n default -- etcdctl endpoint health
9.2 消息队列
EMQX (MQTT Broker)
| 配置项 | 值 |
| MQTT 地址 | `k8s-ingressn-***.elb.ap-southeast-1.amazonaws.com` |
| MQTT 端口 | `1883` (TCP), `8883` (TLS), `8083` (WebSocket) |
| Dashboard | `k8s-ingressn-***.elb.ap-southeast-1.amazonaws.com:18083` |
| 用户名 | `***` |
| 密码 | `***` |
# MQTT 连接测试
mosquitto_pub -h k8s-mid-emqxserv-*.elb.ap-southeast-1.amazonaws.com -p 1883 -t test -m "hello"
9.3 监控系统
Grafana
| 配置项 | 值 |
| 地址 | `https://grafana.tier0.dev` |
| 用户名 | `***` |
| 密码 | `Admin@123456` |
Prometheus
| 配置项 | 值 |
| 内部地址 | `prometheus-operated.monitoring.svc.cluster.local:9090` |
| 端口转发 | `kubectl port-forward -n monitoring svc/prometheus-operated 9090:9090` |
Alertmanager
| 配置项 | 值 |
| 内部地址 | `alertmanager-operated.monitoring.svc.cluster.local:9093` |
9.4 AWS 云组件
S3 存储桶
| 存储桶名称 | 用途 | Region |
| `tier0-upload-pre` | 用户上传文件 | ap-southeast-1 |
| `tier0-upload-public-pre` | 公开资源 | ap-southeast-1 |
| `tier0-upload-temp-pre` | 临时文件 | ap-southeast-1 |
# 访问示例
aws s3 ls s3://tier0-upload-pre/ --region ap-southeast-1
EFS 文件系统
| 文件系统 ID | 名称 | 用途 |
|---|---|---|
| `fs-05278dec70d98abd2` | tier0-efs | 业务数据持久化 |
| `fs-0b8b9744472f565f8` | monitoring-efs | 监控数据存储 |
# 挂载点
mount -t efs fs-05278dec70d98abd2:/ /mnt/efs
NLB 负载均衡器
| 名称 | DNS | 类型 | 用途 |
|---|---|---|---|
| k8s-ingressn-ingressn | `k8s-ingressn-***.elb.ap-southeast-1.amazonaws.com` | internet-facing | Ingress 入口 |
| k8s-mid-emqxserv | `k8s-ingressn-***.elb.ap-southeast-1.amazonaws.com` | internet-facing | MQTT 服务 |
| k8s-mid-emqxdash | `k8s-ingressn-***.elb.ap-southeast-1.amazonaws.com` | internet-facing | EMQX Dashboard |
| postgres-nlb | `postgres-nlb-***.elb.ap-southeast-1.amazonaws.com` | internal | PostgreSQL |
| k8s-locust-locustma | `k8s-ingressn-***.elb.ap-southeast-1.amazonaws.com` | internet-facing | Locust 压测 |
EC2 实例
| 名称 | 实例 ID | 私有 IP | 用途 |
|---|---|---|---|
| postgres-ha-primary | i-*** | 172.31.x.x | PostgreSQL 主库 |
| postgres-ha-standby | i-*** | 172.31.x.x | PostgreSQL 从库 |
# SSH 连接 (通过 SSM)
aws ssm start-session --target i-*** --region ap-southeast-1
9.5 业务服务端口
| 服务 | ClusterIP 端口 | 说明 |
|---|---|---|
| gwsvr | 8795 | API 网关 |
| syssvr | 9540 | 系统服务 |
| ressvr | 5726 | 资源服务 |
| unssvr | 9623, 9633 | 通用服务 |
| timedjob | 3256 | 定时任务 |
| timedscheduler | 9284, 3256 | 任务调度 |
| frontend | 3000 | 前端 |
| platform-admin | 3000 | 管理后台 |
9.6 租户服务端口
| 服务 | 端口 | 说明 |
|---|---|---|
| nodered | 1880 | NodeRED 编辑器 |
| eventflow | 1889 | 事件流处理 |
| notebook | 2718 | 数据分析笔记本 |
9.7 监控 Exporter 端口
| Exporter | 端口 | 目标 |
| Node Exporter | 9100 | EC2 主机指标 |
| PostgreSQL Exporter | 9187 | PostgreSQL 指标 |
| Redis Exporter | 9121 | Redis 指标 |
| EMQX Metrics | 18083 | EMQX 指标 |
| CloudWatch Exporter | 9106 | AWS 指标 |
十、环境变量配置
10.1 业务服务环境变量
# 数据库配置
dbType: pgsql
dbDSN: postgres://***:***@postgres-leader:5432/***?sslmode=disable
dbIsInitTable: true
# Redis 配置
REDIS_ADDR: redis.default.svc.cluster.local:6379
# ETCD 配置
ETCD_ENDPOINTS: http://etcd.default.svc.cluster.local:2379
# EMQX 配置
MQTT_BROKER: tcp://emqx.mid.svc.cluster.local:1883
# S3 配置
AWS_REGION: ap-southeast-1
S3_BUCKET: tier0-upload-pre
S3_PUBLIC_BUCKET: tier0-upload-public-pre
10.2 环境变量模板位置
/data/cdk-kiro/tier0/config/env.template