nginx + ingress + gunicorn 环境上传大文件报错问题的解决思路

在基于 Kubernetes 部署,使用 Gunicorn 运行的 Python Web 应用中,上传大文件时出现了一系列的错误,现在将解决问题的思路记录如下。 文件上传过程 上传文件流程 上传的文件首先到达 Kubernetes 所在的宿主机。 宿主机上的 Nginx 通过 Proxy 转发给 Kubernetes 集群中的 Ingress Controller,Ingress controller 也是使用 Nginx 实现的。 Ingress Controller 中的 Nginx 通过 Proxy 转发给 Gunicorn。 Gunicorn 会启动若干个 Worker 处理请求,所以 Gunicorn 会再转发给 Worker。 Worker 就是最终的 Python Web App 错误 413 的解决 首先碰到的是 413 Request Entity Too Large 错误,在上传过程中连接被中断(基本上每次都是相同的上传百分比被中断),请求返回 413,首先考虑到 Nginx 对于请求体的大小有限制,查看 Nginx 文档,发现 client_max_body_size 参数控制请求体的大小,默认的设置是 1mb。 client_max_body_size: Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field. If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client. Please be aware that browsers cannot correctly display this error. Setting size to 0 disables checking of client request body size. ...

二月 28, 2019 · 3 分钟 · Zhiya

搭建Kubernetes集群时DNS无法解析问题的处理过程

问题描述 在搭建 Kubernetes 集群过程中,安装了 kube-dns 插件后,运行一个 ubuntu 容器,发现容器内无法解析集群外域名,一开始可以解析集群内域名,一段时间后也无法解析集群内域名。 $ nslookup kubernetes.default Server: 10.99.0.2 Address 1: 10.99.0.2 kube-dns.kube-system.svc.cluster.local nslookup: can't resolve 'kubernetes.default' 排查过程 在排查问题前,先思考一下 Kubernetes 集群中的 DNS 解析过程,在安装好 kube-dns 的集群中,普通 Pod 的 dnsPolicy 属性是默认值 ClusterFirst,也就是会指向集群内部的 DNS 服务器,kube-dns 负责解析集群内部的域名,kube-dns Pod 的 dnsPolicy 值是 Default,意思是从所在 Node 继承 DNS 服务器,对于无法解析的外部域名,kube-dns 会继续向集群外部的 dns 进行查询,过程如图。 Ubuntu 容器是一个普通的 Pod,在 Linux 系统中,/etc/resolv.conf 是存储 DNS 服务器的文件,普通 Pod 的/etc/resolv.conf 文件应该存储的是 kube-dns 的 Service IP。 nameserver 10.99.0.2 # 这里存储的是kube-dns的Service IP search default.svc.cluster.local. svc.cluster.local. cluster.local. options ndots:5 查看后发现/etc/resolv.conf 文件中存储的是 kube-dns 的 Service IP,证明这一步没有问题,接下来查看一下 kube-dns 的 Pod,先进入 kube-dns 的 Pod 中检查一下/etc/resolv.conf 文件,这里存储的应该是集群外部的 DNS 服务器地址,查看后发现,这里存储的地址是 127.0.0.53,进一步查看 kube-dns Pod 的 log,发现出现了非常多的 i/o timeout 错误。 ...

七月 15, 2018 · 3 分钟 · Zhiya

Ubuntu 18.04 LTS安装KVM虚拟机

前一阵使用在最新的 Ubuntu 18.04 上安装了 KVM 来虚拟一个小的 VM 集群,将主要过程和其中遇到的一些问题记录下来。 准备工作 首先需要检查一下 CPU 是否支持虚拟化,执行一下命令来检查/proc/cpuinfo 文件中是否又虚拟化相关的字眼,如果有的话表明 CPU 支持虚拟化技术。 egrep -c '(svm|vmx)' /proc/cpuinfo 上面命令执行结果如果返回 0,表示 CPU 不支持虚拟化技术。当然主板 BIOS 中的虚拟化技术也可能不是默认开启的,如果没有开启需要手动开启一下。 安装 KVM 执行以下命令安装 KVM sudo apt update sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager 将 libvirtd 添加自启动 sudo systemctl start libvirtd.service sudo systemctl enable libvirtd.service 网络模式 KVM 安装完成后,首先需要进行网络设定,KVM 支持四种网络模式: 桥接模式 NAT 模式 用户网络模式 直接分配设备模式 主要讲一下前两种 桥接(Bridge)模式 在桥接模式下,宿主机和虚拟机共享同一个物理网络设备,虚拟机中的网卡和物理机中的网卡是平行关系,所以虚拟机可以直接接入外部网络,虚拟机和宿主机有平级的 IP。 原本宿主机是通过网卡 eth0 连接外部网络的,网桥模式会新创建一个网桥 br0,接管 eth0 来连接外部网络,然后将宿主机和虚拟机的网卡 eth0 都绑定到网桥上。 ...

六月 28, 2018 · 2 分钟 · Zhiya