kubernetes 中 nginx-ingress 问题排查及配置调优

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
应用实时监控服务-应用监控,每月50GB免费额度
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: 随着公司容器化的深入,越来越多的服务陆续迁移到kubernetes集群中,有些问题在测试环境并未凸显,但是在生产环境中这些问题就显得格外的扎眼。这里就对实践中kubernetes集群中的7层负载均衡器ingress遇到的问题进行总结。

原文作者:郭旭东x
原文链接
更多云原生技术资讯可关注阿里巴巴云原生技术圈

前言

随着公司容器化的深入,越来越多的服务陆续迁移到kubernetes集群中,有些问题在测试环境并未凸显,但是在生产环境中这些问题就显得格外的扎眼。这里就对实践中kubernetes集群中的7层负载均衡器ingress遇到的问题进行总结。

HTTP(S)负载均衡器-ingress

Ingress是kubernetes API的标准资源类型之一,其本质就是一组基于DNS名称(host)或URL路径把请求转发至指定的Service资源的规则,用于将集群外的请求流量转发至集群内部完成服务发布
Ingress控制器(Ingress Controller)可以由任何具有反向代理(HTTP/HTTPS)功能的服务程序实现,如Nginx、Envoy、HAProxy、Vulcand和Traefik等。Ingress控制器本身也作为Pod对象与被代理的运行为Pod资源的应用运行于同一网络中。我们在这里选择了NGINX Ingress Controller,由于对NGINX的配置较为熟悉,同时我们使用的kubernetes是阿里云的容器服务,构建集群的时候,容器服务会自带NGINX Ingress Controller。
2.jpg

根据实际情况Ingress调优

  1. 解决 Nginx-Ingress 重定向失败问题

    • 现象
      最近对公司 Kubernetes 集群的 nginx-ingress-controller 进行了升级,但是升级后却出现了大问题,之前所有采用 nginx.ingress.kubernetes.io/rewrite-target: / 注释进行重定向的 Ingress 路由全部失效了,但是那些直接解析了域名,没有进行重定向的却没有发生这个问题。
    • 问题分析

      1. 首先检查对应服务健康状态,发现所有出问题的服务的状态均正常,同时受影响的之后 http 调用,而 RPC 调用却不受影响,这时问题就定位到了 ingress。
      2. 然后检查 nginx-ingress-controller ,发现 nginx-ingress-controller 的状态也是正常的,路由也是正常的。
      3. 最后发现受影响的只有添加了重定向策略的 ingress 。
    • 问题解决
      问题已经定位,接下来就是着手解决问题,这时候值得注意的就是之前进行了什么变更:升级了 nginx-ingress-controller 版本!看来问题就出现在新版本上,那么就打开官方文档:https://kubernetes.github.io/ingress-nginx/examples/rewrite/ 看一下吧。

Attention
Starting in Version 0.22.0, ingress definitions using the annotation nginx.ingress.kubernetes.io/rewrite-target are not backwards compatible with previous versions. In Version 0.22.0 and beyond, any substrings within the request URI that need to be passed to the rewritten path must explicitly be defined in a capture group.

  1. 文档上给出了非常明显的警告️:从 V0.22.0 版本开始将不再兼容之前的入口定义,再查看一下我的 nginx-ingress-controller 版本,果然问题出现来这里。

Note
Captured groups are saved in numbered placeholders, chronologically, in the form $1, $2 ... $n. These placeholders can be used as parameters in the rewrite-target annotation.

  • 示例
  1. 到这里问题已经解决了,在更新了 ingress 的配置之后,之前所有无法重定向的服务现在都已经可以正常访问了。修改见如下示例:
$ echo '
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /something(/|$)(.*)
' | kubectl create -f -
  1. 解决400 Request Header Or Cookie Too Large问题

    • 现象
微信小程序需要调用后端接口,需要在header中传一段很长的token参数,直接使用浏览器访问该端口可以访问通,但是在加上token访问之后,会报“400 Request Header Or Cookie Too Large”
<html>
    <head>
        <title>400 Request Header Or Cookie Too Large</title>
    </head>
    <body>
        <center>
            <h1>400 Bad Request</h1>
        </center>
        <center>Request Header Or Cookie Too Large</center>
        <hr>
        <center>nginx/1.15.6</center>
    </body>
</html>
- ####问题定位
    直接修改Service使用nodeport的形式访问,则没有报错,初步定位需要在ingress中nginx配置客户端的请求头,进入Ingress Controller的Pod查询配置,果然是请求头空间不足。
$ cat nginx.conf | grep client_header_buffer_size
    client_header_buffer_size       1k;
$ cat nginx.conf | grep large_client_header_buffers
    large_client_header_buffers     4 8k;
- ####解决方法
    在ingress中添加注释
nginx.ingress.kubernetes.io/server-snippet: client_header_buffer_size 2046k;
> **Server snippet**
    >Using the annotation ```nginx.ingress.kubernetes.io/server-snippet``` it is possible to add custom configuration in the server configuration block.
    >该注释是将自定义配置加入nginx的server配置中
  1. 解决请求超时问题

    • 现象
有一个数据导出功能,需要将大量数据进行处理,然后以Excel格式返回,在导出一个大约3W条数据的时候,出现访问超时情况。
![image](https://ws2.sinaimg.cn/mw690/ad5fbf65ly1g0ubdwwzo5j21b30bjaat.jpg)
  • 解决方法
调整proxy_read_timeout,连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
在ingress中添加注释
nginx.ingress.kubernetes.io/proxy-read-timeout: 600
>这里需要注意的事该注释的value需要时number类型,不能加s,否则将不生效
  1. 增加白名单

    • 现象
在实际的使用中,会有一部分应用需要设置只可以在办公场地的网络使用,之前使用阿里云 SLB 的时候可以针对端口进行访问控制,但是现在走 ingress ,都是从80 or 443端口进,所以需要在 ingress 设置
  • 解决方法
> **Whitelist source range**
>You can specify allowed client IP source ranges through the nginx.ingress.kubernetes.io/whitelist-source-range annotation. The value is a comma separated list of CIDRs, e.g. 10.0.0.0/24,172.10.0.1.
在 ingress 里配置 ```nginx.ingress.kubernetes.io/whitelist-source-range``` ,如有多个ip段,用逗号分隔即可
nginx.ingress.kubernetes.io/whitelist-source-range: 10.0.0.0/24
如果想全局适用,可以在阿里云 SLB 里操作,也可以将该配置加入到 ```NGINX ConfigMap``` 中。

根据工作中遇到的实际问题,持续更新中...

总结

使用NGINX ingress controller的好处就是对于nginx配置相对比较熟悉,性能也不差。相关nginx配置的对应的ingress可以在 https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/ 上查到。

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
编解码 应用服务中间件 Linux
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
110 1
|
5月前
|
应用服务中间件 Linux 网络安全
Centos 8.0中Nginx配置文件和https正书添加配置
这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
620 87
|
11天前
|
Ubuntu 安全 应用服务中间件
详细指南:配置Nginx服务器在Ubuntu平台上
以上步骤涵盖了基本流程:从软件包管理器获取 Ngnix, 设置系统服务, 调整UFW规则, 创建并激活服务器块(也称作虚拟主机), 并进行了初步优化与加固措施。这些操作都是建立在命令行界面上,并假设用户具有必要权限(通常是root用户)来执行这些命令。每个操作都有其特定原因:例如,设置开机启动确保了即使重启后也能自动运行 Ngnix;而编辑server block则定义了如何处理进入特定域名请求等等。
133 18
|
5月前
|
负载均衡 应用服务中间件 nginx
Nginx配置与命令
Nginx 是一款高性能的 HTTP 和反向代理服务器,其配置文件灵活且功能强大。本文介绍了 Nginx 配置的基础结构和常用指令,包括全局块、Events 块、HTTP 块及 Server 块的配置方法,以及静态资源服务、反向代理、负载均衡、HTTPS 和 URL 重写等功能实现。此外,还提供了常用的 Nginx 命令操作,如启动、停止、重载配置和日志管理等,帮助用户高效管理和优化服务器性能。
|
13天前
|
Ubuntu 安全 应用服务中间件
详细指南:配置Nginx服务器在Ubuntu平台上
以上步骤涵盖了基本流程:从软件包管理器获取 Ngnix, 设置系统服务, 调整UFW规则, 创建并激活服务器块(也称作虚拟主机), 并进行了初步优化与加固措施。这些操作都是建立在命令行界面上,并假设用户具有必要权限(通常是root用户)来执行这些命令。每个操作都有其特定原因:例如,设置开机启动确保了即使重启后也能自动运行 Ngnix;而编辑server block则定义了如何处理进入特定域名请求等等。
114 17
|
3月前
|
人工智能 缓存 Kubernetes
ACK GIE配置建议
Gateway with Inference Extension是基于Kubernetes社区Gateway API及其扩展规范实现的增强型组件,支持四层/七层路由服务,并面向生成式AI推理场景提供负载均衡优化、服务管理简化等能力,适用于AI推理服务的高可用部署与性能优化。在不同的场景使用ACK Gateway with Inference Extension时,可能需要根据业务需求和高可用需要对网关和推理扩展进行不同的配置调整。本文主要介绍在实际业务场景中针对ACK GIE的配置建议,以获得更好的使用效果。
185 23
|
2月前
|
数据建模 应用服务中间件 PHP
配置nginx容器和php容器协同工作成功,使用ip加端口的方式进行通信
本示例演示如何通过Docker挂载同一宿主目录至Nginx与PHP容器,实现PHP项目运行环境配置。需注意PHP容器中监听地址修改为0.0.0.0:9000,并调整Nginx配置中fastcgi_pass指向正确的IP与端口。同时确保Nginx容器中/var/www/html权限正确,以避免访问问题。
配置nginx容器和php容器协同工作成功,使用ip加端口的方式进行通信
|
3月前
|
应用服务中间件 网络安全 nginx
配置Nginx以支持Websocket连接的方法。
通过上述配置,Nginx将能够理解WebSocket协议的特殊要求,代理Websocket流量到合适的后端服务器。注意,Websocket并不是HTTP,尽管它最初是通过HTTP请求启动的连接升级,因此保证Nginx了解并能够妥善处理这种升级流程是关键。
560 10
|
2月前
|
Ubuntu 应用服务中间件 Linux
在Ubuntu上配置Nginx实现开机自启功能
至此,Nginx应该已经被正确地设置为开机自启。在Ubuntu中利用 `systemd`对服务进行管理是一种高效的方式,为系统管理员提供了强大的服务管理能力,包括但不限于启动、停止、重启服务,以及配置服务的开机自启动。通过这些简洁的命令,即使是对Linux不太熟悉的用户也能轻松地进行配置。
110 0
|
4月前
|
安全 应用服务中间件 网络安全
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
259 0
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多