Kubernetes中Docker Registry上传大于1GB镜像失败求助
解决Docker Registry大镜像层上传重试问题
一、优化Nginx Ingress配置
针对你的Ingress配置,做以下调整:
- 替换错误的客户端最大请求体注解:将
nginx.org/client-max-body-size: "0"改为nginx.ingress.kubernetes.io/client-max-body-size: "0"(0表示不限制大小,适配nginx-ingress控制器的正确注解) - 清理configuration-snippet中的重复设置:移除重复的
proxy_http_version 1.1和X-Forwarded-For配置,避免规则冲突 - 添加客户端请求超时注解:增加
nginx.ingress.kubernetes.io/client-body-timeout: "600"和nginx.ingress.kubernetes.io/client-header-timeout: "600",防止大文件上传时客户端侧超时中断 - 调整keepalive连接设置:添加
nginx.ingress.kubernetes.io/keepalive-requests: "1000"和nginx.ingress.kubernetes.io/keepalive-timeout: "600",保障长连接稳定性
修改后的Ingress关键注解示例:
annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: {{ .Values.certManager.name }} nginx.ingress.kubernetes.io/force-ssl-redirect: "false" nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/client-max-body-size: "0" # 替换为控制器适配的注解 nginx.ingress.kubernetes.io/proxy-buffering: "off" nginx.ingress.kubernetes.io/proxy-http-version: "1.1" nginx.ingress.kubernetes.io/proxy_ignore_headers: "X-Accel-Buffering" nginx.ingress.kubernetes.io/connection-proxy-header: "keep-alive" nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" nginx.ingress.kubernetes.io/proxy-send-timeout: "600" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" nginx.ingress.kubernetes.io/client-body-timeout: "600" # 新增客户端超时配置 nginx.ingress.kubernetes.io/client-header-timeout: "600" # 新增客户端超时配置 nginx.ingress.kubernetes.io/keepalive-requests: "1000" # 新增长连接请求数限制 nginx.ingress.kubernetes.io/keepalive-timeout: "600" # 新增长连接超时时间 nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "600" nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "10" nginx.ingress.kubernetes.io/proxy-request-buffering: "off" nginx.ingress.kubernetes.io/proxy-body-size: "8192m" kubernetes.io/tls-acme: 'true' nginx.ingress.kubernetes.io/configuration-snippet: | more_set_headers "Host $http_host"; more_set_headers "Upgrade $http_upgrade"; more_set_headers "Connection keep-alive"; more_set_headers "X-Real-IP $remote_addr"; more_set_headers "X-Forwarded-Proto: https"; more_set_headers "X-Forwarded-Ssl on";
二、调整Cloudflare相关设置
Cloudflare的默认限制会干扰大文件上传,需做以下修改:
- 提升最大上传大小:在Cloudflare控制台「规则」→「传输规则」中,设置「最大上传大小」为至少10GB(或按需调整),覆盖默认100MB的限制
- 关闭Rocket Loader:在「速度」→「优化」中禁用Rocket Loader,它会破坏长连接和大文件上传的稳定性
- 设置缓存绕过规则:创建缓存规则,对Registry域名的所有POST/PUT请求设置「缓存级别:绕过缓存」,避免Cloudflare缓存上传请求导致中断
- 延长HTTP超时:在「网络」→「HTTP超时」中,将「HTTP请求超时」调整为600秒(10分钟),与Ingress的超时设置保持一致
三、检查Docker Registry配置
确保Registry本身支持大文件上传:
- 确认Registry配置文件(config.yml)中未设置
max_content_length限制,或设置为足够大的值 - 保持分块上传启用:Docker Registry默认支持分块上传,若手动修改过配置,确保
storage模块未禁用该功能 - 验证存储后端:检查Registry绑定的PVC或其他存储是否有足够空间、读写权限正常,避免写入失败触发重试
内容的提问来源于stack exchange,提问作者Immutable
相关产品推荐
相关产品推荐

