在Kubernetes Nginx Ingress中增加Docker仓库中大型镜像的限制

166次阅读
没有评论

问题描述

在使用自托管的Docker仓库时,使用官方的Helm Chart安装了一个Docker仓库,对于某个镜像,他无法推送两个图层。Docker尝试了多次,但未成功。Kubernetes Pod的日志给出了以下错误:

unknown error reading request payload: unexpected EOF

两个图层都相对较大(252.5 MB / 393.8 MB)。用户在Ingress上已经尝试了一些操作,但仍然遇到问题。

解决方案

请注意以下操作可能涉及版本差异及修改前做好备份。

调整Ingress配置

用户在问题描述中已经提到,他在Ingress中使用了一些Annotations来尝试解决问题,但仍然存在上传失败的问题。根据他的经验,以下是关键的Annotation设置:

ingress:
  enabled: true
  hosts:
    - my-docker-registry.domain
  tls:
    - hosts:
      - my-docker-registry.domain
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-body-size: "0"

然而,经过尝试,用户发现kubernetes.io/ingress.class: nginx这个Annotation并不是必需的。而且,所有以nginx.ingress.kubernetes.io为前缀的Annotations都适用于默认的Kubernetes Ingress。设置超时时间并不是必须的,唯一重要的Annotation是nginx.ingress.kubernetes.io/proxy-body-size: "0",因为默认值对于Docker镜像图层来说太小了。如果没有这个Annotation,会出现413 Request Entity Too Large错误。

考虑HAProxy配置

用户在解决问题的过程中还发现了另一个潜在的问题:他们的Kubernetes节点前有一个HAProxy负载均衡器。在默认情况下,HAProxy的配置如下:

defaults
    # ...
    retries 3
    timeout connect     1000
    timeout client      1000
    timeout server      1000

用户发现这些超时时间被解释为毫秒。在他们的测试环境中,将客户端和服务器的超时时间都增加到了600秒,解决了推送问题。

结论

在使用Kubernetes Nginx Ingress时,特别是在与自托管的Docker仓库一起使用时,需要注意一些关键的配置。正确设置nginx.ingress.kubernetes.io/proxy-body-size以及可能影响上传的其他超时配置,如负载均衡器的超时设置,可以帮助解决上传大型Docker镜像时遇到的问题。在配置更改前,务必备份相关配置,以防意外情况发生。

以上就是在Kubernetes Nginx Ingress中解决Docker仓库上传大型镜像问题的方案。希望对你有所帮助!如果你有更多问题或需要进一步的解释,请随时提问。

正文完