amazon-s3 - Kubernetes:关于S3存储托管Docker Registry的活跃性/就绪性探针的问题

标签 amazon-s3 kubernetes kubernetes-helm docker-registry

当前设置

你好。我正在使用随S3存储一起部署的Docker Registry Helm chart 。现在,我想更新(更改)实时/就绪探针的工作方式。原因是使用一天后,我已经耗尽了AWS上LIST请求的免费每月配额。该配额为2000个请求/月。现在,注册表 Pane 上的探针如下所示:

Liveness:       http-get http://:5000/ delay=0s timeout=1s period=10s #success=1 #failure=3
Readiness:      http-get http://:5000/ delay=0s timeout=1s period=10s #success=1 #failure=3

这些请求显然是GET。但是,按照this的答案,这些请求被AWS标记为LIST

这些是我在 Helm 图Docker Registry安装中使用的自定义值( chart_values.yaml ):
storage: s3

secrets:
  htpasswd: "..."
  s3:
    accessKey: "..."
    secretKey: "..."

s3:
  region: "..."
  secure: true
  bucket: "..."


推/拉图像按预期工作。

问题(请参阅最新的修改后的问题)
  • 我该怎么办才能避免被探针查询到S3?
  • 是否应该在不触摸S3的情况下将 Activity /就绪状态检查仅与 pods 本身相关联?

  • 我知道我可以编辑部署配置以更改探针的periodSeconds,例如600s。但我认为这不是最佳解决方案。我知道liveness commands存在,但是我不确定默认注册表docker镜像是否可以实现。

    我最后想到的是,如果注册表docker镜像启用了prometheus度量标准,则可以将探针更改为:5001/metrics路径。但是我不太确定该怎么做。

    编辑:

    为了启用Prometheus指标,我删除了以前安装的docker Registry Helm 。然后通过helm pull stable/docker-registry --untar下载stable docker reigstry helm chart

    然后,我编辑了 templates / deployment.yaml 文件:

    spec:
      containers:
        ports:
          - containerPort: 5000
          - containerPort: 5001     # Added this line
        livenessProbe:
          initialDelaySeconds: 1    # Added
          path: /metrics            # Edited
          port: 5001                # Edited
        readinessProbe:
          initialDelaySeconds: 10   # Added
          path: /metrics            # Edited
          port: 5001                # Edited
        env:
          # Added these env variables
          - name: REGISTRY_HTTP_DEBUG_ADDR
            value: "localhost:5001"
          - name: REGISTRY_HTTP_DEBUG_PROMETHEUS_ENABLED
            value: "true"
          - name: REGISTRY_HTTP_DEBUG_PROMETHEUS_PATH
            value: /metrics
    

    以及 templates / service.yaml 文件:

      ports:
        - port: {{ .Values.service.port }}
          protocol: TCP
          name: {{ .Values.service.name }}
          targetPort: 5000
        # Added these lines below
        - port: 5001
          protocol: TCP
          name: {{ .Values.service.name }}-prometheus
          targetPort: 5001
    
    

    棉绒并安装:

    helm install registry ./docker-registry-chart/ -f chart_values.yaml -n docker-registry
    

    但是,注册表容器永远无法使用此配置就绪(kubectl get在容器上显示0/1)。这是由于未暴露5001 containerPort而导致就绪探针失败。因此,就绪探针失败,无法到达度量服务器。

    我可以确认Docker容器中的指标服务器已正确启动。以下是注册表荚日志,它们显示调试(度量)服务器已启动:
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5000_TCP" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5000_TCP_ADDR" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5000_TCP_PORT" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5000_TCP_PROTO" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5001_TCP" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5001_TCP_ADDR" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5001_TCP_PORT" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5001_TCP_PROTO" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_SERVICE_HOST" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_SERVICE_PORT" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_SERVICE_PORT_REGISTRY" 
    time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_SERVICE_PORT_REGISTRY_PROMETHEUS" 
    time="2020-04-10T14:36:26.172115809Z" level=info msg="debug server listening localhost:5001" 
    time="2020-04-10T14:36:26.188154917Z" level=info msg="redis not configured" go.version=go1.11.2 instance.id=fc945824-3600-4343-8a18-75a20b07f695 service=registry version=v2.7.1 
    time="2020-04-10T14:36:26.194453749Z" level=info msg="Starting upload purge in 29m0s" go.version=go1.11.2 instance.id=fc945824-3600-4343-8a18-75a20b07f695 service=registry version=v2.7.1 
    time="2020-04-10T14:36:26.211140816Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.11.2 instance.id=fc945824-3600-4343-8a18-75a20b07f695 service=registry version=v2.7.1 
    time="2020-04-10T14:36:26.211497166Z" level=info msg="providing prometheus metrics on /metrics" 
    time="2020-04-10T14:36:26.211894294Z" level=info msg="listening on [::]:5000" go.version=go1.11.2 instance.id=fc945824-3600-4343-8a18-75a20b07f695 service=registry version=v2.7.1 
    

    我什至可以执行docker容器并 curl localhost:5001/metrics,从而得到200个带有适当的prometheus数据。

    但是我仍然不确定如何在容器上公开5001端口。我相信这将使我能够将指标与@mdaniel中的his answer提及之类的探针一起使用。

    编辑2 :
    kubectl port-forward <registry_pod> 5001
    

    Portforwarding注册表容器有效,我可以curl localhost:5001/metrics来获取普罗米修斯指标数据。 curl从集群执行。

    我想知道 templates / service.yaml 文件是否有问题。

    编辑3 :我知道问题出在哪里。端口5001上无法访问的服务是由于将REGISTRY_HTTP_DEBUG_ADDR设置为localhost:5001导致的。 值应为:5001

    最后,将其转换为您的 template / deployment.yaml 应该如下所示:

    spec:
      containers:
        ports:
          - containerPort: 5000
          - containerPort: 5001     # Added this line
        livenessProbe:
          initialDelaySeconds: 1    # Added
          path: /metrics            # Edited
          port: 5001                # Edited
        readinessProbe:
          initialDelaySeconds: 10   # Added
          path: /metrics            # Edited
          port: 5001                # Edited
        env:
          # Added these env variables
          - name: REGISTRY_HTTP_DEBUG_ADDR
            value: ":5001"          # Make sure the addr field is left empty!
          - name: REGISTRY_HTTP_DEBUG_PROMETHEUS_ENABLED
            value: "true"
          - name: REGISTRY_HTTP_DEBUG_PROMETHEUS_PATH
            value: /metrics
    

    潜在地,您也可以通过 chart_values.yaml 文件以及configData部分(configData.http.debug.addr等)来提供环境变量。

    无论哪种方式,我都决定将“答案”发布为编辑内容,而不是常规的SO答案。 原始问题仍未得到解答。

    重述原始问题:
  • 是否应该在不访问S3的情况下将 liveness /就绪性检查仅与容器本身相关联?应该使用注册表容器上的storagedriver自定义S3运行状况检查。在我看来,注册表是一个几乎与S3无关的独立实体。本质上,我们要对那个实体进行健康检查,而不是要进行单独健康检查的数据存储...
  • 最佳答案

    您可以将 list 文件中的“ liveness ”和“就绪” URL更改为度量标准URL。

    关于amazon-s3 - Kubernetes:关于S3存储托管Docker Registry的活跃性/就绪性探针的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61103591/

    相关文章:

    kubernetes - Ingress后端REST错误: The server encountered a temporary error and could not complete your request.请30秒后重试

    Kubernetes 删除 pod 作业

    kubernetes - 指定命名空间时无法使用来自 nginx-stable 的 helm 安装 nginx ingress

    kubernetes - 在本地安装 Helm chart : “Error: gzip: invalid header”

    amazon-web-services - 如何进行自动 S3 备份

    node.js - 使用无服务器框架上传时文件在 S3 上损坏

    amazon-web-services - 通过 AWS CLI 将文件上传到 S3 时出现 "Broken pipe"

    amazon-web-services - 如何在 golang 中从 AWS S3 获取资源 URL

    memory - 试图了解用于资源的值以及多个容器部署的限制

    kubernetes - 何时何地使用Kubernetes Pod关联性规则