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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 随着容器化的深入,越来越多的服务陆续迁移到kubernetes集群中,有些问题在测试环境并未凸显,但是在生产环境中这些问题就显得格外的扎眼。这里就对实践中kubernetes集群中的7层负载均衡器ingress遇到的问题进行总结。

前言

随着公司容器化的深入,越来越多的服务陆续迁移到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。

image

根据实际情况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.

    文档上给出了非常明显的警告️:从 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.

    • 示例

    到这里问题已经解决了,在更新了 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 -
  2. 解决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,否则将不生效
      
  2. 增加白名单

    • 现象

      在实际的使用中,会有一部分应用需要设置只可以在办公场地的网络使用,之前使用阿里云 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/ 上查到。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
22天前
|
Prometheus Kubernetes 监控
Kubernetes 性能调优与成本控制
【8月更文第29天】随着 Kubernetes 在企业中的广泛应用,如何有效地管理和优化 Kubernetes 集群的性能和成本成为了一个重要的课题。本篇文章将介绍 Kubernetes 性能监控的基础知识,以及一些实用的成本优化技巧,包括资源配额的设置、Pod 密度的提高和集群规模的合理调整。
41 1
|
1天前
|
缓存 前端开发 JavaScript
终极 Nginx 配置指南(全网最详细)
本文详细介绍了Nginx配置文件`nginx.conf`的基本结构及其优化方法。首先通过删除注释简化了原始配置,使其更易理解。接着,文章将`nginx.conf`分为全局块、events块和http块三部分进行详细解析,帮助读者更好地掌握其功能与配置。此外,还介绍了如何通过简单修改实现网站上线,并提供了Nginx的优化技巧,包括解决前端History模式下的404问题、配置反向代理、开启gzip压缩、设置维护页面、在同一IP上部署多个网站以及实现动静分离等。最后,附上了Nginx的基础命令,如安装、启动、重启和关闭等操作,方便读者实践应用。
121 76
终极 Nginx 配置指南(全网最详细)
|
13天前
|
应用服务中间件 nginx
一文搞定Nginx配置RTMP!
一文搞定Nginx配置RTMP!
49 3
|
13天前
|
Ubuntu 应用服务中间件 数据库
Nginx配置:阻止非国内IP地址访问的设置方法
此外,出于用户隐私和法律合规性的考虑,应慎重考虑阻止特定国家或地区IP地址的决策。在某些情况下,这可能被视为歧视性或违反当地法律。
31 2
|
24天前
|
存储 缓存 负载均衡
NGINX 性能调优的五大技巧
【8月更文挑战第27天】
41 5
|
27天前
|
Kubernetes 网络性能优化 调度
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
|
27天前
|
Kubernetes 调度 Perl
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
|
28天前
|
Ubuntu 应用服务中间件 Linux
在Linux中,如何配置Web服务器(如Apache或Nginx)?
在Linux中,如何配置Web服务器(如Apache或Nginx)?
|
26天前
|
应用服务中间件 Linux PHP
【Azure 应用服务】App Service For Linux 环境中,如何修改 Nginx 配置中 server_name的默认值 example.com
【Azure 应用服务】App Service For Linux 环境中,如何修改 Nginx 配置中 server_name的默认值 example.com
|
27天前
|
应用服务中间件 Linux nginx
【Azure 应用服务】App Service For Container 配置Nginx,设置/home/site/wwwroot/目录为启动目录,并配置反向代理
【Azure 应用服务】App Service For Container 配置Nginx,设置/home/site/wwwroot/目录为启动目录,并配置反向代理