我在 GKE 集群 (v1.24.26) 上使用 Google 的托管集合,但找不到收集与 Kubernetes cronjobs 相关指标的方法。我找不到 kube_cronjob_next_schedule_time、kube_job_status_failed 或 kube_job_status_succeeded。
我需要配置一些特定的东西来收集 GKE 上的这些指标吗?
我尝试重新启动 kube-state-metrics-0,重新启动收集器,但没有任何效果。
好奇。
我可以重现您的问题。
我怀疑 GMP 使用 Kube State Metrics 存在问题。
部署后,我无法验证配置。
collector
(仅 - 见下文)收集 kube_state_metrics_*
,但云监控也不会显示这些。
您已将
apply
Kube State Metrics 添加到集群中,其中包括 PodMonitoring
资源,但奇怪的是针对 metrics-self
中名为 metrics
的端口(而不是针对名为 kube-state-metrics
的端口):
kubectl get podmonitoring/kube-state-metrics \
--namespace=gmp-public \
--output=jsonpath="{.spec.endpoints[0]}"
{
"interval":"30s",
"port":"metrics-self"
}
但是(!)
kube-state-metrics
暴露了2个(指标)端口:
kubectl get statefulset/kube-state-metrics \
--namespace=gmp-public \
--output=jsonpath="{.spec.template.spec.containers[0].ports}"
[
{
"containerPort": 8080,
"name": "metrics",
"protocol": "TCP"
},
{
"containerPort": 8081,
"name": "metrics-self",
"protocol": "TCP"
}
]
如果您
port-forward
访问这些端口,8081
会公开一组指标 (kube_state_metrics_*
),但 8080
会公开您感兴趣的指标(kube_job
和 kube_cronjob
):
kubectl port-forward statefulsets/kube-state-metrics \
--namespace=gmp-public \
8080:8080 \
8081:8081
然后:
kube_state_metrics_*
)kube_job_*
和kube_cronjob_*
等)或者:
# "metrics-self" (8081) doesn't include "kube_cronjob"
curl --silent --get http://localhost:8081/metrics |\
awk '/kube_cronjob/ {print}'
# "metrics" (8080) includes "kube_cronjob"
curl --silent --get http://localhost:8080/metrics |\
awk '/kube_cronjob/ {print}'
因此,第一件事是尝试创建一个新的
PodMonitoring
来捕获例如kube_cronjob_*
指标也来自 metrics
(8080):
kube-state-metrics-2.yaml
:
apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
name: kube-state-metrics-2
namespace: gmp-public
labels:
app.kubernetes.io/name: kube-state-metrics
spec:
endpoints:
- port: metrics
interval: 30s
selector:
matchLabels:
app.kubernetes.io/name: kube-state-metrics
并且:
kubectl apply --filename=kube-state-metrics-2.yaml
然后(大约 30 秒后),检查 GMP 收集器是否正在抓取该目标:
kubectl port-forward daemonset/collector \
--namespace=gmp-system \
19090:19090
然后通过浏览 http://localhost:19090/targets 或:
确认新的
PodMonitoring
目标 (
kube-state-metrics-2
) 正在被收集器抓取
curl \
--silent \
--get \
http://localhost:19090/api/v1/targets \
| jq -r '.data.activeTargets[].labels|select(.job=="kube-state-metrics-2")'
{
"cluster": "...",
"container": "kube-state-metric",
"instance": "kube-state-metrics-0:metrics",
"job": "kube-state-metrics-2",
"location": "...",
"namespace": "gmp-public",
"pod": "kube-state-metrics-0",
"project_id": "ackal-231229"
}
并且(!)通过浏览确认
collector
具有指标:
http://localhost:19090/graph?g0.expr=%7B__name__%3D~%22kube_cronjob_.%2B%22%7D
或者:
curl \
--silent \
--get \
--data-urlencode 'match[]={__name__=~"kube_cronjob_.+"}' \
http://localhost:19090/api/v1/series \
| jq -r '.data[].__name__'
kube_cronjob_annotations
kube_cronjob_created
kube_cronjob_info
kube_cronjob_labels
kube_cronjob_metadata_resource_version
kube_cronjob_next_schedule_time
kube_cronjob_spec_failed_job_history_limit
kube_cronjob_spec_successful_job_history_limit
kube_cronjob_spec_suspend
kube_cronjob_status_active
kube_cronjob_status_last_schedule_time
kube_cronjob_status_last_successful_time
结论:
kube-state-metrics
例如kube_cronjob
已暴露,但未被部署时创建的 PodMonitoring
刮擦operatorconfig/config
中编辑了 gmp-public
以明确地将指标包含在过滤器中,但这也不起作用。/难住了