Kubernetes監視

クラスター、ワークロード、スパンを一画面で

Helmチャートを1つインストールするだけ。kubelet、ホスト、kube-stateメトリクスがOTLPで流れ込みます。OpenTelemetry Operatorがアプリのスパンにpod情報を注入するため、遅いリクエストから実際に処理したレプリカへ直接到達できます。

動き

遅いスパンの下にあるPod。

クラスタにHelmチャートを導入するだけ。kubelet、ホスト、kube-stateのメトリクスがOTLPで流れ込み、OpenTelemetry Operatorが全スパンにPodとノードのIDを刻みます。

pod heatmap · 192 pods · cluster cpu 44% LIVE
PODS 192
RUNNING 184
DEGRADED 6
FAILING 2
HOT >78% 11
default default 72
observability obs 32
kube-system kube-sys 40
ingress-nginx ingress 24
data data 24
CPU
0% 100% degraded failing

クラスターコンソール

ワークロード、Pod、ノード — 1つのフィルターサイドバー

プラットフォームチームが日々使うのと同じビュー。namespace内のdeploymentから特定nodeまで絞り込み、クラスター全体をライブで監視。

cluster: prod-us-east-1 LIVE
infra › kubernetes › workloads
過去12時間 再読み込み ライブ 10s
Nodes 12
Workloads 8
Cluster CPU 42%
Cluster MEM 54%

ワークロード

deployment、statefulset、daemonsetごとに集約されたPodメトリクス。

Deployment StatefulSet DaemonSet
Namespace Workload Kind Ready CPU Memory Node
default api-gateway Deployment 3/3
47%
62%
ip-10-0-1-12
default order-service Deployment 4/4
71%
51%
ip-10-0-1-44
default checkout-worker StatefulSet 2/2
23%
38%
ip-10-0-2-08
observability otel-collector DaemonSet 6/6
39%
48%
per-node
default payment-svc Deployment 2/3
86%
67%
ip-10-0-1-44
default inventory-svc Deployment 3/3
34%
49%
ip-10-0-2-08
kube-system coredns Deployment 2/2
12%
21%
ip-10-0-1-12
ingress-nginx nginx-ingress DaemonSet 3/3
28%
33%
per-node

3つのビュー

Pod、ノード、ワークロード — ファーストクラス

どこでも同じフィルター。ワークロードからそのPod、そのPodを実行するノードへとクリックスルー。

/infra/kubernetes/pods 200 pods

Pods

Podごとのリクエスト・リミット比CPU・メモリ。

Pod CPU req CPU lim Mem lim
otel-gateway-5988fb47f… ns observability 147% 37% 30%
prd-artifacts-api-6688… ns default 0% 52% 10%
prd-warpstream-5bb84bb… ns warpstream 42% 42% 35%
prd-enrichment-api-769… ns default 0% 34% 21%
/infra/kubernetes/nodes 3 nodes

Nodes

ノードごとのkubeletスタッツ、稼働時間、ライフサイクル。

Node Status CPU Last seen
i-0ef7f77feb3e0a3eb 稼働中 3.00 14s ago
i-0293a9e7e2bac82a4 稼働中 2.65 30s ago
i-0a8c19f2d4e7b15c1 稼働中 1.84 22s ago
 
/infra/kubernetes/workloads 21 workloads

Workloads

deployment、statefulset、daemonsetごとに集約。

Workload Pods Avg CPU NS
api-gateway 3 47% default
order-service 4 71% default
payment-svc 2 86% default
inventory-svc 3 34% default

Span → Pod

遅いSpanから正確なPodへ

OpenTelemetry Operatorがadmission時にすべてのSpanにk8s.pod.name、k8s.node.name、k8s.namespace.nameをスタンプ。遅いトレースは既にどこで実行されたかを知っています。

Trace: 7af1c204 1.18s

Waterfall

api-gateway
POST /checkout
1.18s
order-service
createOrder
425ms
payment-svc
processPayment
612ms
inventory-svc
reserveItems
98ms
Podアトリビューション 稼働中

pod

payment-svc-78f4d6c89b-x7k2p

k8s.pod.name
payment-svc-78f4d6c89b-x7k2p
k8s.node.name
ip-10-0-1-44.ec2.internal
k8s.namespace.name
default

1つのHelmチャート

クラスターに投入するだけ

チャートを端から端まで読める。3つのコマンドで、kubelet、ホスト、kube-stateメトリクスがOTLP経由で流れ始めます。

helm install maple-k8s-infra 3 steps
1 インジェストキーのシークレットを作成
kubectl create namespace maple
kubectl -n maple create secret generic maple-ingest-key \
  --from-literal=ingest-key=$MAPLE_INGEST_KEY
2 チャートをインストール
helm upgrade --install maple-k8s-infra \
  oci://ghcr.io/makisuo/charts/maple-k8s-infra \
  --namespace maple \
  --set maple.ingestKey.existingSecret.name=maple-ingest-key \
  --set maple.ingestKey.existingSecret.key=ingest-key \
  --set global.clusterName=production
3 ロールアウトを確認
kubectl -n maple rollout status daemonset/maple-k8s-infra-agent

できること

クラスタとアプリケーションを1本のパイプラインで

helm install
ブラックボックスではないHelmチャート
maple-k8s-infraは端から端まで読める小さなHelmチャートです。pod単位のkubeletメトリクス、node単位のホストメトリクス、クラスター全体のkube-stateメトリクス、各nodeにOTLPレシーバーを配置。
k8s.pod.name
podとスパンの結合
スパンにはk8s.pod.name、k8s.node.name、k8s.namespace.nameが付与されます。遅いトレースから、それを実行したpodとnodeへ直接ドリルダウン。
kube-state
kube-stateメトリクス
Deployment、StatefulSet、DaemonSet、レプリカ数、podフェーズ。すべて標準のkube-state-metricsエクスポーター経由で収集。
/infra/kubernetes
Workloads、Pods、Nodesビュー
ダッシュボードに3つのファーストクラスインフラビュー。Deployment、単一のpod、単一のnodeを、他の場所と同じフィルタで調査できます。
OTel Operator
OpenTelemetry Operator
Admission時にOTEL_EXPORTER_OTLP_ENDPOINTとpod/node識別情報がpodに注入されます。OTel SDKがリンクされているアプリは、コード変更なしで計装されます。
one endpoint
マルチクラスター取り込み
組織ごとに1つの取り込みエンドポイント。本番、ステージング、開発者のkindクラスターから送信し、cluster-nameリソース属性で分割可能。

次は

このデータを共有する画面

OTLPをMapleに向ける。

エンドポイントとキーが1つずつ。トレース、ログ、メトリクス、セッションが、最初のリクエストから同じトレースIDに集まります。