安装 KEDA 和 HTTP Add-on,让 k3s 支持扩缩容至0,节省更多服务器资源
安装 KEDA 和 HTTP Add-on,让 k3s 支持扩缩容至0,节省更多服务器资源
- 安装 KEDA 核心组件
# 添加 KEDA Helm 仓库
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
# 创建命名空间并安装 KEDA (降低资源请求以适应资源受限环境)
# 官方默认值: operator 100m CPU/256Mi 内存, metricServer 100m CPU/256Mi 内存
# 调整后配置:
# - operator: 降低内存请求到 128Mi, CPU 保持 100m
# - metricServer: 降低 CPU 到 50m, 内存到 64Mi
kubectl create namespace keda
helm install keda kedacore/keda --namespace keda \
--set resources.operator.requests.cpu=100m \
--set resources.operator.requests.memory=128Mi \
--set resources.operator.limits.cpu=500m \
--set resources.operator.limits.memory=512Mi \
--set resources.metricServer.requests.cpu=50m \
--set resources.metricServer.requests.memory=64Mi \
--set resources.metricServer.limits.cpu=500m \
--set resources.metricServer.limits.memory=512Mi
# 验证 KEDA 安装结果
# 预期输出: 应该看到 keda-operator 和 keda-metrics-apiserver 两个 Pod 处于 Running 状态
kubectl get pods -n keda
- 安装 KEDA HTTP Add-on
# 安装 HTTP Add-on (降低资源请求以适应资源受限环境)
# 官方默认值: operator/interceptor 各 250m CPU, 20Mi 内存
# 调整后配置: 降低 CPU 请求到 50m, 内存请求到 64Mi
helm install http-add-on kedacore/keda-add-ons-http --namespace keda \
--set interceptor.resources.requests.cpu=50m \
--set interceptor.resources.requests.memory=64Mi \
--set interceptor.resources.limits.cpu=500m \
--set interceptor.resources.limits.memory=256Mi \
--set operator.resources.requests.cpu=50m \
--set operator.resources.requests.memory=64Mi \
--set operator.resources.limits.cpu=500m \
--set operator.resources.limits.memory=256Mi \
--set scaler.grpcHealthProbe.enabled=false
# 验证 HTTP Add-on 安装
# 预期输出: 应该看到 keda-add-ons-http-interceptor 和 keda-add-ons-http-operator 两个 Pod
kubectl get pods -n keda | grep http
- 验证完整安装
# 查看所有 KEDA 相关资源
kubectl get all -n keda
# 查看 CRD
kubectl get crd | grep keda
- 测试
kubectl apply -f test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-app
spec:
replicas: 0
selector:
matchLabels:
app: http-app
template:
metadata:
labels:
app: http-app
spec:
containers:
- name: http-app
image: python:3.9-alpine
command:
- python
- -c
- |
from http.server import HTTPServer, BaseHTTPRequestHandler
import time
class SlowHandler(BaseHTTPRequestHandler):
def do_GET(self):
time.sleep(5) # 延迟 0.5 秒,产生积压
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
self.wfile.write(b'Hello, KEDA!\n')
def log_message(self, format, *args):
pass # 禁用日志输出
print('Server starting on port 5678...')
HTTPServer(('0.0.0.0', 5678), SlowHandler).serve_forever()
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-app-service
spec:
selector:
app: http-app
ports:
- protocol: TCP
port: 80
targetPort: 5678
type: ClusterIP
---
apiVersion: http.keda.sh/v1alpha1
kind: HTTPScaledObject
metadata:
name: http-app-scaledobject
spec:
hosts:
- http-app-service.default.svc.cluster.local
scaleTargetRef:
name: http-app
service: http-app-service
port: 80
replicas:
min: 0 # 默认部署 0 个副本, 实现 scale to zero
max: 5 # 最大扩容到 5 个副本
targetPendingRequests: 2
scaledownPeriod: 30
# 创建一个临时 Pod 进行测试
kubectl run ab-test2 --image=httpd:alpine --rm -it --restart=Never -- \
ab -t 60 -n1000000 -c 100000 -k -r -H "Host: http-app-service.default.svc.cluster.local" \
http://keda-add-ons-http-interceptor-proxy.keda.svc.cluster.local:8080/
- 卸载
helm uninstall keda -n keda
helm uninstall http-add-on -n keda
其他注意事项:
删除时如果卡住,可通过 claude code 进行排查和处理。这是参考命令:
kubectl patch httpscaledobject <资源名> -n <命名空间> -p '{"metadata":{"finalizers":null}}' --type=merge
https://discuss.plugins-world.cn/post/u2si9uNl
开发交流