Kubernetes 高并发处理实战(可落地案例 + 源码)
off999 2025-10-23 10:15 2 浏览 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 能力,并把监控、告警与回滚策略打通。
- 最后,压测是验证的唯一途径:小步增压、观测指标、修复瓶颈、复测。
相关推荐
- 阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?
-
TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...
- 高流量大并发Linux TCP性能调优_linux 高并发网络编程
-
其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...
- 性能测试100集(12)性能指标资源使用率
-
在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...
- Linux 服务器常见的性能调优_linux高性能服务端编程
-
一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...
- Nginx性能优化实战:手把手教你提升10倍性能!
-
关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...
- 高并发场景下,Spring Cloud Gateway如何抗住百万QPS?
-
关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...
- Kubernetes 高并发处理实战(可落地案例 + 源码)
-
目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...
- 高并发场景下,Nginx如何扛住千万级请求?
-
Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...
- Spring Boot+Vue全栈开发实战,中文版高清PDF资源
-
SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...
- Docker-基础操作_docker基础实战教程二
-
一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...
- 你有空吗?跟我一起搭个服务器好不好?
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...
- 部署你自己的 SaaS_saas如何部署
-
部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...
- Docker Compose_dockercompose安装
-
DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...
- 京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统
-
前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...
- Kubernetes (k8s) 入门学习指南_k8s kubeproxy
-
Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 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)