自学内容网 自学内容网

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 特色图片

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

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

什么是 Kubelet?

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

在此图中,您可以轻松找到 Kubelet 的运行位置。它是在控制平面和工作节点中运行的组件。

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

现在,您将看到 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_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))

以下指标提供有关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))


原文地址:https://blog.csdn.net/qq_34556414/article/details/142379031

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!