当前设置
您好。我正在使用部署了 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
。然而,根据这答案是,这些请求被LIST
AWS 标记为。
这些是自定义值(图表值.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_ADDR
的localhost: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,则它不应该提供流量服务。