# KEDA 自动扩缩容部署总结 部署时间: 2026-01-30 ## ✅ 部署完成 ### KEDA 核心组件 | 组件 | 状态 | 说明 | |------|------|------| | keda-operator | ✅ Running | KEDA 核心控制器 | | keda-metrics-apiserver | ✅ Running | 指标 API 服务器 | | keda-admission-webhooks | ✅ Running | 准入 Webhook | **命名空间**: `keda` ### 已配置的自动扩缩容服务 #### 1. Navigation 导航服务 ✅ - **状态**: 已配置并运行 - **当前副本数**: 0(空闲状态) - **配置**: - 最小副本: 0 - 最大副本: 10 - 触发器: Prometheus (HTTP 请求) + CPU 使用率 - 冷却期: 3 分钟 **ScaledObject**: `navigation-scaler` **HPA**: `keda-hpa-navigation-scaler` #### 2. Redis 缓存服务 ⏳ - **状态**: 配置文件已创建,待应用 - **说明**: 需要先为 Redis 配置 Prometheus exporter - **配置文件**: `scalers/redis-scaler.yaml` #### 3. PostgreSQL 数据库 ❌ - **状态**: 不推荐使用 KEDA 扩展 - **原因**: - PostgreSQL 是有状态服务,多副本会导致存储冲突 - 需要配置主从复制才能安全扩展 - 建议使用 PostgreSQL Operator 或 PgBouncer + KEDA - **详细说明**: `scalers/postgresql-说明.md` ## 配置文件位置 ``` /home/fei/k3s/009-基础设施/007-keda/ ├── deploy.sh # 部署脚本 ├── values.yaml # KEDA Helm 配置 ├── readme.md # 详细文档 ├── 部署总结.md # 本文档 └── scalers/ # ScaledObject 配置 ├── navigation-scaler.yaml # ✅ 已应用 ├── redis-scaler.yaml # ⏳ 待应用 └── postgresql-说明.md # ⚠️ PostgreSQL 不适合 KEDA ``` ## 验证 KEDA 功能 ### 测试缩容到 0 Navigation 服务已经自动缩容到 0: ```bash kubectl get deployment navigation -n navigation # 输出: READY 0/0 ``` ### 测试从 0 扩容 访问导航页面触发扩容: ```bash # 1. 访问页面 curl https://dh.u6.net3w.com # 2. 观察副本数变化 kubectl get deployment navigation -n navigation -w # 预期: 10-30 秒内副本数从 0 变为 1 ``` ## 查看 KEDA 状态 ### 查看所有 ScaledObject ```bash kubectl get scaledobject -A ``` ### 查看 HPA(自动创建) ```bash kubectl get hpa -A ``` ### 查看 KEDA 日志 ```bash kubectl logs -n keda -l app.kubernetes.io/name=keda-operator -f ``` ## 下一步操作 ### 1. 应用 Redis 自动扩缩容 ```bash # 首先需要为 Redis 添加 Prometheus exporter # 然后应用 ScaledObject kubectl apply -f /home/fei/k3s/009-基础设施/007-keda/scalers/redis-scaler.yaml ``` ### 2. PostgreSQL 扩展方案 **不要使用 KEDA 直接扩展 PostgreSQL!** 推荐方案: - **方案 1**: 使用 PostgreSQL Operator(Zalando 或 CloudNativePG) - **方案 2**: 部署 PgBouncer 连接池 + KEDA 扩展 PgBouncer - **方案 3**: 配置读写分离,只对只读副本使用 KEDA 详细说明:`/home/fei/k3s/009-基础设施/007-keda/scalers/postgresql-说明.md` ### 3. 监控扩缩容行为 在 Grafana 中导入 KEDA 仪表板: - 访问: https://grafana.u6.net3w.com - 导入仪表板 ID: **14691** ## 已修复的问题 ### 问题 1: CPU 触发器配置错误 **错误信息**: ``` The 'type' setting is DEPRECATED and is removed in v2.18 - Use 'metricType' instead. ``` **解决方案**: 将 CPU 触发器配置从: ```yaml - type: cpu metadata: type: Utilization value: "60" ``` 改为: ```yaml - type: cpu metricType: Utilization metadata: value: "60" ``` ### 问题 2: Navigation 缺少资源配置 **解决方案**: 为 Navigation deployment 添加了 resources 配置: ```yaml resources: requests: cpu: 50m memory: 64Mi limits: cpu: 200m memory: 128Mi ``` ## 资源节省效果 ### Navigation 服务 - **之前**: 24/7 运行 1 个副本 - **现在**: 空闲时 0 个副本,有流量时自动启动 - **预计节省**: 80-90% 资源(假设大部分时间空闲) ### 预期总体效果 - **Navigation**: 节省 80-90% 资源 ✅ - **Redis**: 节省 70-80% 资源(配置后)⏳ - **PostgreSQL**: ❌ 不使用 KEDA,保持单实例运行 ## 监控指标 ### Prometheus 查询 ```promql # KEDA Scaler 活跃状态 keda_scaler_active{namespace="navigation"} # 当前指标值 keda_scaler_metrics_value{scaledObject="navigation-scaler"} # HPA 当前副本数 kube_horizontalpodautoscaler_status_current_replicas{horizontalpodautoscaler="keda-hpa-navigation-scaler"} ``` ## 注意事项 ### 1. 冷启动时间 从 0 扩容到可用需要 10-30 秒: - 拉取镜像(如果本地没有) - 启动容器 - 健康检查通过 ### 2. 连接保持 客户端需要支持重连机制,因为服务可能会缩容到 0。 ### 3. 有状态服务 PostgreSQL 等有状态服务**不能**直接使用 KEDA 扩展: - ❌ 多副本会导致存储冲突 - ❌ 没有主从复制会导致数据不一致 - ✅ 需要使用专业的 Operator 或连接池方案 ## 故障排查 ### ScaledObject 未生效 ```bash # 查看详细状态 kubectl describe scaledobject -n # 查看事件 kubectl get events -n --sort-by='.lastTimestamp' ``` ### HPA 未创建 检查 KEDA operator 日志: ```bash kubectl logs -n keda -l app.kubernetes.io/name=keda-operator ``` ## 文档参考 - 详细使用文档: `/home/fei/k3s/009-基础设施/007-keda/readme.md` - KEDA 官方文档: https://keda.sh/docs/ - Scalers 参考: https://keda.sh/docs/scalers/ ## 总结 ✅ **KEDA 已成功部署并运行** - KEDA 核心组件运行正常 - Navigation 服务已配置自动扩缩容 - 已验证缩容到 0 功能正常 - 准备好为更多服务配置自动扩缩容 **下一步**: 根据实际使用情况,逐步为 Redis 和 PostgreSQL 配置自动扩缩容。 --- **KEDA 让您的 K3s 集群更智能、更节省资源!** 🚀