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

简介: 随着容器化的深入,越来越多的服务陆续迁移到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/ 上查到。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
18天前
|
运维 前端开发 应用服务中间件
LNMP详解(八)——Nginx动静分离实战配置
LNMP详解(八)——Nginx动静分离实战配置
23 0
|
28天前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
28天前
|
应用服务中间件 nginx
Nginx中如何配置中文域名?
Nginx中如何配置中文域名?
38 0
|
2月前
|
负载均衡 Ubuntu 应用服务中间件
|
2月前
|
前端开发 应用服务中间件 Linux
nginx解决springcloud前后端跨域问题,同时配置ssl
nginx解决springcloud前后端跨域问题,同时配置ssl
|
16天前
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
78 0
|
1月前
|
PHP
百度虚拟机 bcloud_nginx_user.conf配置
百度虚拟机 bcloud_nginx_user.conf配置
22 0
|
11天前
|
应用服务中间件 网络安全 nginx
nginx配置https访问
nginx配置https访问
24 0
|
21天前
|
应用服务中间件 nginx
nginx配置https和直接访问静态文件的方式
nginx配置https和直接访问静态文件的方式
27 3
|
26天前
|
数据可视化 应用服务中间件 网络安全
简单易用的Nginx代理管理工具:体验便捷配置、高效管理
Nginx Proxy Manager是一款强大的代理服务器管理工具,提供简单直观的界面来配置和管理Nginx代理服务器,帮助用户轻松提升配置的简洁性和便捷性。
44 0
简单易用的Nginx代理管理工具:体验便捷配置、高效管理

推荐镜像

更多