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 及其工作负载。
如果遇到 Kubernetes Kubelet 的问题,那么采取行动并尽快解决问题非常重要,否则 Kubernetes 节点将进入一种NotReady
状态。借助其开箱即用的指标工具,您可以监控 Kubelet,但有大量指标!您应该查看其中哪些?
如果您想了解有关如何监控 Kubelet 以及最重要的 Kubelet 指标的更多信息,请继续阅读并了解如何做好准备以避免中断。
什么是 Kubelet?
Kubernetes 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-server
Pod。
$ 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))