Kubernetes 高并发处理实战(可落地案例 + 源码)
off999 2025-10-23 10:15 62 浏览 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 能力,并把监控、告警与回滚策略打通。
- 最后,压测是验证的唯一途径:小步增压、观测指标、修复瓶颈、复测。
相关推荐
- ipad密码忘了怎么办最简单的方法
-
一般ipad开机密码忘了有以下这种方法可以试一下:操作步骤/方法 1.下载最新版的iTunes。2.通过数据线将ipad与电脑iTunes相连接。3.将ipad按住电源键关机。4.同时按住电...
- 戴尔官翻机官网(戴尔官翻机购买地址)
-
肯定可以购买啊,价格还便宜。如果是官翻机应该是可以的,不像市场上的私人翻新机,这个质量应该有保障的可以买的。就是官方翻新机,市场上是有的。具体进入渠道先不管。反正市面上是肯定有的。但是这类手机是享受苹...
- 手机系统在哪里找(手机系统需要更新吗)
-
设置方法如下:1、首先输入锁屏密码,进入桌面;2、打开【设置】进入系统设置中心,打开【应用市场】即可查找应用程序;3、进入设置中心的【更多设置】,找到【开发者选项】;4、打开【开启开发者选项...
- 电脑城装机系统在哪里下载(电脑城都用什么装系统)
-
其实所有系统基本都一致,装机版已经集成一些必要软件,有个别也许还做了优化,但相对而言,在安全性和兼容性上差一些。不是绝对的,因为装机版也分好多种。纯净版最好,系统干净,使用放心。一般的电脑维修店都能够...
-
- win7右键没有个性化(win7系统右键没有个性化)
-
如果电脑右键没有出现个性化和属性选项,可能是系统出现了错误或者个人设置问题。解决方法如下:首先检查计算机中是否安装有系统文件,如果文件丢失或被删除,则需要重新安装系统文件;其次,可以尝试恢复系统默认配置,去掉不必要的自定义设置;最后,如果上...
-
2025-12-25 08:03 off999
- ie11官方下载(ie11官方免费下载)
-
1/9点击左下窗户小图标。2/9点击齿轮设置图标。3/9点击【应用】。4/9点击【应用和功能】。5/9点击【程序和功能】6/9点击【启动或关闭windows功能】。7/9ie11没有勾选。8/9点击勾...
- 东芝笔记本怎么进入bios(东芝笔记本怎么进入语言界面)
-
以下是一些通用的方法:1.重启或开机时,按下F2键进入BIOS设置界面。在某些笔记本上,您需要按住Fn键才能按F2键。2.重启或开机时,同时按下Ctrl+Alt+Del键,然后立即按F2键...
- window10家庭版下载(window10家庭版下载地址)
-
家庭版用户可通过以下步骤下载AutoCAD2020:访问Autodesk官方网站(autodesk.com)并创建或登录您的Autodesk帐户。导航到AutoCAD2020...
- 超级吞噬系统txt(超级吞噬系统txt完整版下载)
-
男主从未推倒柳儿,一直把柳儿当妹妹,出去历练升级从未带着她,后面男主把她安置好后,作者就再没写过她。两人一直分开。吞噬星空的九大超级势力有六大巅峰种族,人族,虫族,机械族,妖族,晶族,狱族,还有另外三...
- dos如何格式化硬盘并分区(怎么在dos下格式化分区工具)
-
1、方式一:在“开始”搜索框汇总输入“cmd”并回车,2、方式二:单击“开始”——所有程序——附件——命令提示符,3、查看分区数:在DOS界面下输入“wmicdiskdrivegetpartit...
- vivo系统升级最新版本(vivo系统升级到什么版本了)
-
您可以按照以下步骤来更新vivoY5s的操作系统:1.进入设置-系统更新。2.点击“检查更新”,确保您的手机已经连接上WiFi并检测到有可用的更新。3.如果有可用的更新,请按照提示下载并安...
- 电脑做系统软件排行榜(做电脑系统的软件)
-
1、360安全卫士是一款由奇虎360公司推出的功能强、效果好、受用户欢迎的安全杀毒软件。360安全卫士拥有查杀木马、清理插件、修复漏洞、电脑体检、电脑救援、保护隐私,电脑专家,清理垃圾,清理痕迹多种功...
- win7热点(win7热点无ip分配)
-
1、点击桌面左下角的开始按钮,在搜索栏输入cmd,右击上方出现的cmd.exe,在弹出菜单中选择以管理员身份运行。2、然后在“命令提示符”里输入“netshwlansethostednetwor...
- centos下载安装(centos安装软件教程)
-
首先要知道您需要下载linux哪个发行版,目前比较流行的是ubuntu,所以以ubuntu为例说明:1、访问ubuntu官方网站www.ubuntu.com2、点击右上角的DownLoad(下载),...
- 360老版本卫士2014版(360卫士8.7.0)
-
先打开360官网,下载360软件管家,再从360软件管家里下载360卫士这是明显的中毒表现:1、关闭系统还原;2、重启,按F8,进入安全模式。3、在安全模式里,打开360杀毒。4、全盘查杀。要耐心等待...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- 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)
