Kubeletを監視する方法

By 清水 孝郎 - NOVEMBER 24, 2022

SHARE:

本文の内容は、2022年11月23日にVICTOR HERNANDOが投稿したブログ(https://sysdig.com/blog/how-to-monitor-kubelet/)を元に日本語に翻訳・再構成した内容となっております。

Kubernetesを本番環境で運用する場合、Kubeletの監視は欠かせません。Kubeletは、Kubernetesクラスター内の非常に重要なサービスです。

このKubernetesコンポーネントは、Podで定義されたコンテナが実行され、健全であることを保証する役割を担っています。スケジューラがPodを実行するノードを指定するとすぐに、Kubeletはその割り当てを受け、Podとそのワークロードを実行します。

How to monitor Kubelet featured image

Kubernetes Kubeletで問題に直面した場合、できるだけ早く対処して問題を解決することが本当に重要で、そうしないとKubernetesノードがNotReady状態になってしまいます。アウトオブボックスで提供されるメトリクス計測のおかげで、Kubeletを監視することができますが、メトリクスは大量にあります! このうちどれを見直せばいいのでしょうか?

Kubeletを監視する方法と、最も重要なKubeletメトリクスが何であるかを知りたい場合は、読み続けて、障害を回避するためにどのように準備できるかを発見してください。

Kubeletとは何ですか?

Kubernetes Kubeletは、コントロールプレーンとワーカーノードの両方で、すべてのノードのプライマリノードエージェントとして実行されます。

In this diagram you'll easily spot where the Kubelet is running. It is a component running in both control plane and worker nodes.
この図では、Kubeletがどこで動作しているかがすぐにわかると思います。これは、コントロールプレーンとワーカーノードの両方で動作するコンポーネントです。

Kubelet は宣言的な方法で動作し、PodSpec を受け取り、そこで定義されたコンテナが現在実行中で、健全な状態であることを確認します。その性質上、OS自体のサービスとして動作するエージェントであるため、クラスター内でKubernetesのエンティティとして動作する他のコンポーネントとは大きく異なっています。

Kubeletサービスは、恒久的に稼働している必要があります。こうすることで、特定のノードでPodが実行されるようにスケジュールされると同時に、Kubernetes APIから新しいPodSpecの定義を取得することができるようになります。Kubeletが正常に動作していない、クラッシュした、または何らかの理由でダウンした場合、Kubernetesノードは NotReady 状態になり、そのノードで新しいPodが作成されることはありません。

また、Kubeletがダウンしている時や正常に動作していない時の注意点として、 Liveness Readiness のプローブが実行されないため、Kubeletダウン時にPod上で既に動作しているワークロードに障害が発生したり正常に動作しない場合、再起動されず、当該アプリケーションの安定性や可用性、性能に影響が出ることが挙げられます。

Kubeletの監視方法

Prometheusのノードロールは、クラスタノードごとに1つのターゲットを検出し、アドレスはKubeletのHTTPポートにデフォルトで設定されるので、PrometheusインスタンスからKubeletメトリクスをスクレイピングする方法として、このPrometheusロールに依存することは可能です。

Kubeletはインストルメント化されており、デフォルトでポート10250を通じて/metricsエンドポイントを公開し、Podsのボリュームや内部操作に関する情報を提供します。このエンドポイントは簡単にスクレイピングでき、必要な証明書を使用してHTTPSプロトコルでエンドポイントにアクセスする必要があるだけです。

Kubeletのメトリクスを取得したり、ノード自体にアクセスしたり、Podにsshしたりするために、このサービスは 0.0.0.0 アドレスでリスニングしているので、接続性という意味では全く制約がありません。Podがホストネットワークにアクセスできる場合は、 localhost も使ってアクセスできます。

$ curl -k -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://192.168.119.30:10250/metrics
# HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend.
# TYPE apiserver_audit_event_total counter
apiserver_audit_event_total 0
# HELP apiserver_audit_requests_rejected_total [ALPHA] Counter of apiserver requests rejected due to an error in audit logging backend.
# TYPE apiserver_audit_requests_rejected_total counter
apiserver_audit_requests_rejected_total 0
# HELP apiserver_client_certificate_expiration_seconds [ALPHA] Distribution of the remaining lifetime on the certificate used to authenticate a request.
# TYPE apiserver_client_certificate_expiration_seconds histogram
apiserver_client_certificate_expiration_seconds_bucket{le="0"} 0
apiserver_client_certificate_expiration_seconds_bucket{le="1800"} 0

(output truncated)

PrometheusインスタンスでKubeletメトリクスエンドポイントをスクレイピングしたい場合は、 prometheus.yml 設定ファイルのscrape_configs セクションに以下の設定を追加すればOKです。

- 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 メトリクスについて説明しましょう。

免責事項:Kubeletメトリクスは、Kubernetesのバージョンによって異なる場合があります。ここでは、Kubernetes 1.25を使用しました。Kubeletで利用できる最新のメトリクスは、Kubernetes GitHub repoで確認できます。
Number of Kubelet instancesここでは、Kubernetesクラスターで稼働しているKubeletインスタンスの数を簡単にカウントする方法が紹介されています。 kubelet_node_name  メトリクスを合計するだけです。このPromQLクエリーの期待値は、クラスターのノード数です。

sum(kubelet_node_name)

 Ready ノードの数をカウントする別の方法です:
注:Readyでないノードの数を取得したい場合は、 status="false"でフィルタリングしてください。

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

kubelet_running_podsKubeletは、ノードで稼働している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このメトリクスは前のものとよく似ていますが、各ノードのコンテナ数をカウントしています。情報は、3つの異なる container_state:created、exited、runningに分類されます。このメトリクスを使用して、各ノードで実行されているコンテナの数を把握し、セットアップに基づいてコンテナの数が期待通りであるかどうかを測定します。

# 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_volumesKubeletは、コントローラーが示すボリュームをマウントするため、そのボリュームに関する情報を提供することができます。このメトリクスは、Podの作成時にマウントされていないボリュームの問題を特定し、診断するのに便利です。各 plugin_name は desired_state_of_world と actual_state_of_world という 2 つの異なる state フィールドを提供します。そうすれば、両方の値が混在していても、簡単に不一致を探すことができます。

# HELP volume_manager_total_volumes [ALPHA] Number of volumes in Volume Manager
# TYPE volume_manager_total_volumes gauge
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

以下、Kubeletが実行した各操作のGolden Signalsメトリクス(kubelet_runtime_operations_total, kubelet_runtime_operations_errors_total, and 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, etc)を提供します。

# HELP kubelet_runtime_operations_total [ALPHA] Cumulative number of runtime operations by operation type.
# TYPE kubelet_runtime_operations_total counter
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

これはカウンターのメトリクスですが、rate関数を使ってKubeletのランタイムオペレーションの平均増加率を計算することができます。

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

You can use the rate function to calculate the average increase rate for Kubelet runtime operations
Kubelet実行時操作の平均増加率を計算するためにrate関数を使用できます。

kubelet_runtime_operations_errors_total:ランタイムレベルのオペレーションで発生したエラーの数。コンテナランタイムの問題など、ノードの低レベルの問題を示す指標となりえます。先ほどのメトリクスと同様に、kubelet_runtime_operation_errors_total はカウンタなので、rate関数を使用してエラーの平均増加量を時系列で測定することができます。

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))

Use this query to show the 99th percentile of Kubelet runtime operations duration
このクエリーを使用して、Kubelet実行時操作期間の99パーセンタイルを表示します。

次のメトリクスは、Podの開始率とその持続時間に関する情報を提供します。これらのメトリクスは、コンテナランタイムの問題の良い指標となり得ます。

kubelet_pod_start_duration_seconds_countこのメトリクスは、Pod の開始操作に関するカウントを提供します。
# HELP kubelet_pod_start_duration_seconds [ALPHA] Duration in seconds from kubelet seeing a pod for the first time to the pod starting to run
# TYPE kubelet_pod_start_duration_seconds histogram
kubelet_pod_start_duration_seconds_count 14

kubelet_pod_worker_duration_seconds_count1つの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
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] Duration in seconds from kubelet seeing a pod for the first time to the pod starting to run
# TYPE kubelet_pod_start_duration_seconds histogram
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を同期するのにかかる時間を秒単位で提供します。情報は、作成、更新、同期の3種類に分かれています。
# 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
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))

Get percentiles for the Kubelet pod worker duration metric
KubeletのPodワーカーの継続時間メトリクスに対するパーセンタイルの取得

Storage Golden Signalsのメトリクスになります:


storage_operation_duration_seconds_count:  volume_plugin 毎のストレージ操作の回数。
# HELP storage_operation_duration_seconds [ALPHA] Storage operation duration
# TYPE storage_operation_duration_seconds histogram
storage_operation_duration_seconds_count{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap"} 5
storage_operation_duration_seconds_count{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/downward-api"} 1
storage_operation_duration_seconds_count{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/empty-dir"} 2
storage_operation_duration_seconds_count{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/host-path"} 45
storage_operation_duration_seconds_count{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/projected"} 8
storage_operation_duration_seconds_count{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/secret"} 3
(output truncated)

ストレージの操作率を取得するためには、以下のクエリーを使用します。実行されたさまざまな操作の概要、各操作のステータス、関連するボリュームプラグインを取得します。
sum(rate(storage_operation_duration_seconds_count{instance=~".*"}[5m])) by (instance, operation_name, volume_plugin, status)

Use this query to get the storage operations rate. Get information about status, volume plugin and the operation performed
このクエリーを使用して、ストレージ操作のレートを取得します。ステータス、ボリュームプラグイン、実行された操作の情報を取得します。

storage_operation_duration_seconds_bucket各ストレージ操作の継続時間(秒)を測定します。この情報はヒストグラムで表現されます。
# HELP storage_operation_duration_seconds [ALPHA] Storage operation duration
# TYPE storage_operation_duration_seconds histogram
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="0.1"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="0.25"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="0.5"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="1"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="2.5"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="5"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="10"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="15"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="25"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="50"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="120"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="300"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="600"} 5
storage_operation_duration_seconds_bucket{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap",le="+Inf"} 5
storage_operation_duration_seconds_sum{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap"} 0.012047289
storage_operation_duration_seconds_count{migrated="false",operation_name="verify_controller_attached_volume",status="success",volume_plugin="kubernetes.io/configmap"} 5
(output truncated)

今度は、インスタンス、操作名、ボリュームプラグインでグループ化されたストレージ操作期間の99パーセンタイルを取得したい場合があります。
histogram_quantile(0.99, sum(rate(storage_operation_duration_seconds_bucket{instance=~".*"}[5m])) by (instance, operation_name, volume_plugin, le))

では、Kubelet cgroup managerのメトリクスについて説明していきましょう。

kubelet_cgroup_manager_duration_seconds_bucketこのメトリクスは、cgroupマネージャー操作の継続時間(秒)を提供します。このデータは、破壊と更新の 2 種類の方法に分かれています。
# HELP kubelet_cgroup_manager_duration_seconds [ALPHA] Duration in seconds for cgroup manager operations. Broken down by method.
# TYPE kubelet_cgroup_manager_duration_seconds histogram
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="0.005"} 3
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="0.01"} 6
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="0.025"} 9
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="0.05"} 9
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="0.1"} 9
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="0.25"} 9
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="0.5"} 9
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="1"} 9
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="2.5"} 9
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="5"} 9
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="10"} 9
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="destroy",le="+Inf"} 9
kubelet_cgroup_manager_duration_seconds_sum{operation_type="destroy"} 0.09447291900000002
kubelet_cgroup_manager_duration_seconds_count{operation_type="destroy"} 9
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="0.005"} 542
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="0.01"} 558
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="0.025"} 561
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="0.05"} 561
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="0.1"} 561
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="0.25"} 561
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="0.5"} 561
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="1"} 561
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="2.5"} 561
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="5"} 561
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="10"} 561
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="update",le="+Inf"} 561
kubelet_cgroup_manager_duration_seconds_sum{operation_type="update"} 1.2096012159999996
kubelet_cgroup_manager_duration_seconds_count{operation_type="update"} 561

Kubelet cgroup manager の操作の 99 パーセンタイルを表すヒストグラムを取得する方法を見てみましょう。このクエリーは、Kubelet cgroup操作タイプごとの持続時間をよりよく理解するのに役立ちます。
histogram_quantile(0.99, sum(rate(kubelet_cgroup_manager_duration_seconds_bucket{instance=~".*"}[5m])) by (instance, operation_type, le))

kubelet_cgroup_manager_duration_seconds_count先ほどのメトリクスと同様、今回はdestroyとupdateの操作回数をカウントしています。

最後に、Kubeletが提供するPLEGメトリクスについて説明します。PLEG(Pod Lifecycle Event Generator)は、コンテナの実行時状態を調整する役割を担うKubeletのモジュールです。このタスクを達成するために、コンテナの変更を発見するための定期的なリスティングに依存しています。これらのメトリクスは、コンテナ実行時のレイテンシーでエラーが発生しているかどうかを判断するのに役立ちます。

kubelet_pleg_relist_interval_seconds_bucketこのメトリクスは、PLEGにおける再リスト化操作の間隔を秒単位でヒストグラムにしたものです。

# HELP kubelet_pleg_relist_interval_seconds [ALPHA] Interval in seconds between relisting in PLEG.
# TYPE kubelet_pleg_relist_interval_seconds histogram
kubelet_pleg_relist_interval_seconds_bucket{le="0.005"} 0
kubelet_pleg_relist_interval_seconds_bucket{le="0.01"} 0
kubelet_pleg_relist_interval_seconds_bucket{le="0.025"} 0
kubelet_pleg_relist_interval_seconds_bucket{le="0.05"} 0
kubelet_pleg_relist_interval_seconds_bucket{le="0.1"} 0
kubelet_pleg_relist_interval_seconds_bucket{le="0.25"} 0
kubelet_pleg_relist_interval_seconds_bucket{le="0.5"} 0
kubelet_pleg_relist_interval_seconds_bucket{le="1"} 0
kubelet_pleg_relist_interval_seconds_bucket{le="2.5"} 10543
kubelet_pleg_relist_interval_seconds_bucket{le="5"} 10543
kubelet_pleg_relist_interval_seconds_bucket{le="10"} 10543
kubelet_pleg_relist_interval_seconds_bucket{le="+Inf"} 10543
kubelet_pleg_relist_interval_seconds_sum 10572.44356430006
kubelet_pleg_relist_interval_seconds_count 10543

Kubeletの再リスト化PLEG操作の間隔の99パーセンタイルを取得することができます。
histogram_quantile(0.99, sum(rate(kubelet_pleg_relist_interval_seconds_bucket{instance=~".*"}[5m])) by (instance, le))

With this histogram you can get an overview of the interval in seconds between relisting PLEG operationsこのヒストグラムでは、PLEG操作の再リスト化の間隔を秒単位で概観することができます。

kubelet_pleg_relist_duration_seconds_bucketPLEGでPodを再リスト化する際の秒数です。

# HELP kubelet_pleg_relist_duration_seconds [ALPHA] Duration in seconds for relisting pods in PLEG.
# TYPE kubelet_pleg_relist_duration_seconds histogram
kubelet_pleg_relist_duration_seconds_bucket{le="0.005"} 10222
kubelet_pleg_relist_duration_seconds_bucket{le="0.01"} 10491
kubelet_pleg_relist_duration_seconds_bucket{le="0.025"} 10540
kubelet_pleg_relist_duration_seconds_bucket{le="0.05"} 10543
kubelet_pleg_relist_duration_seconds_bucket{le="0.1"} 10543
kubelet_pleg_relist_duration_seconds_bucket{le="0.25"} 10544
kubelet_pleg_relist_duration_seconds_bucket{le="0.5"} 10544
kubelet_pleg_relist_duration_seconds_bucket{le="1"} 10544
kubelet_pleg_relist_duration_seconds_bucket{le="2.5"} 10544
kubelet_pleg_relist_duration_seconds_bucket{le="5"} 10544
kubelet_pleg_relist_duration_seconds_bucket{le="10"} 10544
kubelet_pleg_relist_duration_seconds_bucket{le="+Inf"} 10544
kubelet_pleg_relist_duration_seconds_sum 22.989806126000055
kubelet_pleg_relist_duration_seconds_count 10544

今回は、Kubelet PLEGの再リスト化操作の99パーセンタイルを表すヒストグラムをビルドする方法を確認しましょう。

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

Use this query to build a histogram representing the 99th percentile of Kubelet PLEG relisting operations
このクエリーを使用して、Kubelet PLEGの再リスト化操作の99パーセンタイルを表すヒストグラムを構築します。

kubelet_pleg_relist_duration_seconds_countPLEGの再リスティング操作の回数。

まとめ

Kubeletは、Kubernetesの重要なコンポーネントです。この要素は、各ノードのコンテナランタイムと通信する役割を担っています。Kubeletが応答しない、クラッシュした、何らかの理由でダウンした場合、ノードは NotReady 状態になって新しいPodを起動できなくなり、コンテナレベルで何か問題が発生すると既存のPodの再作成に失敗してしまうでしょう。

そのため、Kubeletとは何か、Kubernetesにおけるその役割だけでなく、Kubeletをどのように監視するか、確認すべき最も重要なメトリクスは何かを理解することが非常に重要です。今回は、その両側面について学んでいただきました。すべての仕組みを確認し、今すぐKubeletの問題を予防するために積極的に行動しましょう!

Kubeletの監視と問題のトラブルシューティングを最大10倍高速化

Sysdigは、Sysdig Monitorに含まれるアウトオブボックスのダッシュボードを使用して、KubeletやKubernetesコントロールプレーンの他の部分の問題の監視とトラブルシューティングを支援することができます。Sysdig Monitorに統合されたツールであるAdvisorは、Kubernetesクラスタとそのワークロードのトラブルシューティングを最大10倍まで加速させます。


30日間のトライアルアカウントにサインアップして、ご自身でお試しください!

https://youtu.be/2mbq9DxrsH4