Files
ljwx-k8s/KEDA-MIGRATION-GUIDE.md
2026-02-20 22:50:45 +08:00

8.3 KiB
Raw Permalink Blame History

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 已安装到 keda namespace
  • ✅ 3 个 KEDA pods 运行正常:
    • keda-operator
    • keda-operator-metrics-apiserver
    • keda-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"))'

常用指标类型

  1. HTTP 请求:

    • *_http_requests_total - 总请求数
    • *_http_request_duration_seconds - 请求延迟
    • *_http_request_in_flight - 并发请求数
  2. 连接数:

    • *_connections_active - 活跃连接
    • *_connections_total - 总连接数
  3. 队列长度:

    • *_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 秒)
  • 检查指标是否有延迟

📖 参考资料


创建时间: 2025-12-31 状态: ✅ Grafana 已迁移,其他服务待迁移 下一步: 逐步迁移其他 5 个 HPA