Kubernetes:托管 Docker Registry 的 S3 存储上的活性/就绪性探测问题

Kubernetes:托管 Docker Registry 的 S3 存储上的活性/就绪性探测问题

当前设置

您好。我正在使用部署了 S3 存储的 Docker Registry helm chart。现在我想更新(更改)实时/就绪探针的工作方式。原因是使用一天后,我的免费套餐就用完了每月AWS 上的 LIST 请求配额。此配额为每月 2000 个请求。目前,注册表 pod 上的探测器如下所示:

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。然而,根据答案是,这些请求被LISTAWS 标记为。

这些是自定义值(图表值.yaml)我在 helm chart 中已经使用了 Docker Registry 安装:

storage: s3

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

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

图像的推送/拉取按预期进行。

问题(请参阅最新编辑以了解重新表述的问题)

  • 我应该怎么做才能避免探测器查询 S3?
  • 活跃度/就绪性检查难道不应该只与 pod 本身相关而不影响 S3 吗?

我知道我可以编辑部署配置来更改periodSeconds探测器的,比如说600s。但我不认为这是最佳解决方案。我知道活跃度命令存在,但我不确定使用默认注册表 docker 映像是否可以实现这一点。

我最后想到的是,如果注册表 docker 镜像启用了 prometheus 指标,我就可以更改路径的探测:5001/metrics。但我真的不知道该怎么做。


编辑

为了启用 prometheus 指标,我删除了之前安装的 docker registry。然后下载了稳定的 docker reigstry helm chart通过helm pull stable/docker-registry --untar

然后我编辑了模板/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

模板/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

然而,注册表 pod 永远不会准备好使用此配置(kubectl get在 pod 上显示 0/1)。这是因为就绪探测失败,因为 5001 容器端口未公开。因此,就绪探测失败,无法到达指标服务器。

我可以确认 Docker 容器中的指标服务器已正确启动。以下是显示调试(指标)服务器已启动的注册表 pod 日志:

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提及他的回答


编辑2

kubectl port-forward <registry_pod> 5001

端口转发注册表 pod 有效,我可以curl localhost:5001/metrics获取 prometheus 指标数据。curl从集群执行。

我想知道我的模板/service.yaml文件..?


编辑3:我已经弄清楚问题出在哪里了。端口上的服务无法访问5001是由于将 设置为 不正确造成REGISTRY_HTTP_DEBUG_ADDRlocalhost:5001价值应该是:5001

最后,要将其转化为你的模板/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

你也可以通过以下方式提供环境变量图表值.yaml文件与configData部分(configData.http.debug.addr等)。


无论如何,我决定发布“回答“作为编辑,而不是常规的 SO 答案。原始问题仍未得到解答。

重新表述原始问题

  • 活动性/就绪性检查是否应该只与 Pod 本身相关,而不访问 S3?S3 健康检查应该可以通过存储驱动程序在注册表容器上。在我看来,注册表是一个与 S3 几乎无关的独立实体。本质上,我们希望对该实体进行健康检查,而不是对具有单独健康检查的数据存储进行健康检查...

答案1

我可以将探测器更改为 :5001/metrics 路径。但我不太清楚该怎么做

由于你没有指定如何安装任何东西,所以没有人可以给你具体的命令,但我检查了一下docker-registry helm 图表而且他们似乎不允许定制活性和就绪探测:-(

因此,您必须使用正在运行注册表的部署kubectl edit deploy $registry_deploy名称$registry_deploy,然后更新两个探测块以指定您想要的内容。

请注意,虽然/metrics端点是一个完美的活性探测器,但它实际上是在做正确的事情,在准备探测,因为如果 Pod 无法使用其可用的凭据正确连接到 S3,则它不应该提供流量服务。

相关内容