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

K8s实战:利用Ingress-nginx实现多域名服务暴露与流量管理

1. 为什么需要Ingress-nginx?

刚开始接触Kubernetes时,我总被一个问题困扰:如何优雅地把集群内的服务暴露给外部访问?试过NodePort,发现端口管理是个噩梦;用过LoadBalancer,又受限于云厂商的收费方案。直到遇到Ingress-nginx,才发现这才是生产环境该有的解决方案。

简单来说,Ingress-nginx就像集群的智能门卫。想象你住在一个有多个住户的小区(集群内的多个服务),如果给每家都单独开个大门(NodePort),不仅浪费资源还不安全。Ingress-nginx相当于在小区门口设了个统一的接待处,根据访客要找的人(域名或路径)准确引导到对应住户家。

它的核心价值在于:

  • 单入口管理:所有外部流量通过80/443端口进入,内部再根据规则分发
  • 七层路由能力:能识别HTTP/HTTPS协议内容,实现基于域名、URL路径的精细路由
  • TLS终结:可以在入口统一处理HTTPS加密,减轻后端服务压力
  • 流量管控:支持限速、重定向、灰度发布等高级功能

2. 快速搭建Ingress-nginx环境

2.1 安装部署实战

第一次部署时踩过不少坑,这里分享验证过的稳定方案。建议使用Helm 3安装,比手动YAML省心很多:

# 添加官方仓库 helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update # 安装到ingress-nginx命名空间 helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --set controller.service.type=NodePort \ --set controller.service.nodePorts.http=30080 \ --set controller.service.nodePorts.https=30443

关键参数说明:

  • controller.service.type:生产环境建议用LoadBalancer,测试环境用NodePort
  • nodePorts.http/https:指定固定NodePort避免端口随机分配

安装完成后检查Pod状态:

kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

应该看到controller容器处于Running状态。

2.2 验证基础功能

做个快速测试确保组件正常工作:

# 创建测试服务 kubectl create deployment demo --image=nginx kubectl expose deployment demo --port=80 # 创建Ingress规则 cat <<EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo spec: rules: - host: demo.test http: paths: - path: / pathType: Prefix backend: service: name: demo port: number: 80 EOF

本地修改hosts文件添加记录:

<节点IP> demo.test

访问 http://demo.test:30080 应该能看到Nginx欢迎页。

3. 多域名路由实战配置

3.1 基础域名路由

实际项目中经常需要同时管理多个域名。假设我们有两个服务:

  • 官网服务:website-svc(端口80)
  • API服务:api-svc(端口8080)

对应的Ingress配置如下:

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-domain spec: rules: - host: www.example.com http: paths: - path: / pathType: Prefix backend: service: name: website-svc port: number: 80 - host: api.example.com http: paths: - path: / pathType: Prefix backend: service: name: api-svc port: number: 8080

这个配置实现了:

  • 访问 www.example.com 流量到官网服务
  • 访问 api.example.com 流量到API服务
  • 自动处理路径前缀匹配和流量转发

3.2 路径重写技巧

有时候后端服务的路径前缀与外部暴露的不一致,比如希望访问 /shop 时实际请求发送到 /。这时候就需要路径重写:

annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: store.example.com http: paths: - path: /shop(/|$)(.*) pathType: Prefix backend: service: name: shop-svc port: number: 80

这个配置会把:

  • /shop → /
  • /shop/products → /products

4. HTTPS安全加固方案

4.1 自动证书管理

现代网站没有HTTPS简直寸步难行。用Cert-Manager可以自动申请和续期Let's Encrypt证书:

apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: admin@example.com privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: nginx --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tls-demo annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: tls: - hosts: - www.example.com secretName: example-tls rules: - host: www.example.com http: paths: - path: / pathType: Prefix backend: service: name: website-svc port: number: 80

关键点:

  1. 先部署cert-manager(详见官方文档)
  2. 创建ClusterIssuer定义证书颁发机构
  3. Ingress中通过tls字段指定域名和证书存储的Secret
  4. 注解cert-manager.io/cluster-issuer触发证书申请

4.2 强制HTTPS跳转

有了证书后,应该强制所有HTTP请求跳转到HTTPS:

annotations: nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/ssl-redirect: "true"

5. 高级流量管理技巧

5.1 基于权重的灰度发布

需要上线新版本时,可以通过权重逐步切流:

annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "30" spec: rules: - host: api.example.com http: paths: - path: / backend: service: name: api-v2 port: number: 8080

这样30%的流量会路由到api-v2服务,剩余70%继续走默认后端。

5.2 按Header路由

更精细化的控制可以通过请求头实现:

annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "X-Env" nginx.ingress.kubernetes.io/canary-by-header-value: "test"

只有包含X-Env: test头的请求才会被路由到新版本。

6. 常见问题排查指南

6.1 连接超时问题

如果遇到504 Gateway Timeout,重点检查:

  1. 后端服务是否健康:

    kubectl get endpoints <service-name>

    确保有正常的Endpoint列表

  2. Ingress到Service的网络连通性:

    kubectl port-forward service/<service-name> 8080:80

    本地访问8080端口测试

  3. nginx控制器日志:

    kubectl logs -n ingress-nginx <controller-pod-name>

6.2 配置不生效

当修改Ingress后规则没有更新:

  1. 检查Ingress资源状态:

    kubectl get ingress kubectl describe ingress <name>
  2. 查看nginx配置是否同步:

    kubectl exec -n ingress-nginx <controller-pod-name> -- cat /etc/nginx/nginx.conf
  3. 常见错误包括:

    • 注解拼写错误
    • 路径类型(pathType)配置不当
    • 端口定义不匹配

7. 性能优化建议

生产环境部署时,这几个参数调优很关键:

controller: config: # 保持长连接 keep-alive: "75s" # 工作进程数 worker-processes: "4" # 每个worker的最大连接数 max-worker-connections: "2048" resources: requests: cpu: "500m" memory: "512Mi" limits: cpu: "2000m" memory: "2Gi"

监控指标建议:

  • 请求吞吐量(RPS)
  • 平均响应时间
  • 5xx错误率
  • 证书过期时间

8. 真实案例分享

最近帮一个电商客户迁移到Ingress-nginx,他们原有架构是:

  • 10个独立域名
  • 混合使用NodePort和云负载均衡器
  • 证书手动管理经常过期

迁移后实现:

  1. 统一入口点,节省了7个云LB费用
  2. 通过注解实现自动HTTPS
  3. 路径重写简化了前端配置
  4. 基于Header的灰度发布流程

关键转折点是解决了WebSocket的长连接问题:

annotations: nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" nginx.ingress.kubernetes.io/websocket-services: "ws-svc"
http://www.jsqmd.com/news/507689/

相关文章:

  • Nanbeige 4.1-3B部署教程:解决st.markdown(unsafe_allow_html=True)样式冲突
  • YOLO X Layout应用案例:合同、报告、论文文档智能解析实战
  • 告别‘从入门到放弃’:ESP32+MicroPython项目实战,用OLED做个物联网温湿度计
  • 别再乱试了!Jetson Orin (Ubuntu 20.04) SSH无法连接的终极检查清单
  • 异步截屏技术:原理、实现与最佳实践
  • SCMA稀疏码多址技术:从原理到5G应用实践
  • java.net.UnknownHostException 问题解决
  • 2026年降ai保姆级教程:分享5个亲测好用的降ai率工具和2个手动修改技巧,一文搞定ai率 - 殷念写论文
  • 2026年宜昌短视频运营价格内幕:企业如何控制获客成本提升效果 - 精选优质企业推荐榜
  • 惠普在街头现场打印广告牌——每次打印一张 A4 纸
  • 动恰3DV3丨客流统计方案:赋能药店连锁从“经验运营”到“数据驱动”的数字化转型
  • Trae AI + Cloudflare Pages:零成本打造个人博客的保姆级教程(含域名购买指南)
  • 详解Transformer解码器:从掩码机制到自回归生成
  • 嵌入式开发笔记:GT911双I2C地址机制解析(全志T527实战)
  • 梯形图自动生成C代码真的可靠吗?揭秘工业级PLC代码转换中97.3%被忽略的时序陷阱
  • 笔式电化学分析仪选购避坑:IP67防护与电极寿命如何平衡? - 品牌推荐大师1
  • SIwave实战:手把手教你为高速串行信号链路设置Xnet(含Allegro .brd文件导入)
  • 2026口碑街舞培训机构推荐,供你参考,少儿街舞/赛事承办/少儿街舞考级/街舞考级/街舞文化推广,街舞培训基地哪家好 - 品牌推荐师
  • 基于IEEE33节点的碳势计算与可视化展示:精细代码注释助力碳计算与排放学子学习参考
  • Stable Diffusion Web UI本地部署与公网访问全攻略:从零开始玩转AI绘画
  • 哪个机构卫生中级职称考试押题准 - 医考机构品牌测评专家
  • 动态口令登录 Windows:10 分钟实现无硬件双因子认证
  • 2026年阿里云企业邮箱选哪家服务商?正规渠道推荐指南 - 品牌2026
  • 2026年宜昌短视频运营价格实测:企业推广效果与成本内幕揭秘 - 精选优质企业推荐榜
  • Time-MoE:如何通过混合专家架构重塑时间序列预测的边界
  • 西门子比赛六部十层电梯仿真代码(注释齐全,22年初赛48分)
  • 浩搏优科技:西南实验室服务标杆,一站式解决科研采购与技术需求 - 博客万
  • 2026年企业微信开通指南:会话存档与安全高级功能解析 - 品牌2026
  • 手把手教你学Simulink——基于Simulink的自适应反步法(Adaptive Backstepping)控制
  • 2026年宜昌短视频运营报价内幕:企业如何控制获客成本提升推广效果 - 精选优质企业推荐榜