8.3 KiB
8.3 KiB
KEDA 迁移指南
日期: 2025-12-31 环境: OrbStack v1.33.5+orb1 状态: ✅ KEDA 已部署并验证
📊 背景
由于 OrbStack 的 kubelet 不提供 pod 级别的 cAdvisor metrics(container_cpu_usage_seconds_total, container_memory_working_set_bytes),传统的 HPA 无法获取 pod 的 CPU/Memory 使用率。
解决方案: 使用 KEDA (Kubernetes Event Driven Autoscaling) 直接从 Prometheus 查询指标进行扩缩容。
✅ KEDA 部署状态
已完成
- ✅ KEDA Helm repo 已添加
- ✅ KEDA 已安装到
kedanamespace - ✅ 3 个 KEDA pods 运行正常:
keda-operatorkeda-operator-metrics-apiserverkeda-admission-webhooks
- ✅ Grafana ScaledObject 已创建并验证工作
验证结果
$ kubectl get scaledobject -n monitoring
NAME SCALETARGETKIND SCALETARGETNAME MIN MAX READY ACTIVE
grafana-scaler apps/v1.Deployment grafana 1 3 True True
$ kubectl get hpa -n monitoring
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS
keda-hpa-grafana-scaler Deployment/grafana 500m/10 (avg) 1 3 2
关键指标: 500m/10 (avg) 表示当前有 0.5 个并发请求,目标是 10 个。
🔄 迁移其他 HPA
当前需要迁移的 HPA
| HPA 名称 | 命名空间 | 目标 | 当前状态 |
|---|---|---|---|
| ✅ grafana-hpa | monitoring | Deployment/grafana | 已迁移到 KEDA |
| ❌ prometheus-hpa | monitoring | Deployment/prometheus | 待迁移 |
| ❌ argocd-server-hpa | argocd | Deployment/argocd-server | 待迁移 |
| ❌ ingress-nginx-hpa | infra | Deployment/ingress-nginx-controller | 待迁移 |
| ❌ gitea-runner-hpa | gitea-runner | Deployment/gitea-runner | 待迁移 |
| ❌ claude-stock-backend-hpa | ljwx-stock | Deployment/claude-stock-backend | 待迁移 |
📝 迁移步骤模板
1. Prometheus 指标选择
根据应用类型选择合适的 Prometheus 指标:
监控类应用 (Prometheus, Grafana)
# 使用 HTTP 请求数
query: |
sum(rate(prometheus_http_requests_total[1m]))
threshold: "100" # 每秒 100 个请求
Web 服务 (ArgoCD, Ingress)
# 使用并发连接数
query: |
sum(nginx_ingress_controller_nginx_process_connections{state="active"})
threshold: "1000" # 1000 个活跃连接
后端服务 (Claude Stock Backend)
# 使用自定义业务指标
query: |
sum(http_requests_in_flight{job="claude-stock-backend"})
threshold: "50" # 50 个并发请求
2. 创建 ScaledObject
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: <service>-scaler
namespace: <namespace>
spec:
scaleTargetRef:
name: <deployment-name>
minReplicaCount: 1
maxReplicaCount: 3
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus.monitoring.svc.cluster.local:9090
metricName: <metric-name>
query: |
<prometheus-query>
threshold: "<threshold-value>"
3. 执行迁移
# 1. 删除旧的 HPA
kubectl delete hpa <hpa-name> -n <namespace>
# 2. 应用 ScaledObject
kubectl apply -f <scaledobject-file>.yaml
# 3. 验证
kubectl get scaledobject -n <namespace>
kubectl get hpa -n <namespace>
🎯 具体迁移示例
Prometheus
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: prometheus-scaler
namespace: monitoring
spec:
scaleTargetRef:
name: prometheus
minReplicaCount: 1
maxReplicaCount: 3
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus.monitoring.svc.cluster.local:9090
metricName: prometheus_http_requests_rate
query: |
sum(rate(prometheus_http_requests_total[1m]))
threshold: "100"
迁移命令:
kubectl delete hpa prometheus-hpa -n monitoring
kubectl apply -f prometheus-scaledobject.yaml
ArgoCD Server
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: argocd-server-scaler
namespace: argocd
spec:
scaleTargetRef:
name: argocd-server
minReplicaCount: 1
maxReplicaCount: 3
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus.monitoring.svc.cluster.local:9090
metricName: argocd_api_requests_rate
query: |
sum(rate(argocd_server_api_requests_total[1m]))
threshold: "50"
Ingress Nginx
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: ingress-nginx-scaler
namespace: infra
spec:
scaleTargetRef:
name: ingress-nginx-controller
minReplicaCount: 2
maxReplicaCount: 5
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus.monitoring.svc.cluster.local:9090
metricName: nginx_active_connections
query: |
sum(nginx_ingress_controller_nginx_process_connections{state="active"})
threshold: "1000"
🔍 验证和监控
检查 ScaledObject 状态
# 查看所有 ScaledObjects
kubectl get scaledobject --all-namespaces
# 查看详细信息
kubectl describe scaledobject <name> -n <namespace>
# 查看 KEDA 创建的 HPA
kubectl get hpa --all-namespaces
查看 KEDA 日志
# Operator 日志
kubectl logs -n keda deployment/keda-operator -f
# Metrics API Server 日志
kubectl logs -n keda deployment/keda-operator-metrics-apiserver -f
测试扩缩容
# 生成负载(以 Grafana 为例)
for i in {1..100}; do
curl -s http://grafana.monitoring.svc.cluster.local:3000 > /dev/null &
done
# 观察扩容
watch kubectl get deployment grafana -n monitoring
watch kubectl get hpa -n monitoring
📚 可用的 Prometheus 指标
查询可用指标
# 查看所有指标
kubectl exec -n monitoring deployment/prometheus -- \
wget -qO- 'http://localhost:9090/api/v1/label/__name__/values' | jq '.data[]'
# 查看特定服务的指标
kubectl exec -n monitoring deployment/prometheus -- \
wget -qO- 'http://localhost:9090/api/v1/label/__name__/values' | \
jq '.data[] | select(contains("grafana"))'
常用指标类型
-
HTTP 请求:
*_http_requests_total- 总请求数*_http_request_duration_seconds- 请求延迟*_http_request_in_flight- 并发请求数
-
连接数:
*_connections_active- 活跃连接*_connections_total- 总连接数
-
队列长度:
*_queue_length- 队列长度*_pending_requests- 待处理请求
💡 最佳实践
1. 选择合适的指标
- ✅ 使用业务相关的指标(请求数、连接数)
- ✅ 避免使用波动大的指标
- ✅ 设置合理的阈值(不要太敏感)
2. 设置合理的副本数
minReplicaCount: 1 # 最小副本数(节省资源)
maxReplicaCount: 5 # 最大副本数(防止过度扩容)
3. 配置冷却期
spec:
cooldownPeriod: 300 # 缩容冷却期(秒)
pollingInterval: 30 # 检查间隔(秒)
4. 使用多个触发器
triggers:
- type: prometheus
metadata:
query: |
sum(rate(http_requests_total[1m]))
threshold: "100"
- type: prometheus
metadata:
query: |
sum(http_request_in_flight)
threshold: "50"
🚨 故障排查
ScaledObject 不工作
# 1. 检查 ScaledObject 状态
kubectl describe scaledobject <name> -n <namespace>
# 2. 检查 KEDA operator 日志
kubectl logs -n keda deployment/keda-operator --tail=100
# 3. 验证 Prometheus 查询
kubectl exec -n monitoring deployment/prometheus -- \
wget -qO- 'http://localhost:9090/api/v1/query?query=<your-query>'
HPA 显示 <unknown>
- 检查 Prometheus 查询是否返回数据
- 检查 serverAddress 是否正确
- 检查 KEDA metrics-apiserver 是否运行
扩缩容不及时
- 调整
pollingInterval(默认 30 秒) - 调整
cooldownPeriod(默认 300 秒) - 检查指标是否有延迟
📖 参考资料
- KEDA 官方文档: https://keda.sh/docs/
- Prometheus Scaler: https://keda.sh/docs/scalers/prometheus/
- ScaledObject 规范: https://keda.sh/docs/concepts/scaling-deployments/
- 故障排查: https://keda.sh/docs/troubleshooting/
创建时间: 2025-12-31 状态: ✅ Grafana 已迁移,其他服务待迁移 下一步: 逐步迁移其他 5 个 HPA