百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Kubernetes 高并发处理实战(可落地案例 + 源码)

off999 2025-10-23 10:15 2 浏览 0 评论

目标场景:对外提供 HTTP API 的微服务在短时间内收到大量请求(例如每秒数千至数万 RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。


总体思路(多层防护):


  1. 边缘层:云 LB / Ingress(负载均衡 + TLS)
  2. 流量治理:Ingress Controller + Rate limiting(Envoy/Ingress-NGINX/Kong/Istio)
  3. 服务层:Deployment(多副本)+ Pod 资源限额 + 预热策略
  4. 弹性:Horizontal Pod Autoscaler(HPA)与 Cluster Autoscaler(若使用云)
  5. 缓存层:Redis(热点数据缓存)
  6. 异步处理:消息队列(RabbitMQ/Kafka)用于削峰
  7. 监控与告警:Prometheus + Alertmanager + Grafana
  8. 压测与回归: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


简要流程:


  1. API 接收请求并写入任务到队列(或 DB)
  2. 返回任务ID(快速响应)
  3. 后端工作进程(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)



常见压测策略:


  • 先小幅增加并发,观察指标,逐步提升(避免一锤子压垮集群)
  • 模拟真实请求模式(短突发 + 持续高并发)






十一、实战中的优化小贴士(清单式)


  1. 合理设置资源 requests/limits:让调度器能正确决策并避免 OOM。
  2. ReadinessProbe 与 LivenessProbe:确保流量只发给健康 Pod;失败时尽快剔除。
  3. 预热机制:新 Pod 启动时可通过预热脚本加载缓存或连接池,避免冷启动延迟。
  4. 连接池(Backend DB):使用数据库连接池并限制池大小,防止数据库被瞬时连接耗尽。
  5. 短路/熔断:当下游服务不稳定时,先返回失败或降级,保护整体。
  6. 逐步放量(灰度/金丝雀):发布新版本或增加容量应采用金丝雀策略验证。
  7. 限速 + 队列:在边缘限流并把超出部分入队列异步处理。
  8. 日志与追踪(分布式追踪):使用 Jaeger/Zipkin 打通请求链路便于排查延迟。
  9. 容量预估:基于历史流量与 p95/p99 延迟估算需要的副本与节点。
  10. 避免副作用副本化:确保服务是幂等或无状态,方便水平扩展。






十二、常见故障与排查流程



  1. Pod 被频繁 OOM / CrashLoop
  2. 查看 kubectl describe pod 与 kubectl logs,提升 limits 或修复内存泄露。
  3. HPA 无法扩容
  4. 检查 metrics-server 是否工作:kubectl top pod;检查 HPA 事件。
  5. 请求大量 502/504(网关超时)
  6. 检查 Ingress 超时设置、Pod 就绪探针及后端响应时间。
  7. 数据库成为瓶颈
  8. 加缓存(Redis);增加 DB 读写分离或水平分库;使用连接池限制。
  9. Cluster 资源耗尽(无法调度)
  10. 检查 kubectl describe node,考虑启用 Cluster Autoscaler 或增加节点。
  11. 热点缓存击穿/雪崩
  12. 使用互斥锁(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)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...

取消回复欢迎 发表评论: