当前位置: 首页 > news >正文

从Nginx ConfigMap到Higress路由:一个‘Hello World’服务在K8s里的完整流量旅程

从Nginx ConfigMap到Higress路由:一个‘Hello World’服务在K8s里的完整流量旅程

当你在浏览器中输入192.168.21.223:1105并按下回车时,背后发生了什么?这个简单的HTTP请求如何在Kubernetes集群中穿越层层组件,最终从Nginx Pod返回那个熟悉的"Hello World"?让我们跟随这个请求的脚步,揭开云原生网关Higress路由配置的神秘面纱。

1. 请求的起点:Higress Gateway入口

想象你是一名邮递员,正站在Higress Gateway的大门前。这个大门由Kubernetes的NodePort服务开放,地址是192.168.21.223:1105。当你(客户端)发送请求时:

  1. 网络层拦截:请求首先到达集群节点的1105端口
  2. Service路由:Kubernetes的kube-proxy将这个端口映射到Higress Gateway Pod的实际端口
  3. Ingress Controller接收:Higress的Ingress Controller组件监听到这个请求

提示:在本地测试环境中,我们通常使用NodePort暴露服务,生产环境则更推荐LoadBalancer或Ingress Controller

此时,Higress Gateway就像机场的安检通道,它需要决定:

  • 这个请求是否被允许进入?
  • 应该将它转发到哪个后端服务?

2. 路由匹配:寻找正确的目的地

Higress的路由规则就像机场的航班信息显示屏。在我们的例子中,路由配置非常简单:

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-nginx-ingress spec: ingressClassName: higress rules: - host: "" http: paths: - pathType: Prefix path: "/" backend: service: name: demo-nginx-svc port: number: 8080

这段配置告诉Higress:

  • 匹配所有Host头(host: ""
  • 匹配所有路径(path: "/"
  • 将流量转发到demo-nginx-svc服务的8080端口

路由决策过程

检查项配置值实际请求值是否匹配
Host头空(任意)无/任意
路径//
路径类型Prefix--

3. 后端服务:从Service到Pod

请求通过路由检查后,现在需要找到真正的处理者。Kubernetes的Service系统就像机场的行李转运带:

  1. Service发现:Higress查询Kubernetes API,找到名为demo-nginx-svc的Service
  2. Endpoint选择:Service通过标签选择器找到对应的Pod
  3. 负载均衡:如果有多个Pod,Service会选择一个合适的(本例只有1个Pod)

我们的demo-nginx-svc配置如下:

apiVersion: v1 kind: Service metadata: name: demo-nginx-svc spec: ports: - port: 8080 targetPort: 8080 selector: app: demo-nginx

关键点:

  • targetPort: 8080必须与Pod中容器暴露的端口一致
  • selector确保流量只会转发到带有app: demo-nginx标签的Pod

4. Nginx Pod:请求的最终目的地

现在请求到达了目的地——运行Nginx的Pod。这个Pod的特殊之处在于它的配置完全来自ConfigMap:

apiVersion: v1 kind: ConfigMap metadata: name: demo-nginx-configmap data: nginx.conf: | server { listen 8080; location / { default_type application/json; return 200 '{"status":"success","result":"nginx json"}'; } }

ConfigMap如何挂载到Pod

  1. Deployment中定义了volume来自ConfigMap:
    volumes: - name: nginx-config configMap: name: demo-nginx-configmap
  2. 容器挂载这个volume到/etc/nginx/nginx.conf
    volumeMounts: - name: nginx-config mountPath: /etc/nginx/nginx.conf subPath: nginx.conf

当请求到达Nginx时:

  1. 监听8080端口的server块接收请求
  2. 匹配location /规则
  3. 返回预定义的JSON响应

5. 日志与可观测性:追踪请求全过程

一个完整的流量旅程离不开日志记录。我们的Nginx配置了详细的JSON格式日志:

log_format logsjson '{ "@timestamp":"$time_iso8601", "client_ip":"$remote_addr", "request_method":"$request_method", "request_uri":"$request_uri", "status":"$status" }'; access_log /var/log/nginx/access.log logsjson;

关键日志字段解析

字段说明示例值
@timestamp请求时间2023-07-20T15:04:05+08:00
client_ip客户端IP192.168.1.100
request_methodHTTP方法GET
request_uri请求路径/api/test
statusHTTP状态码200

6. 两种路由配置方式对比

Higress提供了灵活的路由配置方式,满足不同用户需求:

方式一:Ingress CRD(YAML声明式)

优点

  • 适合GitOps工作流
  • 方便版本控制
  • 易于批量修改

典型使用场景

  • 基础设施即代码(IaC)环境
  • CI/CD流水线中自动部署

方式二:Higress Console(图形界面)

优点

  • 操作直观,无需编写YAML
  • 实时生效,无需kubectl apply
  • 适合快速测试和调试

操作步骤

  1. 访问Higress Console(通常通过NodePort 39474)
  2. 导航到路由管理页面
  3. 填写路由规则表单
  4. 保存并立即生效

7. 常见问题排查指南

当"Hello World"没有如期而至时,可以按照以下步骤排查:

  1. 检查Higress Gateway是否就绪

    kubectl get pods -n higress-system

    确保所有Pod状态为Running

  2. 验证路由规则是否正确应用

    kubectl get ingress kubectl describe ingress demo-nginx-ingress
  3. 检查后端服务是否可达

    # 获取Pod IP kubectl get pods -o wide # 从集群内测试访问 kubectl run -it --rm debug --image=curlimages/curl -- sh curl http://<pod-ip>:8080
  4. 查看Nginx日志

    kubectl logs <nginx-pod-name>

典型错误案例

  • 返回502 Bad Gateway:

    • 检查Service的selector是否匹配Pod标签
    • 验证targetPort与容器端口是否一致
  • 返回404 Not Found:

    • 检查Ingress的path配置
    • 确认Nginx的location规则

8. 进阶配置建议

当你熟悉了基础路由后,可以尝试这些增强配置:

多路径路由

paths: - path: /api backend: service: api-service - path: /static backend: service: static-service

基于Host的路由

rules: - host: "app.example.com" http: paths: - path: / backend: service: app-service

流量镜像(用于测试新版本):

metadata: annotations: higress.io/canary: "true" higress.io/canary-weight: "10"

在实际项目中,我们通常会结合监控系统(如Prometheus)来观察路由流量,确保每个请求都能找到回家的路。

http://www.jsqmd.com/news/739987/

相关文章:

  • 从零到一:用Metal在iOS上绘制你的第一个三角形(附完整Xcode工程)
  • RosettaStone 2.0:VLSI物理设计基准测试框架解析
  • 别再重装Ubuntu了!从Anaconda到PyCharm,一套搞定AI开发环境(附CUDA 11.4/11.8版本选择避坑)
  • AGENTFLOW:基于Flow-GRPO的复杂推理智能体系统
  • AI对话式副驾驶OpenClaw Magento 2:聚合洞察与自动化运维实战
  • Telegram集成GPT:构建智能聊天机器人的架构设计与部署实践
  • Python大模型本地微调避坑手册(2024年最新版):97%新手踩过的7类CUDA/OOM/Tokenizer错位陷阱全复盘
  • 终极Python AutoCAD自动化指南:告别繁琐CAD操作,一键实现智能设计[特殊字符]
  • llama-cpp-python 架构解析:高性能本地大模型部署深度实践
  • 重塑暗黑2角色构建:d2s-editor如何解锁你的游戏创造力
  • 微信聊天记录丢了别慌!手把手教你从电脑备份恢复到新手机(支持Win/Mac)
  • 为内部知识库问答系统接入 Taotoken 多模型服务的架构思考
  • SD-PPP:在Photoshop中无缝集成AI绘图能力的革命性插件
  • 密集检索技术解析与Trove工具包实践指南
  • 基于React与SQLite的求职数据分析仪表盘:架构设计与工程实践
  • Claw3D:开源3D创作工具的设计理念、技术架构与应用场景解析
  • 如何轻松掌控你的电脑风扇:FanControl使用指南
  • MemReduct 多语言支持异常:为什么你的内存清理工具突然只说英语了?
  • 四站瑟瑟网站之油箱快没油了
  • 别再为Aurora 64B66B发送卡顿发愁!手把手教你配置AXI4-Stream接口的FWFT FIFO
  • 在Ubuntu 20.04上,用10分钟搞定OMNeT++ 4.6的完整安装与环境配置
  • 别再只会用ADC了!拆解FPGA多通道采样核心:状态机设计与通道延时的那些坑
  • 为ubuntu上的nodejs应用接入taotoken统一大模型api
  • 如何通过curl命令快速测试Taotoken平台的大模型API连通性
  • 敏捷团队如何利用taotoken的api密钥管理与审计功能满足安全合规
  • 手把手教你组装BUFF67 V3 R2:从PCB测试到蓝牙配对,保姆级避坑指南
  • Cow代理插件生态解析:从原理到实战的扩展开发指南
  • 保姆级教程:用PX4 HITL模式、Gazebo Classic和ROS Noetic搭建带深度相机的无人机避障仿真环境
  • 暗黑破坏神2存档编辑:释放单机游戏的无限可能
  • 实战复盘:我是如何用浏览器调试搞定PDD滑块验证码的(附完整JS调用流程)