3. 环境准备:安装Kubernetes集群(Minikube/Kind)、安装KEDA、安装Prometheus与Grafana
在开始KEDA自定义Metric触发器开发之前,需要搭建一套完整的实验环境。本章将指导你完成以下三个核心组件的安装与配置:Kubernetes集群(Minikube或Kind)、KEDA(Kubernetes Event-driven Autoscaling)、Prometheus与Grafana(监控与可视化平台)。
环境选择建议: 本地开发推荐使用Kind(轻量、启动快),需要完整Kubernetes体验或跨节点测试时选择Minikube。本课程后续示例均兼容两种集群。
3.1 整体架构概览
下图展示了本章将要搭建的完整实验环境组件及其关系:
3.2 安装 Kubernetes 集群
选择 Minikube 或 Kind 之一即可。下表对比了两者的核心差异:
| 特性 | Minikube | Kind (Kubernetes in Docker) |
|---|---|---|
| 底层技术 | 虚拟机(VirtualBox/HyperKit) | Docker 容器 |
| 启动速度 | 较慢(需启动 VM) | 快速(秒级) |
| 多节点支持 | 支持(需指定节点数) | 支持(通过配置文件) |
| 资源占用 | 较高 | 较低 |
| 适用场景 | 完整 K8s 体验、跨节点测试 | CI/CD、本地快速开发 |
3.2.1 安装 Kind(推荐)
- 安装 Kind CLI
# macOS (Homebrew)
brew install kind
# Linux (curl 下载)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# 验证安装
kind version
- 创建集群配置文件
kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- 启动集群
kind create cluster --config kind-config.yaml --name keda-demo
# 验证集群状态
kubectl cluster-info --context kind-keda-demo
kubectl get nodes
3.2.2 安装 Minikube(备选)
# macOS (Homebrew)
brew install minikube
# Linux (curl 下载)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动集群(指定 2 个 worker 节点)
minikube start --nodes 3 --cpus 4 --memory 8192 --driver hyperkit
# 验证
minikube status
kubectl get nodes
注意: Minikube 默认使用 VirtualBox 驱动,macOS 建议使用
--driver hyperkit 或 --driver docker。确保 Docker Desktop 已安装并运行。
3.3 安装 KEDA
KEDA 作为 Kubernetes 的 Operator,通过 Helm Chart 或 YAML 清单安装。本课程使用 Helm 方式,便于版本管理和配置更新。
3.3.1 安装 Helm(如未安装)
# macOS
brew install helm
# Linux
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 验证
helm version
3.3.2 添加 KEDA Helm 仓库并安装
# 添加 KEDA Helm 仓库
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
# 创建命名空间
kubectl create namespace keda
# 安装 KEDA(v2.12 稳定版)
helm install keda kedacore/keda \
--namespace keda \
--version 2.12.0 \
--set podIdentity.provider=none \
--set metricsServer.useHostNetwork=true
# 验证安装
kubectl get pods -n keda
kubectl get crd | grep keda
安装成功后,你会看到以下 Pod 运行在 keda 命名空间中:
| Pod 名称 | 组件 | 功能 |
|---|---|---|
keda-operator-xxx |
KEDA Operator | 核心控制器,管理 ScaledObject/ScaledJob |
keda-metrics-apiserver-xxx |
Metrics Server | 暴露自定义指标给 HPA |
keda-admission-webhooks-xxx |
Admission Webhook | 验证 ScaledObject 配置 |
3.4 安装 Prometheus
Prometheus 负责采集和存储自定义指标,KEDA 通过 Prometheus Scaler 查询这些指标来驱动弹性伸缩。
3.4.1 使用 Helm 安装 Prometheus Stack
# 添加 Prometheus 社区 Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 创建监控命名空间
kubectl create namespace monitoring
# 安装 kube-prometheus-stack(包含 Prometheus、Alertmanager、Grafana)
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set grafana.enabled=true \
--set grafana.service.type=ClusterIP \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
# 验证安装
kubectl get pods -n monitoring
3.4.2 验证 Prometheus 指标采集
# 端口转发 Prometheus Web UI
kubectl port-forward -n monitoring svc/prometheus-operated 9090:9090 &
# 访问 http://localhost:9090,在查询框中输入 up 查看指标
关键配置说明:
serviceMonitorSelectorNilUsesHelmValues=false 允许 KEDA 创建的 ServiceMonitor 被 Prometheus 自动发现,这是后续自定义指标采集的前提。
3.5 安装 Grafana
Grafana 用于可视化 Prometheus 中的指标数据,方便调试和观察弹性伸缩效果。
3.5.1 获取 Grafana 访问信息
# 获取 Grafana 管理员密码
kubectl get secret -n monitoring prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 --decode
# 端口转发 Grafana Web UI
kubectl port-forward -n monitoring svc/prometheus-grafana 3000:80 &
# 访问 http://localhost:3000,用户名: admin,密码: 上一步获取的值
3.5.2 配置 Prometheus 数据源
Grafana 默认已自动配置 Prometheus 数据源(指向 http://prometheus-operated:9090)。验证步骤:
- 登录 Grafana → 左侧齿轮图标 → Data Sources
- 确认
Prometheus数据源状态为 OK - 点击 Explore,输入
up查询,确认能返回数据
3.6 环境验证清单
完成上述安装后,执行以下命令验证所有组件是否正常运行:
# 1. 验证 Kubernetes 集群
kubectl cluster-info
kubectl get nodes
# 2. 验证 KEDA
kubectl get pods -n keda
kubectl get crd | grep -E "scaledobject|scaledjob|triggerauthentication"
# 3. 验证 Prometheus
kubectl get pods -n monitoring | grep prometheus
curl -s http://localhost:9090/api/v1/query?query=up | jq .
# 4. 验证 Grafana
curl -s http://localhost:3000/api/health | jq .
如果所有命令均返回正常状态,说明实验环境已准备就绪。下表总结了各组件的访问方式:
| 组件 | 端口 | 访问方式 | 默认凭据 |
|---|---|---|---|
| Kubernetes API | 6443 | kubectl |
kubeconfig |
| Prometheus UI | 9090 | kubectl port-forward |
无 |
| Grafana | 3000 | kubectl port-forward |
admin / 自动生成密码 |
| KEDA Metrics API | 443 | 集群内部访问 | 无 |