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

Kubernetes部署服务通过Ingress访问报错413解决

Kubernetes部署服务通过Ingress访问报错413 Request Entiry Too large解决

  • 场景
  • 分析
    • 外部负载
    • Ingress
      • 解决:Ingress配置
    • Nginx HTTP
      • 解决:Nginx配置

场景

这里先简单说明本文的背景情况,下面的情况应该可以覆盖大部分场景

  1. 最左侧Nginx是物理机的负载,也就是在Kubernetes外部的负载,这个负载主要是负载并转发流量到Ingress的端口,如果没有云厂商的LoadBalance,大部分都会设计这种模式
  2. Ingress Controller和Ingress就是Kubernetes网络中的一个组件,实现负载均衡、路由转发,底层也是由Nginx实现的
  3. 最右侧是服务中的HTTP服务,假设也是Nginx做的HTTP服务

所以综上所述,这个场景里面有3个Nginx,而413 Request Entiry Too large就是请求的实体太大了,抛去服务本身的问题,从Kubernetes和Nginx中间件上分析这个问题。
在这里插入图片描述

分析

外部负载

因为外部负载只是做流量转发,所以一般就是用Nginx的stream配置即可(不涉及请求实体数据的大小限制),将80和443转发到Ingress的指定端口,所以该部分没有413问题

stream {
    upstream 80_proxy {
        hash $remote_addr consistent;  #远程地址做个hash
        server Kubernetes任意节点IP:Ingress80端口;        #Kubernetes集群IP(一般为内部IP)+Ingress端口
    }

    server {
        listen       80;
        proxy_pass   80_proxy;
    }

    upstream 443_proxy {
        hash $remote_addr consistent;  #远程地址做个hash
        server Kubernetes任意节点IP:Ingress443端口;        #Kubernetes集群IP(一般为内部IP)+Ingress端口
    }

    server {
        listen       443;
        proxy_pass   443_proxy;
    }
}

Ingress

网上很多说在Ingress的yaml中加配置nginx.ingress.kubernetes.io/proxy-body-size: 30M,但是不一定适用,因为大家的Ingress镜像、版本不一定一致,需要看apiVersion: networking.k8s.io/v1这里是使用的什么API,找到对应的文档和镜像信息,然后再进行配置。

比如Kubernetes官方的文档中对APInetworking.k8s.io/v1的介绍如下Ingress-nginx-configuration(custom-max-body-size)

  • 翻译的

翻译的截图

  • 原文
    在这里插入图片描述

这里很清楚的说,这个没有设置的话,如果超过了默认值(一般是1m)就会出现413错误。client_max_body_size就是Nginx的请求实体大小配置,但是Ingress中不配置它,不要被误导了。这里面给出的解决方案,是以下两个配置:

  1. 要在 Ingress 规则全局配置此设置,需要在NGINX ConfigMap中设置proxy-body-size
  2. 要在 Ingress 规则中使用自定义值,请定义以下注释annotationnginx.ingress.kubernetes.io/proxy-body-size: 30m

解决:Ingress配置

  1. NGINX ConfigMap Guide

官方文档对NGINX ConfigMap中的proxy-body-size是如下解释,该值和client_max_body_size的作用一致,所以配置该项即可
在这里插入图片描述
但是文档没有说该项属于metadata(annotation、label)还是data,所以又去看了示例的configmap.md
如下Example,是在ConfigMap中的data配置下,注意data是根配置,顶头写

在这里插入图片描述

将Ingress的ConfigMap添加data配置后如下即可

---
apiVersion: v1
data:
  proxy-body-size: 50M
  1. Ingress.yaml

这个文档中直接说明了,要在 Ingress 规则中定义注释,也就是annotationnginx.ingress.kubernetes.io/proxy-body-size: 30m所以在配置中增加annotation后如下即可

---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: 'true'
    nginx.ingress.kubernetes.io/proxy-body-size: 50M

Nginx HTTP

业务系统的Nginx就很简单啦,直接在nginx.conf中的httpserverlocation部分增加client_max_body_size配置即可

解决:Nginx配置

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    client_max_body_size 50M;
    sendfile        on;
    ……

相关文章:

  • 3如何搭建组件库的样式工程之button-scss
  • 飞书第三方ISV服务商应用开发及上架教程
  • JavaScript 运算符和表达式(二)
  • js arr.reduce() reduce方法应用
  • Day 56 Django 连接数据库 ORM
  • 深度学习中的激活函数有哪些?
  • Image through Atmospheric Turbulence笔记(一)
  • 遇到的一些奇怪的bug(非代码问题)与解决方法
  • 鸟哥私房菜linux就该这么学-学习记录
  • 猿创征文| Mybatis报错原因和解决方法:Invalid bound statement (not found): com.xxx.mapper.xxx
  • 算法学习-单调栈,接雨水经典题目
  • 2.Dos命令
  • 操作系统复习:进程
  • 经典/最新计算机视觉论文及代码推荐
  • python搞笑表白
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angular2开发踩坑系列-生产环境编译
  • CSS 提示工具(Tooltip)
  • Invalidate和postInvalidate的区别
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • MySQL的数据类型
  • node和express搭建代理服务器(源码)
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • React+TypeScript入门
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 讲清楚之javascript作用域
  • 排序算法之--选择排序
  • 我建了一个叫Hello World的项目
  • 线性表及其算法(java实现)
  • 小程序开发中的那些坑
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 如何正确理解,内页权重高于首页?
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​Linux·i2c驱动架构​
  • ​MySQL主从复制一致性检测
  • ​水经微图Web1.5.0版即将上线
  • #LLM入门|Prompt#3.3_存储_Memory
  • #QT项目实战(天气预报)
  • $NOIp2018$劝退记
  • ()、[]、{}、(())、[[]]命令替换
  • (8)STL算法之替换
  • (C++17) std算法之执行策略 execution
  • (二)JAVA使用POI操作excel
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)基于IDEA的JAVA基础10
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .net FrameWork简介,数组,枚举