0
点赞
收藏
分享

微信扫一扫

Kubelet 核心指标监控


How to Monitor the Kubelet | Sysdig

Kubernetes / Kubelet | Grafana Labs

https://github.com/flashcatcloud/categraf/blob/main/inputs/kubelet/dashboard-by-ident.json

在生产环境中运行 Kubernetes 时,监控 Kubelet 至关重要。Kubelet 是 Kubernetes 集群中非常重要的服务。

此 Kubernetes 组件负责确保 Pod 中定义的容器正常运行。一旦调度程序指定一个节点来运行 Pod,Kubelet 就会接受分配并运行 Pod 及其工作负载。

Kubelet 核心指标监控_perl

如果遇到 Kubernetes Kubelet 的问题,那么采取行动并尽快解决问题非常重要,否则 Kubernetes 节点将进入一种NotReady状态。借助其开箱即用的指标工具,您可以监控 Kubelet,但有大量指标!您应该查看其中哪些?

如果您想了解有关如何监控 Kubelet 以及最重要的 Kubelet 指标的更多信息,请继续阅读并了解如何做好准备以避免中断。

什么是 Kubelet?

Kubernetes Kubelet 在控制平面和工作节点中运行,作为所有节点的主节点代理。

Kubelet 核心指标监控_kubelet_02

Kubelet 以声明方式工作,接收 PodSpecs 并确保其中定义的容器当前正在运行且处于健康状态。就其本质而言,它是在操作系统本身中作为服务运行的代理,与集群中作为 Kubernetes 实体运行的其他组件非常不同。

Kubelet 服务需要永久启动并运行。这样一旦 Pod 被安排在特定节点中运行,它就能够从 Kubernetes API 获取任何新的 PodSpec 定义。如果 Kubelet 无法正常工作、崩溃或因任何原因关闭,Kubernetes 节点将进入一种NotReady状态,并且不会在该节点上创建新的 Pod。

当 Kubelet 宕机或无法正常工作时,需要考虑的另一件重要事情是:无论是探测Liveness还是Readiness执行都不会被执行,因此如果在 Kubelet 宕机时 Pod 上已经运行的工作负载开始出现故障或无法正常工作,它将不会重新启动,从而对此类应用程序的稳定性、可用性和性能造成影响。

如何监控 Kubelet

Prometheus节点角色为每个集群节点发现一个目标,其地址默认为 Kubelet 的 HTTP 端口,因此您仍然可以依赖此 Prometheus 角色从您的 Prometheus 实例中抓取 Kubelet 指标。

Kubelet 已进行检测,并默认通过端口 10250 公开 /metrics 端点,提供有关 Pod 卷和内部操作的信息。该端点很容易被抓取,您只需使用所需的证书通过 HTTPS 协议访问该端点即可。

为了获取 Kubelet 指标、访问节点本身或通过 ssh 进入 Pod,此服务正在监听0.0.0.0地址,因此在连接方面没有任何限制。如果 Pod 可以访问主机网络,您localhost也可以使用它来访问它。

<span style="background-color:var(--wp--preset--color--gray-70)"><span style="color:var(--wp--preset--color--white)"><code class="language-perl">$ curl -k -H <span style="color:#ffffff">"Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"</span> https:<span style="color:#bc6060">//</span><span style="color:#880000">192.168</span>.<span style="color:#880000">119.30</span>:<span style="color:#880000">10250</span>/metrics
<span style="color:#77b755"># HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend.</span>
<span style="color:#77b755"># TYPE apiserver_audit_event_total counter</span>
apiserver_audit_event_total <span style="color:#880000">0</span>
<span style="color:#77b755"># HELP apiserver_audit_requests_rejected_total [ALPHA] Counter of apiserver requests rejected due to an error in audit logging backend.</span>
<span style="color:#77b755"># TYPE apiserver_audit_requests_rejected_total counter</span>
apiserver_audit_requests_rejected_total <span style="color:#880000">0</span>
<span style="color:#77b755"># HELP apiserver_client_certificate_expiration_seconds [ALPHA] Distribution of the remaining lifetime on the certificate used to authenticate a request.</span>
<span style="color:#77b755"># TYPE apiserver_client_certificate_expiration_seconds histogram</span>
apiserver_client_certificate_expiration_seconds_bucket{le=<span style="color:#ffffff">"0"</span>} <span style="color:#880000">0</span>
apiserver_client_certificate_expiration_seconds_bucket{le=<span style="color:#ffffff">"1800"</span>} <span style="color:#880000">0</span>

(output truncated)</code>代码语言: Perl  (perl )</span></span>

如果您希望 Prometheus 实例抓取 Kubelet 指标端点,您只需将以下配置添加到配置文件scrape_configs中的部分prometheus.yml

- bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      job_name: kubernetes-nodes
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - replacement: kubernetes.default.svc:443
        target_label: __address__
      - regex: (.+)
        replacement: /api/v1/nodes/$1/proxy/metrics
        source_labels:
        - __meta_kubernetes_node_name
        target_label: __metrics_path__
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true

然后应用新的配置并重新创建prometheus-serverPod。

$ kubectl replace -f prometheus-server.yaml -n monitoring
$ kubectl delete pod prometheus-server-5df7b6d9bb-m2d27 -n monitoring

Kubelet 核心指标监控_bc_03

现在,您将看到 Prometheus 实例中可用的 Kubelet 指标。

监控 Kubelet:您应该检查哪些指标?

您已启动并运行 Prometheus 实例,并已配置为抓取 Kubelet 指标。那么,下一步是什么?

让我们来讨论一下您应该监控的关键 Kubelet 指标。免责声明:不同 Kubernetes 版本之间的Kubelet 指标可能有所不同。这里我们使用了 Kubernetes 1.25。您可以在Kubernetes GitHub repo中查看 Kubelet 的最新可用指标。

  • Number of Kubelet instances:在这里,您将找到一种轻松计算 Kubernetes 集群中运行的 Kubelet 实例数量的方法。只需对kubelet_node_name指标求和即可。此 PromQL 查询的预期值是集群的节点数。

sum(kubelet_node_name)

计算节点数量的另一种方法Ready是:注意:如果要获取未就绪节点的数量,请按 进行过滤status="false"

sum(kube_node_status_condition{condition="Ready", status="true"})

  • kubelet_running_pods:Kubelet 可让您了解节点中运行的 Pod 数量。定期检查此值并测量是否达到每个节点的 Pod 限制,或者这些数字是否在 Kubernetes 集群的预期范围内。

# HELP kubelet_running_pods [ALPHA] Number of pods that have a running pod sandbox
# TYPE kubelet_running_pods gauge
kubelet_running_pods 12

  •  kubelet_running_containers:此指标与上一个指标非常相似,但它计算每个节点中的容器数量。信息分为三个不同的部分container_state:已创建、已退出和正在运行。使用此指标可以更好地了解每个节点中运行的容器数量,并根据您的设置衡量容器数量是否符合您的预期。

# HELP kubelet_running_containers [ALPHA] Number of containers currently running
# TYPE kubelet_running_containers gauge
kubelet_running_containers{container_state="created"} 1
kubelet_running_containers{container_state="exited"} 18
kubelet_running_containers{container_state="running"} 14

  •  volume_manager_total_volumes:Kubelet 会挂载控制器指示的卷,因此它可以提供有关它们的信息。此指标可用于识别和诊断创建 Pod 时未挂载的卷的问题。每个 plugin_name 提供两个不同的状态字段:desired_state_of_world 和 actual_state_of_world。这样,如果您混合使用这两个值,就可以轻松查找差异。

# HELP volume_manager_total_volumes [ALPHA] 卷管理器中的卷数
# 类型volume_manager_total_volumes 仪表
volume_manager_total_volumes{plugin_name="kubernetes.io/configmap",state="actual_state_of_world"} 5
volume_manager_total_volumes{plugin_name="kubernetes.io/configmap",state="desired_state_of_world"} 5
volume_manager_total_volumes{plugin_name="kubernetes.io/downward-api",state="actual_state_of_world"} 1
volume_manager_total_volumes{plugin_name="kubernetes.io/downward-api",state="desired_state_of_world"} 1
volume_manager_total_volumes{plugin_name="kubernetes.io/empty-dir",state="actual_state_of_world"} 2
volume_manager_total_volumes{plugin_name="kubernetes.io/empty-dir",state="desired_state_of_world"} 2
volume_manager_total_volumes{plugin_name="kubernetes.io/host-path",state="actual_state_of_world"} 45
volume_manager_total_volumes{plugin_name="kubernetes.io/host-path",state="desired_state_of_world"} 45
volume_manager_total_volumes{plugin_name="kubernetes.io/projected",state="actual_state_of_world"} 8
volume_manager_total_volumes{plugin_name="kubernetes.io/projected",state="desired_state_of_world"} 8
volume_manager_total_volumes{plugin_name="kubernetes.io/secret",state="actual_state_of_world"} 3
volume_manager_total_volumes{plugin_name="kubernetes.io/secret",state="desired_state_of_world"} 3

Actual Volume Count:

sum(volume_manager_total_volumes{cluster="$cluster", job="k8s-kubelet", instance=~"$instance", state="actual_state_of_world"}) 


Desired Volume Count:

sum(volume_manager_total_volumes{cluster="$cluster", job="k8s-kubelet", instance=~"$instance",state="desired_state_of_world"})

接下来,您将看到Kubelet 执行的每个操作的黄金信号指标kubelet_runtime_operations_total, kubelet_runtime_operations_errors_total( 、 和kubelet_runtime_operations_duration_seconds_bucket)。另一方面,可以使用一些可用的系统指标来衡量 Kubelet 的饱和度。

kubelet_runtime_operations_total:此指标提供每种类型(container_status、create_container、exec、exec_sync、image_status、list_containers、list_images、list_podsandbox、remove_container 等)的运行时操作总数。

<span style="color:#1e1e22"># HELP kubelet_runtime_operations_total [ALPHA] 按操作类型累计的运行时操作数。
# 类型 kubelet_runtime_operations_total 计数器
kubelet_runtime_operations_total{operation_type="container_status"} 744
kubelet_runtime_operations_total{operation_type="create_container"} 33
kubelet_runtime_operations_total{operation_type="exec"} 3
kubelet_runtime_operations_total{operation_type="exec_sync"} 1816
kubelet_runtime_operations_total{operation_type="image_status"} 97
kubelet_runtime_operations_total{operation_type="list_containers"} 16929
kubelet_runtime_operations_total{operation_type="list_images"} 334
kubelet_runtime_operations_total{operation_type="list_podsandbox"} 16777
kubelet_runtime_operations_total{operation_type="podsandbox_status"} 308
kubelet_runtime_operations_total{operation_type="remove_container"} 57
kubelet_runtime_operations_total{operation_type="remove_podsandbox"} 18
kubelet_runtime_operations_total{operation_type="start_container"} 33
kubelet_runtime_operations_total{operation_type="status"} 1816
kubelet_runtime_operations_total{operation_type="stop_container"} 11
kubelet_runtime_operations_total{operation_type="stop_podsandbox"} 36
kubelet_runtime_operations_total{operation_type="update_runtime_config"} 1
kubelet_runtime_operations_total{operation_type="version"} 892</span>

这是一个计数器指标,您可以使用 rate 函数来计算 Kubelet 运行时操作的平均增长率。

sum(rate(kubelet_runtime_operations_total{job="kubernetes-nodes"}[5m])) by (operation_type, instance)

Kubelet 核心指标监控_kubernetes_04

  • kubelet_runtime_operations_errors_total运行时级别的操作错误数。它可以很好地指示节点中的低级问题,例如容器运行时的问题。与上一个指标一样,kubelet_runtime_operation_errors_total它是一个计数器,您可以使用速率函数来测量错误随时间的平均增长。
  • kubelet_runtime_operations_duration_seconds_bucket:该指标测量每个操作的时间。它对于计算百分位数很有用。

# HELP kubelet_runtime_operations_duration_seconds [ALPHA] Duration in seconds of runtime operations. Broken down by operation type.
# TYPE kubelet_runtime_operations_duration_seconds histogram
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.005"} 837
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.0125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.03125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.078125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.1953125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.48828125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="1.220703125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="3.0517578125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="7.62939453125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="19.073486328125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="47.6837158203125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="119.20928955078125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="298.0232238769531"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="745.0580596923828"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="+Inf"} 840
kubelet_runtime_operations_duration_seconds_sum{operation_type="container_status"} 0.4227565899999999

您可能希望按实例和操作类型计算 Kubelet 运行时操作持续时间的第 99 个百分位数。

histogram_quantile(0.99, sum(rate(kubelet_runtime_operations_duration_seconds_bucket{instance=~".*"}[5m])) by (instance, operation_type, le))

Kubelet 核心指标监控_kubernetes_05

以下指标提供有关Pod 启动率及其持续时间的信息。这些指标可以很好地指示容器运行时的问题。

# HELP kubelet_pod_start_duration_seconds [ALPHA] Duration in seconds for a single pod to go from pending to running.
# TYPE kubelet_pod_start_duration_seconds histogram
pod启动时间(从pending到running)分布, kubelet watch到pod时到pod中contianer都running后, watch各种source channel的pod变更

# HELP kubelet_pod_worker_duration_seconds [ALPHA] Duration in seconds to sync a single pod. Broken down by operation type: create, update, or sync
# TYPE kubelet_pod_worker_duration_seconds histogram
pod状态变化的时间分布, 按照操作类型(create update sync)统计, worker就是kubelet中处理一个pod的逻辑工作单位

# HELP kubelet_pod_worker_start_duration_seconds [ALPHA] Duration in seconds from seeing a pod to starting a worker.
# TYPE kubelet_pod_worker_start_duration_seconds histogram
kubelet watch到pod到worker启动的时间分布

kubelet_pod_start_duration_seconds_count:该指标为您提供了Pod 启动操作的数量

# HELP kubelet_pod_start_duration_seconds [ALPHA] 从 kubelet 首次发现 pod 到 pod 开始运行所用的时长(以秒为单位)

# 类型 kubelet_pod_start_duration_seconds 直方图
kubelet_pod_start_duration_seconds_count 14

 kubelet_pod_worker_duration_seconds_count:单个 Pod 的 创建、同步、更新操作的数量。

# HELP kubelet_pod_worker_duration_seconds [ALPHA] 同步单个 pod 的持续时间(秒)。按操作类型细分:创建、更新或同步

# 类型 kubelet_pod_worker_duration_seconds 直方图
kubelet_pod_worker_duration_seconds_count{operation_type="create"} 21
kubelet_pod_worker_duration_seconds_count{operation_type="sync"} 2424
kubelet_pod_worker_duration_seconds_count{operation_type="update"} 3

kubelet_pod_start_duration_seconds_bucket:该指标为您提供了从 Kubelet 第一次看到 Pod 到 Pod 开始运行所用时间(以秒为单位)的直方图。

# HELP kubelet_pod_start_duration_seconds [ALPHA] 从 kubelet 首次发现 pod 到 pod 开始运行所用的时长(以秒为单位)
# 类型 kubelet_pod_start_duration_seconds 直方图
kubelet_pod_start_duration_seconds_bucket{le="0.005"} 6
kubelet_pod_start_duration_seconds_bucket{le="0.01"} 8
kubelet_pod_start_duration_seconds_bucket{le="0.025"} 8
kubelet_pod_start_duration_seconds_bucket{le="0.05"} 8
kubelet_pod_start_duration_seconds_bucket{le="0.1"} 8
kubelet_pod_start_duration_seconds_bucket{le="0.25"} 8
kubelet_pod_start_duration_seconds_bucket{le="0.5"} 8
kubelet_pod_start_duration_seconds_bucket{le="1"} 12
kubelet_pod_start_duration_seconds_bucket{le="2.5"} 14
kubelet_pod_start_duration_seconds_bucket{le="5"} 14
kubelet_pod_start_duration_seconds_bucket{le="10"} 14
kubelet_pod_start_duration_seconds_bucket{le="+Inf"} 14
kubelet_pod_start_duration_seconds_sum 7.106590537999999
kubelet_pod_start_duration_seconds_count 14

您可以按节点获取 Pod 启动持续时间的第 95 百分位数(秒数)。

histogram_quantile(0.95,sum(rate(kubelet_pod_start_duration_seconds_bucket{instance=~".*"}[5m])) by (instance, le))

kubelet_pod_worker_duration_seconds_bucket:此指标提供同步 Pod 所需的时间(以秒为单位)。信息分为三种不同类型:创建、更新和同步。

# HELP kubelet_pod_worker_duration_seconds [ALPHA] 同步单个 pod 的持续时间(秒)。按操作类型细分:创建、更新或同步
# 类型 kubelet_pod_worker_duration_seconds 直方图
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.005"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.01"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.025"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.05"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.1"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.25"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.5"} 4
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="1"} 8
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="2.5"} 9
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="5"} 9
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="10"} 21
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="+Inf"} 21
kubelet_pod_worker_duration_seconds_sum{operation_type="create"} 80.867455331
kubelet_pod_worker_duration_seconds_count{operation_type="create"} 21

检查 Kubelet Pod 工作器持续时间指标的百分位数也是值得的,这样您将更好地了解不同操作在所有节点上的执行情况。

histogram_quantile(0.99, sum(rate(kubelet_pod_worker_duration_seconds_bucket{instance=~".*"}[5m])) by (instance, operation_type, le))

Kubelet 核心指标监控_bc_06

举报

相关推荐

0 条评论