Kubernetes_Gateway_API深度实战

Kubernetes_Gateway_API深度实战 Kubernetes Gateway API深度实战:下一代流量治理完全指南🎯适合人群:有K8s基础,正在使用或考虑使用Ingress的开发者/运维📚前置知识:了解Kubernetes基础概念、Service、Ingress💡核心收获:全面掌握Gateway API,从Ingress平滑迁移到新一代流量治理📖 目录为什么Ingress不够用了?Gateway API架构设计核心资源模型详解环境搭建与基础配置HTTP路由高级实战流量分割与金丝雀发布认证与限流策略gRPC与TCP路由多集群Gateway治理从Ingress迁移到Gateway API踩坑实录与解决方案总结与最佳实践1. 为什么Ingress不够用了?Kubernetes Ingress从2015年提出到现在,已经暴露出太多设计缺陷:1.1 Ingress的核心问题# ❌ 问题1: 功能太弱,大量配置依赖annotationsapiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:my-ingressannotations:# 功能全靠注解,不同实现的注解完全不同!nginx.ingress.kubernetes.io/rewrite-target:/nginx.ingress.kubernetes.io/ssl-redirect:"true"nginx.ingress.kubernetes.io/rate-limit:"100"nginx.ingress.kubernetes.io/cors-allow-origin:"*"nginx.ingress.kubernetes.io/proxy-body-size:"50m"# ... 更多注解spec:ingressClassName:nginxrules:-host:example.comhttp:paths:-path:/apipathType:Prefixbackend:service:name:api-svcport:number:80核心痛点对比:问题IngressGateway API功能扩展靠annotations原生API支持跨实现兼容完全不兼容标准化规范角色分离无基础设施/集群/应用三层协议支持仅HTTP(S)HTTP/gRPC/TCP/UDP/TLS流量分割需要特殊注解原生支持Header匹配状态管理无原生条件状态1.2 Gateway API的解决方案传统 Ingress: ┌─────────────────────────────────────────────┐ │ Platform Admin (集群管理员) │ │ ┌─────────────────────────────────────────┐│ │ │ Ingress + 100个annotations ││ │ │ (所有职责混在一起) ││ │ └─────────────────────────────────────────┘│ └─────────────────────────────────────────────┘ Gateway API: ┌─────────────────────────────────────────────┐ │ GatewayClass (基础设施提供者定义) │ │ ├── Gateway (集群管理员配置) │ │ │ ├── HTTPRoute (开发团队配置路由) │ │ │ ├── GRPCRoute (开发团队配置gRPC) │ │ │ └── TCPRoute (开发团队配置TCP) │ │ └── ReferenceGrant (跨命名空间授权) │ └─────────────────────────────────────────────┘2. Gateway API架构设计2.1 三层角色模型Gateway API最精妙的设计是角色分离:# 角色分离设计classInfrastructureProvider:"""基础设施提供者(如云厂商)"""responsibilities=["定义GatewayClass",# 定义网关实现类型"配置默认参数",# TLS策略、性能参数"管理证书基础设施",# cert-manager集成]classClusterOperator:"""集群管理员"""responsibilities=["创建Gateway实例",# 部署具体网关"配置监听器端口",# 开放哪些端口/域名"管理跨命名空间策略",# 限流、安全策略]classApplicationDeveloper:"""应用开发团队"""responsibilities=["创建HTTPRoute",# 定义路由规则"配置流量分割",# 金丝雀发布"设置请求头修改",# 请求/响应修改]2.2 核心资源关系图┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ GatewayClass │────▶│ Gateway │────▶│ HTTPRoute │ │ (基础设施) │ │ (集群管理) │ │ (应用路由) │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ ▼ ▼ ┌──────────────┐ ┌──────────────┐ │ Listener │ │ BackendRef │ │ (端口/协议) │ │ (后端Service) │ └──────────────┘ └──────────────┘ ┌──────────────┐ │ReferenceGrant│ ← 跨命名空间授权 └──────────────┘3. 核心资源模型详解3.1 GatewayClass# GatewayClass: 定义网关的实现类型(类似StorageClass)apiVersion:gateway.networking.k8s.io/v1kind:GatewayClassmetadata:name:my-gateway-classspec:controllerName:gateway.envoyproxy.io/gatewayclass-controllerparametersRef:group:gateway.envoyproxy.iokind:EnvoyProxyname:custom-proxy-confignamespace:envoy-gateway-system3.2 Gateway# Gateway: 具体的网关实例apiVersion:gateway.networking.k8s.io/v1kind:Gatewaymetadata:name:production-gatewaynamespace:infraspec:gatewayClassName:my-gateway-classlisteners:# HTTP监听器-name:httpprotocol:HTTPport:80allowedRoutes:namespaces:from:All# 允许所有命名空间的路由# HTTPS监听器-name:httpsprotocol:HTTPSport:443tls:mode:TerminatecertificateRefs:-kind:Secretname:wildcard-certnamespace:cert-storeallowedRoutes:namespaces:from:Selectorselector:matchLabels:shared-gateway:"true"# 只允许带标签的命名空间# 特定域名监听器-name:api-httpsprotocol:HTTPSport:443hostname:"api.example.com"tls:mode:TerminatecertificateRefs:-kind:Secretname:api-cert3.3 HTTPRoute# HTTPRoute: 路由规则apiVersion:gateway.networking.k8s.io/v1kind:HTTPRoutemetadata:name:api-routesnamespace:app-team-aspec:parentRefs:-name:production-gatewaynamespace:infrasectionName:https# 绑定到哪个监听器hostnames:-"api.example.com"rules:# 规则1: 精确匹配-matches:-path:type:Exactvalue:/api/v1/usersmethod:GETbackendRefs:-name:user-serviceport:8080# 规则2: 前缀匹配 + Header条件-matches:-path:type:PathPrefixvalue:/api/v2headers:-name:X-API-Versionvalue:"2"backendRefs:-name:api-v2-serviceport:8080# 规则3: 查询参数匹配-matches:-queryParams:-name:debugvalue:"true"filters:-type:RequestHeaderModifierrequestHeaderModifier:add:-name:X-Debug-Modevalue:"enabled"backendRefs:-name:debug-serviceport:80804. 环境搭建与基础配置4.1 安装Gateway API CRDs# Gateway API CRDs(K8s 1.26+ 已GA)kubectl apply-fhttps://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml# 验证CRD安装kubectl get crd|grepgateway# Expected:# gatewayclasses.gateway.networking.k8s.io# gateways.gateway.networking.k8s.io# grpcroutes.gateway.networking.k8s.io# httproutes.gateway.networking.k8s.io# referencegrants.gateway.networking.k8s.io# tcproutes.gateway.networking.k8s.io# tlsroutes.gateway.networking.k8s.io# udproutes.gateway.networking.k8s.io4.2 安装Gateway Controller# 方案1: Envoy Gateway(推荐,CNCF项目)helminstalleg oci://docker.io/envoyproxy/gateway-helm--versionv1.2.0--namespaceenvoy-gateway-system --create-namespace# 方案2: Istio Gatewayistioctlinstall--setprofile=minimal# 方案3: Cilium Gatewayhelminstallcilium cilium/cilium--namespacekube-system--setgatewayAPI.enabled=true# 方案4: Nginx Gateway Fabrichelminstallngf oci://ghcr.io/nginx/charts/nginx-gateway-fabric --create-namespace