ブログ

Kubeletをモニタリングする方法

Kubeletをモニタリングする方法

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

Kubernetesを運用環境で実行する場合は、Kubeletのモニタリングが重要です。

KubeletはKubernetesのコントロールプレーン内の非常に重要なサービスです。ポッドによってデプロイされたコンテナがノードで実行されていることの面倒を見るコンポーネントです。 Kubeletは、PodSpecを受け取り、現在の状態が目的のポッドと一致することを保証することにより、宣言的な方法で動作します。

Kubeletは、Kubernetesエンティティとしてではなく、ノード内のホストOS上で実行される唯一のコンポーネントであるため、他のコントロールプレーンコンポーネントといくつかの違いがあります。 これにより、kubeletのモニタリングは少し特別になりますが、Prometheusサービスディスカバリー(ノード)に依拠できます。

a01.png

Kubeletからメトリクスを取得する

Kubeletは装備されており、デフォルトでホストのポート10255でPrometheusメトリクスを公開し、ポッドボリュームと内部操作に関する情報を提供します。このエンドポイントは簡単にスクレイピングでき、追加のスクリプトやエクスポーターを必要とせずに有用な情報を取得できます。

認証なしでノードのポートに直接アクセスしてKubeletメトリクスをスクレイピングできます。

curl  http://[Node_Internal_IP]:10255/metrics

コンテナがホストネットワークにアクセスできる場合は、localhostを使用してもアクセスできます。ポートとアドレスは、特定の構成によって異なる場合があることに注意してください。

この構造を持つメトリクスのロングリストを返します(省略):

# HELP apiserver_audit_event_total 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 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 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
...

KubeletをスクレイプするようにPrometheusを構成する場合、このジョブをターゲットに追加できます。

 - job_name: 'kubernetes-nodes'
    kubernetes_sd_configs:
      - role: node
    relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      # Only for Kubernetes ^1.7.3.
      # See: https://github.com/prometheus/prometheus/issues/2916
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
      metric_relabel_configs:
        - action: replace
          source_labels: [id]
          regex: '^/machine\.slice/machine-rkt\\x2d([^\\]+)\\.+/([^/]+)\.service$'
          target_label: rkt_container_name
          replacement: '${2}-${1}'
        - action: replace
          source_labels: [id]
          regex: '^/system\.slice/(.+)\.service$'
          target_label: systemd_service_name
          replacement: '${1}'

独自のラベルと再ラベル付け構成をカスタマイズできます。

Kubeletのモニター:何を探すべきですか?

免責事項:KubeletメトリックはKubernetesバージョン間で異なる場合があります。ここでは、Kubernetes 1.15を使用しました。 Kubernetesリポジトリ(1.15.3バージョンのリンク)で使用可能なバージョンのメトリクスを確認できます。

kubeletインスタンスの数:この値は、ノード内のkubeletの一般的な健全性を示します。期待される値は、クラスター内のノードの数です。Prometheusによって検出されたターゲットをカウントするこの値を取得するか、ノードへの低レベルのアクセス権がある場合はプロセスを確認します。

単一の統計グラフに対して可能なPromQLクエリは次のとおりです。

sum(up{job=\"kubernetes-nodes\"})

実行中のポッドとコンテナの数:Kubeletは、ノードで実際に実行されているポッドとコンテナの数に関する洞察を提供します。この値をKubernetesが予想または報告する値と確認して、ノードで発生する可能性のある問題を検出できます。

# HELP kubelet_running_pod_count Number of pods currently running
# TYPE kubelet_running_pod_count gauge
kubelet_running_pod_count 9
# HELP kubelet_running_container_count Number of containers currently running
# TYPE kubelet_running_container_count gauge
kubelet_running_container_count 9

ボリュームの数:システムでは、kubeletはコントローラーによって示されたボリュームをマウントして、それらに関する情報を提供できるようにします。これは、ポッドがstatefulSetで再作成されたときにマウントされていないボリュームの問題を診断するのに役立ちます。一緒に表すことができる2つのメトリクスを提供します。 必要なボリュームの数と実際にマウントされたボリュームの数:

# HELP volume_manager_total_volumes 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"} 1
volume_manager_total_volumes{plugin_name="kubernetes.io/configmap",state="desired_state_of_world"} 1
volume_manager_total_volumes{plugin_name="kubernetes.io/empty-dir",state="actual_state_of_world"} 1
volume_manager_total_volumes{plugin_name="kubernetes.io/empty-dir",state="desired_state_of_world"} 1
volume_manager_total_volumes{plugin_name="kubernetes.io/host-path",state="actual_state_of_world"} 55
volume_manager_total_volumes{plugin_name="kubernetes.io/host-path",state="desired_state_of_world"} 55
volume_manager_total_volumes{plugin_name="kubernetes.io/secret",state="actual_state_of_world"} 4
volume_manager_total_volumes{plugin_name="kubernetes.io/secret",state="desired_state_of_world"} 4

これらの2つの値の違い(一時的なフェーズ以外)は、問題の良い指標になります。

構成エラー:このメトリクスは、ノードの構成エラーのフラグとして機能します。

# HELP kubelet_node_config_error This metric is true (1) if the node is experiencing a configuration-related error, false (0) otherwise.
# TYPE kubelet_node_config_error gauge
kubelet_node_config_error 0

kubeletによって実行されるすべてのオペレーションのゴールデンシグナル(オペレーションレート、オペレーションエラー率、オペレーション時間)。 サチレーションは、システムメトリクスで測定できます。Kubeletは、デーモンによって実行される操作の詳細情報を提供します。 使用できるメトリクスは次のとおりです。

kubelet_runtime_operations_total:各タイプのランタイムオペレーションの総数

# HELP kubelet_runtime_operations_total Cumulative number of runtime operations by operation type.
# TYPE kubelet_runtime_operations_total counter
kubelet_runtime_operations_total{operation_type="container_status"} 225
kubelet_runtime_operations_total{operation_type="create_container"} 44
kubelet_runtime_operations_total{operation_type="exec"} 5
kubelet_runtime_operations_total{operation_type="exec_sync"} 1.050273e+06
...

kubelet_runtime_operations_errors_total:オペレーションのエラーの数。これは、コンテナランタイムの問題など、ノード内の低レベルの問題を示す良い指標になります。

# HELP kubelet_runtime_operations_errors_total Cumulative number of runtime operation errors by operation type.
# TYPE kubelet_runtime_operations_errors_total counter
kubelet_runtime_operations_errors_total{operation_type="container_status"} 18
kubelet_runtime_operations_errors_total{operation_type="create_container"} 1
kubelet_runtime_operations_errors_total{operation_type="exec_sync"} 7

kubelet_runtime_operations_duration_seconds_bucket:オペレーションの間隔時間。 パーセンタイルの計算に役立ちます。

# HELP kubelet_runtime_operations_duration_seconds 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"} 194
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.01"} 207
...

ポッドのスタートレートと間隔時間:これは、コンテナのランタイムまたはイメージへのアクセスの問題を示している可能性があります。

kubelet_pod_start_duration_seconds_count:ポッドスタートオペレーションの数

# HELP kubelet_pod_start_duration_seconds Duration in seconds for a single pod to go from pending to running.
# TYPE kubelet_pod_start_duration_seconds histogram
...
kubelet_pod_worker_duration_seconds_count{operation_type="sync"} 196
...

kubelet_pod_worker_duration_seconds_count:

# HELP kubelet_pod_worker_duration_seconds 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="sync"} 196
...

kubelet_pod_start_duration_seconds_bucket:

# HELP kubelet_pod_worker_duration_seconds 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_start_duration_seconds_bucket{operation_type="sync",le="0.005"} 194
kubelet_pod_start_duration_seconds_bucket{operation_type="sync",le="0.01"} 195
...

Kubelet_pod_worker_duration_seconds_bucket:

# HELP kubelet_pod_worker_duration_seconds 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="sync",le="0.005"} 194
kubelet_pod_worker_duration_seconds_bucket{operation_type="sync",le="0.01"} 195
...

ストレージゴールデンシグナル(オペレーションレート、エラーレート、および間隔時間)

storage_operation_duration_seconds_count:

# HELP storage_operation_duration_seconds Storage operation duration
# TYPE storage_operation_duration_seconds histogram
...
storage_operation_duration_seconds_count{operation_name="verify_controller_attached_volume",volume_plugin="kubernetes.io/configmap"} 16
...

storage_operation_errors_total:

# HELP storage_operation_errors_total Storage errors total
# TYPE storage_operation_errors_total counter
storage_operation_errors_total { volume_plugin = "aws-ebs", operation_name = "volume_attach" } 0
storage_operation_errors_total { volume_plugin = "aws-ebs", operation_name = "volume_detach" } 0

storage_operation_duration_seconds_bucket:

# HELP storage_operation_duration_seconds Storage operation duration
# TYPE storage_operation_duration_seconds histogram
storage_operation_duration_seconds_bucket{operation_name="verify_controller_attached_volume",volume_plugin="kubernetes.io/configmap",le="0.1"} 16
storage_operation_duration_seconds_bucket{operation_name="verify_controller_attached_volume",volume_plugin="kubernetes.io/configmap",le="0.25"} 16
...

Cgroupマネージャーの稼働率と間隔時間

kubelet_cgroup_manager_duration_seconds_count:

# HELP kubelet_cgroup_manager_duration_seconds Duration in seconds for cgroup manager operations. Broken down by method.
# TYPE kubelet_cgroup_manager_duration_seconds histogram
...
kubelet_cgroup_manager_duration_seconds_count{operation_type="create"} 28
...

kubelet_cgroup_manager_duration_seconds_bucket:

# HELP kubelet_cgroup_manager_duration_seconds 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="create",le="0.005"} 11
kubelet_cgroup_manager_duration_seconds_bucket{operation_type="create",le="0.01"} 21
...

ポッドライフサイクルイベントジェネレーター(PLEG):relistレート、relistインターバル、relist間隔時間。これらの値のエラーまたは過度の遅延は、ポッドのKubernetesステータスに問題を引き起こす可能性があります。

kubelet_pleg_relist_duration_seconds_count:

# HELP kubelet_pleg_relist_duration_seconds Duration in seconds for relisting pods in PLEG.
# TYPE kubelet_pleg_relist_duration_seconds histogram
...
kubelet_pleg_relist_duration_seconds_count 5.344102e+06
...

kubelet_pleg_relist_interval_seconds_bucket:

# HELP kubelet_pleg_relist_interval_seconds 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_duration_seconds_bucket:

# HELP kubelet_pleg_relist_duration_seconds Duration in seconds for relisting pods in PLEG.
# TYPE kubelet_pleg_relist_duration_seconds histogram
kubelet_pleg_relist_duration_seconds_bucket{le="0.005"} 2421
kubelet_pleg_relist_duration_seconds_bucket{le="0.01"} 4.335858e+06
...

Kubeletにおける問題の例

ポッドが起動していません。

これは通常、以下で実行されているコンテナランタイムへの接続に問題があるKubeletの兆候です。ポッドスタートレートと継続時間のメトリクスを確認して、コンテナを作成する際に遅延があるかどうか、または実際に開始されているかどうかを確認します。

ノードは新しいポッドをスケジュールしていないようです。

Kubeletジョブ番号を確認してください。 Kubeletがノードで死亡し、ポッドをスケジュールできない可能性があります。

Kubernetesは実行速度が遅いようです。

Kubeletメトリクスのすべてのゴールデンシグナルを確認します。 ストレージ、コンテナランタイムエンジンとの通信遅延、または負荷の問題に問題がある可能性があります。

Sysdig Monitorを用いたKubeletメトリクスのモニタリング

Sysdig MonitorでKubeletを追跡するには、エージェントのyaml設定ファイルにいくつかのセクションを追加する必要があります。

#Enable prometheus metrics
metrics_filter:
 # beginning of kubelet
  - include: "kubelet_running_pod_count"
  - include: "kubelet_running_container_count"
  - include: "volume_manager_total_volumes"
  - include: "kubelet_node_config_error"
  - include: "kubelet_runtime_operations_total"
  - include: "kubelet_runtime_operations_errors_total"
  - include: "kubelet_runtime_operations_duration_seconds*"
  - include: "kubelet_pod_start_duration_seconds*"
  - include: "kubelet_pod_worker_duration_seconds*"
  - include: "storage_operation_duration_seconds*"
  - include: "storage_operation_errors_total*"
  - include: "kubelet_cgroup_manager_duration_seconds*"
  - include: "kubelet_pleg_relist_duration_seconds*"
  - include: "kubelet_pleg_relist_interval_seconds*"
  - include: "rest_client_requests_total*"
  - include: "rest_client_request_latency_seconds*"
  - include: "go_goroutines"
  # end of kubelet
prometheus:
    enabled: true
    histograms: true
    max_metrics: 3000
    max_metrics_per_process: 3000
    process_filter:
      - include:
          process.name: kubelet
          port: 10255
          conf:
            tags:
              kubernetes.component.name: kubelet
            host: 127.0.0.1
            port: 10255
            use_https: false

metrics_filter部分を使用すると、メトリクスの制限に達した場合にこれらのメトリクスが破棄されないようにします。 次のように、このリストにないAPIサーバーが提供する他のメトリクスを追加できます。

metrics_filter:
    - include: "kubelet_running_pod_count"
    ...
    - include: "go_goroutines"

次に、Sysdigエージェントがメトリクスをスクレイピングするように設定し、システムでkubeletと呼ばれるプロセスを検索し、ポート10255を介してローカルホストでスクレイピングします。httpsを使用する必要はありません。

その後、これらのメトリクスを使用してカスタムダッシュボードを構築できます。 Sysdig Monitorは、プレビルドのダッシュボードも持っています。

a02.png

まとめ

Kubeletのモニタリングは、クラスター操作の重要な部分であるため、基本です。 コンテナランタイムとの通信はすべてKubeletを介して行われることを忘れないでください。Kubernetesと背後で実行されているOS間の接続です。

Kubernetesクラスターのランダムな問題の一部は、Kubeletの問題で説明できます。kubeletメトリクスをモニタリングすることで、これらの問題が発生したときの時間を節約できます。

Sysdigは、Kubernetesモニタリングのベストプラクティスに従うのに役立ちます。これは、クラスター内で実行されるワークロードとアプリケーションをモニタリングするのと同じくらい重要です。コントロールプレーンをモニタリングすることを忘れないでください!

最近の投稿

カテゴリー

アーカイブ

ご質問・お問い合わせはこちら

top