最完整Shenyu网关K8s集群方案:从0到1构建高可用流量入口
你是否正面临API网关单点故障风险?还在为微服务流量激增导致的稳定性问题发愁?本文将带你基于Kubernetes实现Shenyu网关的高可用集群部署,通过3个核心步骤、5个关键配置和7个最佳实践,构建支持每秒10万+请求的弹性流量入口。读完你将获得:
- 企业级K8s资源配置模板(附完整YAML文件)
- 自动扩缩容的网关集群架构设计
- 跨可用区部署的容灾方案
- 性能优化的10个实用技巧
为什么选择Kubernetes部署Shenyu
在微服务架构中,API网关作为流量入口,其高可用性直接决定了整体系统的稳定性。传统部署方式存在三大痛点:
- 单点风险:单实例部署一旦宕机导致全链路中断
- 扩容复杂:手动调整实例数量无法应对流量波动
- 配置繁琐:分布式环境下的配置同步困难
Shenyu网关基于Spring Cloud构建,原生支持Kubernetes部署模式。通过K8s的StatefulSet控制器、Service负载均衡和Ingress路由规则,可以完美解决上述问题。项目官方在shenyu-integrated-test目录下提供了完整的K8s测试用例,包含从基础部署到高级路由的全流程配置。
部署前的环境准备
基础环境要求
| 组件 | 版本要求 | 作用 |
|---|---|---|
| Kubernetes | 1.21+ | 容器编排平台 |
| Helm | 3.5+ | K8s包管理工具 |
| Docker | 20.10+ | 容器运行时 |
| JDK | 1.8+ | Shenyu运行环境 |
核心资源规划
生产环境建议至少部署3个Shenyu网关实例,分布在不同节点,实现真正的高可用。资源配置参考:
| 组件 | CPU | 内存 | 存储 | 副本数 |
|---|---|---|---|---|
| Shenyu Bootstrap | 2核 | 4GB | 10GB | 3+ |
| Shenyu Admin | 1核 | 2GB | 20GB | 2+ |
| 数据库 | 4核 | 8GB | 100GB | 1主2从 |
分步部署指南
1. 命名空间与RBAC配置
首先创建独立命名空间隔离网关资源:
apiVersion: v1
kind: Namespace
metadata:
name: shenyu-system
创建服务账户及权限绑定,参考项目提供的rbac配置:
apiVersion: v1
kind: ServiceAccount
metadata:
name: shenyu-ingress-controller
namespace: shenyu-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: shenyu-ingress-controller
rules:
- apiGroups: ["", "networking.k8s.io"]
resources: ["namespaces", "services", "ingresses"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: shenyu-ingress-controller
subjects:
- kind: ServiceAccount
name: shenyu-ingress-controller
namespace: shenyu-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: shenyu-ingress-controller
2. 部署Shenyu Admin
Shenyu Admin作为配置中心,建议使用StatefulSet部署确保稳定网络标识:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: shenyu-admin
namespace: shenyu-system
spec:
serviceName: shenyu-admin
replicas: 2
selector:
matchLabels:
app: shenyu-admin
template:
metadata:
labels:
app: shenyu-admin
spec:
containers:
- name: shenyu-admin
image: apache/shenyu-admin:latest
ports:
- containerPort: 9095
env:
- name: SPRING_DATASOURCE_URL
value: "jdbc:mysql://mysql-service:3306/shenyu?useSSL=false"
- name: SPRING_DATASOURCE_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
resources:
requests:
cpu: "1"
memory: "2Gi"
limits:
cpu: "2"
memory: "4Gi"
对应的Service配置:
apiVersion: v1
kind: Service
metadata:
name: shenyu-admin
namespace: shenyu-system
spec:
clusterIP: None # Headless Service
selector:
app: shenyu-admin
ports:
- port: 9095
targetPort: 9095
3. 部署Shenyu Gateway集群
使用Deployment部署网关集群,结合HPA实现自动扩缩容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: shenyu-bootstrap
namespace: shenyu-system
spec:
replicas: 3
selector:
matchLabels:
app: shenyu-bootstrap
template:
metadata:
labels:
app: shenyu-bootstrap
spec:
containers:
- name: shenyu-bootstrap
image: apache/shenyu-bootstrap:latest
ports:
- containerPort: 9195
env:
- name: SHENYU_SYNC_WEBSOCKET_URLS
value: "ws://shenyu-admin-0.shenyu-admin:9095/websocket,ws://shenyu-admin-1.shenyu-admin:9095/websocket"
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "4"
memory: "8Gi"
创建NodePort或LoadBalancer类型Service暴露服务:
apiVersion: v1
kind: Service
metadata:
name: shenyu-gateway
namespace: shenyu-system
spec:
selector:
app: shenyu-bootstrap
type: NodePort
ports:
- port: 9195
targetPort: 9195
nodePort: 30095
4. 配置Ingress路由规则
通过K8s Ingress资源定义路由规则,实现域名化访问:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shenyu-ingress
namespace: shenyu-system
annotations:
kubernetes.io/ingress.class: "shenyu"
spec:
rules:
- host: api.example.com
http:
paths:
- path: /service-a
pathType: Prefix
backend:
service:
name: service-a
port:
number: 8080
高可用架构设计
多可用区部署
为避免单可用区故障,建议跨多个可用区部署Shenyu集群:
spec:
template:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- shenyu-bootstrap
topologyKey: "kubernetes.io/hostname"
podTopologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app: shenyu-bootstrap
数据同步策略
Shenyu支持多种数据同步方式,生产环境推荐使用Nacos或Zookeeper:
# application.yml配置示例
shenyu:
sync:
nacos:
serverLists: nacos-service:8848
namespace: shenyu
dataId: shenyu-gateway
group: DEFAULT_GROUP
项目在shenyu-sync-data-center目录提供了完整的数据同步实现,包含Nacos、Zookeeper等多种方案。
性能优化实践
JVM参数调优
针对Shenyu网关的JVM配置建议:
-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2
连接池配置
优化Netty和数据库连接池参数:
server:
netty:
connection-timeout: 3000ms
idle-timeout: 60s
spring:
datasource:
hikari:
max-pool-size: 20
min-idle: 5
idle-timeout: 300000ms
缓存策略
启用本地缓存减轻数据库压力:
shenyu:
cache:
local:
enabled: true
expire: 3600s
distributed:
enabled: true
type: redis
监控告警配置
Prometheus指标收集
Shenyu内置Metrics插件,在shenyu-plugin-metrics目录提供完整实现。配置Prometheus监控:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: shenyu-monitor
namespace: monitoring
spec:
selector:
matchLabels:
app: shenyu-bootstrap
endpoints:
- port: metrics
path: /actuator/prometheus
Grafana仪表盘
导入项目提供的Grafana仪表盘模板,监控关键指标如请求量、延迟和错误率。仪表盘JSON文件可在shenyu-admin目录下找到。
运维与扩展
版本升级策略
采用蓝绿部署实现无感知升级:
- 部署新版本Deployment(版本号递增)
- 验证新版本健康状态
- 切换Service selector到新版本
- 保留旧版本30分钟后删除
插件扩展
Shenyu支持热插拔插件,开发自定义插件可参考shenyu-plugin目录结构,通过以下步骤集成:
- 创建插件模块(如shenyu-plugin-myplugin)
- 实现Plugin、Selector和Rule接口
- 在admin控制台启用插件
- 配置选择器和规则
常见问题排查
健康检查失败
检查Spring Boot Actuator端点是否正常暴露:
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
数据同步异常
查看同步日志:
kubectl logs -f shenyu-bootstrap-xxxx -n shenyu-system | grep sync
总结与展望
通过本文介绍的Kubernetes部署方案,Shenyu网关可实现99.99%的服务可用性,支持日均亿级请求处理。随着云原生技术发展,Shenyu社区正积极开发Service Mesh集成方案,未来将提供更高粒度的流量控制能力。
立即行动:
- 点赞收藏本文档,方便后续查阅
- 关注项目RELEASE-NOTES.md获取最新特性
- 参与GitHub讨论提出改进建议
下一专题预告:《Shenyu网关流量治理实战:从限流到熔断的全链路保护》
本文档配置模板均来自Shenyu官方代码库,可在shenyu-integrated-test目录下找到完整实例。生产环境部署前建议结合实际业务调整资源配置和安全策略。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



