Kubernetes 高并发处理实战(可落地案例 + 源码)
off999 2025-10-23 10:15 71 浏览 0 评论
目标场景:对外提供 HTTP API 的微服务在短时间内收到大量请求(例如每秒数千至数万 RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。
总体思路(多层防护):
- 边缘层:云 LB / Ingress(负载均衡 + TLS)
- 流量治理:Ingress Controller + Rate limiting(Envoy/Ingress-NGINX/Kong/Istio)
- 服务层:Deployment(多副本)+ Pod 资源限额 + 预热策略
- 弹性:Horizontal Pod Autoscaler(HPA)与 Cluster Autoscaler(若使用云)
- 缓存层:Redis(热点数据缓存)
- 异步处理:消息队列(RabbitMQ/Kafka)用于削峰
- 监控与告警:Prometheus + Alertmanager + Grafana
- 压测与回归:wrk/hey 或 k6
一、示例应用(简单 Node.js API)
先创建一个示例 HTTP 服务(模拟“慢”后端以观察扩容效果)。
app/server.js
const express = require('express');
const app = express();
app.get('/', async (req, res) => {
// 模拟业务耗时与低并发操作(例如 DB 查询)
const delay = Math.random() * 100; // 0-100ms
await new Promise(r => setTimeout(r, delay));
res.json({ ok: true, delay });
});
const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening ${port}`));
app/Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node","server.js"]
app/package.json(最少化)
{
"name":"demo-api",
"version":"1.0.0",
"main":"server.js",
"dependencies":{"express":"^4.18.2"}
}
构建并推镜像(例:使用 Docker Hub)
docker build -t yourrepo/demo-api:1.0 .
docker push yourrepo/demo-api:1.0
二、Kubernetes 基本部署(Deployment + Service)
k8s/deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-api
spec:
replicas: 2
selector:
matchLabels:
app: demo-api
template:
metadata:
labels:
app: demo-api
spec:
containers:
- name: demo-api
image: yourrepo/demo-api:1.0
ports:
- containerPort: 3000
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
readinessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: demo-api
spec:
selector:
app: demo-api
ports:
- port: 80
targetPort: 3000
type: ClusterIP
部署:
kubectl apply -f k8s/deploy.yaml
kubectl get pods -l app=demo-api -w
三、Ingress 与边缘限流(以 ingress-nginx + nginx-rate-limit 为例)
这里演示简单的基于 ingress-nginx 的全局限速(也可用 Kong/Envoy/Istio 做更复杂的限流 + 路由)。
安装 ingress-nginx(示例 Helm):
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx
创建 Ingress 并加注解限流:
k8s/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-api-ing
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/limit-connections: "50" # 并发连接限制(示例)
nginx.ingress.kubernetes.io/limit-rpm: "1000" # 请求每分钟
nginx.ingress.kubernetes.io/limit-rps: "20" # 请求每秒
spec:
rules:
- host: demo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: demo-api
port:
number: 80
应用:
kubectl apply -f k8s/ingress.yaml
注:实际生产中建议使用 IP/Key 基于用户维度限流、或使用 API Gateway(Kong/Traefik/Envoy)做更精细化的限流与认证。
四、缓存:使用 Redis 减少后端负载(示例)
部署 Redis(简单方式:bitnami chart)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install redis bitnami/redis --set auth.enabled=false
在应用中读写缓存(伪代码):
const redis = require('redis');
const client = redis.createClient({ url: 'redis://redis-master.default.svc.cluster.local:6379' });
await client.connect();
app.get('/item/:id', async (req, res) => {
const key = `item:${req.params.id}`;
const cached = await client.get(key);
if (cached) return res.json(JSON.parse(cached));
const data = await dbQuery(req.params.id); // 模拟
await client.setEx(key, 60, JSON.stringify(data)); // 60s
res.json(data);
});
缓存策略要点:
- 热点 key 设短 TTL 并定期刷新(避免缓存雪崩)
- 使用本地 LRU 缓存 + Redis 组合提升性能
- 使用 Redis Cluster 及持久化保证可用性
五、自动弹性:HPA(Horizontal Pod Autoscaler)基于 CPU / 自定义指标
确保集群安装 metrics-server:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
示例 HPA(基于 CPU):
k8s/hpa-cpu.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: demo-api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: demo-api
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
应用:
kubectl apply -f k8s/hpa-cpu.yaml
kubectl get hpa demo-api-hpa -w
基于自定义应用指标(例如 QPS / latency)
可以使用 Prometheus Adapter 将 Prometheus 指标暴露给 HPA(autoscaling/v2 支持 External / Object metrics)。配置较多,省略细节;实战中推荐把 request rate 或 latency 作为指标做扩容决策。
六、集群弹性:Cluster Autoscaler(自动添加节点)
如果你在云上(GKE/AKS/EKS)或使用 cloud-controller-manager,可安装 Cluster Autoscaler,允许在负载高时自动加节点(节点池扩容),配合 HPA 可实现从 Pod 到 Node 的自动弹性。
示例(EKS/GKE 有云厂商特定的 Chart / Docs):
- 在 cluster 中部署 cluster-autoscaler,并配置相应节点标签与最大最小节点数。
- (请参考云厂商文档进行安装与 IAM 权限配置)
七、削峰与异步:消息队列 + 后端异步消费
高并发写入或长耗时业务应使用异步队列削峰。示例:用户提交任务 → 接口返回 202 → 后台消费并处理。
可选队列:RabbitMQ / Kafka / NATS / RocketMQ
简要流程:
- API 接收请求并写入任务到队列(或 DB)
- 返回任务ID(快速响应)
- 后端工作进程(Kubernetes Deployment)消费队列并执行,结果写回 DB 或回调
八、服务网格与熔断(以 Istio 为例)
Istio / Envoy 支持:限流、熔断、重试、熔断降级等。示例 VirtualService 做 10% 金丝雀流量已在前文。熔断规则示例(DestinationRule):
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: demo-dr
spec:
host: demo-api
trafficPolicy:
outlierDetection:
consecutive5xxErrors: 5
interval: 10s
baseEjectionTime: 30s
maxEjectionPercent: 50
熔断能把不稳定的实例自动短期剔除以保护整体服务。
九、监控 + 告警配置(Prometheus & Grafana)
推荐指标:
- Pod CPU/Memory/Network
- Pod 就绪与重启次数
- 请求 QPS、错误率、95/99 百分位延迟(latency)
- Ingress/LB 请求速率、5xx 比例
安装(示例 kube-prometheus-stack):
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prom prometheus-community/kube-prometheus-stack
写 AlertRule(示例:错误率告警):
groups:
- name: demo.rules
rules:
- alert: HighErrorRate
expr: increase(nginx_ingress_controller_requests{status=~"5.."}[5m]) / increase(nginx_ingress_controller_requests[5m]) > 0.01
for: 2m
labels:
severity: page
annotations:
summary: "High 5xx error rate"
十、压测(验证方案是否有效)
使用 wrk 或 hey 进行压测。示例用 wrk 发起 1000 并发,持续 60 秒:
# 在本地或独立压测机上
wrk -t12 -c1000 -d60s http://<INGRESS_IP>/
观察:
- HPA 是否触发扩容(kubectl get hpa -w)
- Pods 数量是否增加(kubectl get pods -l app=demo-api -w)
- Node 是否扩容(若启用 Cluster Autoscaler)
- 应用延迟与 5xx 错误率(Prometheus / kubectl logs)
常见压测策略:
- 先小幅增加并发,观察指标,逐步提升(避免一锤子压垮集群)
- 模拟真实请求模式(短突发 + 持续高并发)
十一、实战中的优化小贴士(清单式)
- 合理设置资源 requests/limits:让调度器能正确决策并避免 OOM。
- ReadinessProbe 与 LivenessProbe:确保流量只发给健康 Pod;失败时尽快剔除。
- 预热机制:新 Pod 启动时可通过预热脚本加载缓存或连接池,避免冷启动延迟。
- 连接池(Backend DB):使用数据库连接池并限制池大小,防止数据库被瞬时连接耗尽。
- 短路/熔断:当下游服务不稳定时,先返回失败或降级,保护整体。
- 逐步放量(灰度/金丝雀):发布新版本或增加容量应采用金丝雀策略验证。
- 限速 + 队列:在边缘限流并把超出部分入队列异步处理。
- 日志与追踪(分布式追踪):使用 Jaeger/Zipkin 打通请求链路便于排查延迟。
- 容量预估:基于历史流量与 p95/p99 延迟估算需要的副本与节点。
- 避免副作用副本化:确保服务是幂等或无状态,方便水平扩展。
十二、常见故障与排查流程
- Pod 被频繁 OOM / CrashLoop
- 查看 kubectl describe pod 与 kubectl logs,提升 limits 或修复内存泄露。
- HPA 无法扩容
- 检查 metrics-server 是否工作:kubectl top pod;检查 HPA 事件。
- 请求大量 502/504(网关超时)
- 检查 Ingress 超时设置、Pod 就绪探针及后端响应时间。
- 数据库成为瓶颈
- 加缓存(Redis);增加 DB 读写分离或水平分库;使用连接池限制。
- Cluster 资源耗尽(无法调度)
- 检查 kubectl describe node,考虑启用 Cluster Autoscaler 或增加节点。
- 热点缓存击穿/雪崩
- 使用互斥锁(mutex)或提前刷新缓存、分散 TTL,避免同一时刻大量 miss。
十三、把它一键跑起来(最简化命令清单)
# 1) 部署 app(假设已 push 镜像)
kubectl apply -f k8s/deploy.yaml
kubectl apply -f k8s/ingress.yaml
# 2) 安装 metrics-server(HPA 需要)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 3) 创建 HPA
kubectl apply -f k8s/hpa-cpu.yaml
# 4) 部署 Redis(chart)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install redis bitnami/redis --set auth.enabled=false
# 5) 安装 kube-prometheus-stack(监控)
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prom prometheus-community/kube-prometheus-stack
# 6) 压测(外部)
wrk -t12 -c1000 -d60s http://<INGRESS_IP>/
十四、结语与实践建议
- 分层防护(限流 → 缓存 → 异步 → 扩容)是稳健处理高并发的核心理念。
- 先用简单的限流与缓存策略快速见效,再做 HPA/Cluster Autoscaler 的自动化扩容。
- 在上云或生产环境务必结合云厂商提供的 LB/AutoScaling 能力,并把监控、告警与回滚策略打通。
- 最后,压测是验证的唯一途径:小步增压、观测指标、修复瓶颈、复测。
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
