DataKit Operator による Flameshot の注入¶
DataKit Operator は v1.8.0 以降、Flameshot Sidecar の注入をサポートします。Flameshot はスケジュールまたはリソースしきい値に基づいて Java、Python、および Go アプリケーションの Profiling データを収集し、旧方式の Profiler 注入を置き換えます。
前提条件¶
- クラスターに DataKit がインストールされていること。
- DataKit で Profile コレクター が有効になっていること。
- 対象 Pod のセキュリティポリシーで、Sidecar への
SYS_PTRACEcapability の追加が許可されていること。 - Prometheus Annotation を有効にする場合は、DataKit で KubernetesPrometheus と Pod Annotation の自動検出も有効にすること。
Operator の設定¶
admission_inject_v2.flameshots にルールを追加します。
{
"admission_inject_v2": {
"flameshots": [
{
"name": "flameshot-java",
"namespace_selectors": ["^production$"],
"label_selectors": ["profiling=flameshot"],
"image": "pubrepo.guance.com/datakit/flameshot:0.2.4",
"envs": {
"FLAMESHOT_DATAKIT_ADDR": "http://datakit-service.datakit:9529/profiling/v1/input",
"FLAMESHOT_MONITOR_INTERVAL": "10s",
"FLAMESHOT_LOG_LEVEL": "info",
"FLAMESHOT_PROFILING_PATH": "/flameshot-data",
"FLAMESHOT_LOG_PATH": "/var/log/flameshot.log",
"FLAMESHOT_HTTP_LOCAL_IP": "{fieldRef:status.podIP}",
"FLAMESHOT_HTTP_LOCAL_PORT": "8089"
},
"processes": "[{\"service\":\"java-demo\",\"language\":\"java\",\"command\":\"^java\\\\b.*app\\\\.jar$\",\"events\":\"cpu\",\"duration\":\"30s\",\"cpu_usage_percent\":80}]",
"enable_prometheus_annotations": true,
"resources": {
"requests": {
"cpu": "100m",
"memory": "128Mi"
},
"limits": {
"cpu": "200m",
"memory": "256Mi"
}
}
}
]
}
}
主なフィールドは次のとおりです。
| フィールド | 説明 |
|---|---|
name |
ルール名。ログでの特定に使用するため、設定を推奨します |
namespace_selectors |
Namespace の正規表現配列 |
label_selectors |
Pod Label Selector の配列 |
image |
Flameshot Sidecar のイメージ |
envs |
Sidecar の環境変数 |
processes |
必須かつ空にできません。プロセスのマッチングと収集ポリシーを指定する JSON 配列文字列 |
enable_prometheus_annotations |
Flameshot のメトリクス収集用 Annotation を自動追加するかどうか。デフォルトは false |
resources |
Sidecar のリソース設定。未指定または無効な場合はデフォルト値を使用します |
FLAMESHOT_PROFILING_PATH と有効な FLAMESHOT_HTTP_LOCAL_PORT は、注入に必須です。いずれかがない場合や processes が空の場合、Operator は注入をスキップして warning を記録します。
Selector と Annotation の共通ルールについては、DataKit Operator の注入ルールを参照してください。admission.datakit/flameshot.enabled: "false" を指定すると、Pod 単位で Flameshot を無効にできます。
注入結果¶
ルールに一致すると、Operator は次の変更を行います。
datakit-flameshotSidecar を追加し、SYS_PTRACEcapability を付与します。- Pod で共有プロセス名前空間を有効にし、Sidecar からアプリケーションプロセスを検出できるようにします。
flameshot-volumeEmptyDir を作成し、すべての通常のコンテナのFLAMESHOT_PROFILING_PATHにマウントします。processesをFLAMESHOT_PROCESSESとして Sidecar に注入します。- Pod の
restartPolicyをAlwaysに設定します。
Flameshot はアプリケーションプロセスへ直接アクセスします。本番導入前に、Pod Security Admission、コンテナのセキュリティポリシー、およびアプリケーションの実行環境で前述の変更が許可されていることを確認してください。
収集設定¶
主な環境変数は次のとおりです。
| 環境変数 | 説明 |
|---|---|
FLAMESHOT_DATAKIT_ADDR |
DataKit の Profiling 受信アドレス |
FLAMESHOT_MONITOR_INTERVAL |
プロセスとリソースの監視間隔 |
FLAMESHOT_LOG_LEVEL |
Flameshot のログレベル |
FLAMESHOT_PROFILING_PATH |
Profiling 一時ファイルの共有ディレクトリ。注入に必須 |
FLAMESHOT_LOG_PATH |
Flameshot のログパス |
FLAMESHOT_HTTP_LOCAL_IP |
Flameshot HTTP のリッスン IP |
FLAMESHOT_HTTP_LOCAL_PORT |
Flameshot HTTP とメトリクスのポート。注入に必須 |
FLAMESHOT_SERVICE |
すべてのプロセスルールの service を上書き |
FLAMESHOT_TAGS |
グローバル Profiling タグ |
FLAMESHOT_POD_CPU_LIMIT |
Pod の CPU limit。CPU コアの 1/1000 単位 |
FLAMESHOT_POD_MEM_LIMIT |
Pod のメモリー limit。単位は MiB |
processes は、Java、Python、および Go のコマンドマッチング、収集時間、CPU/メモリーしきい値、言語固有オプションをサポートします。Heap Dump とオブジェクトストレージへのアップロードも既存の envs で設定します。機密性の高い認証情報には {secretKeyRef:<SECRET>.<KEY>} の使用を推奨します。全フィールドについては Flameshot ドキュメントを参照してください。
Prometheus Annotation¶
enable_prometheus_annotations: true の場合、Operator は次の内容を追加します。
prometheus.io/scrape: "true"
prometheus.io/port: "8089"
prometheus.io/scheme: "http"
prometheus.io/path: "/metrics"
prometheus.io/param_measurement: "flameshot"
ポートには FLAMESHOT_HTTP_LOCAL_PORT の値が使用されます。Pod に prometheus.io/ で始まる Annotation が1つでも存在する場合、Operator はユーザー設定を維持し、前述の Annotation を追加しません。
Deployment の例¶
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-demo
namespace: production
spec:
replicas: 1
selector:
matchLabels:
app: java-demo
template:
metadata:
labels:
app: java-demo
profiling: flameshot
annotations:
admission.datakit/flameshot.enabled: "true"
spec:
containers:
- name: app
image: example/java-demo:1.0.0
作成後、次のコマンドで確認します。
kubectl -n production get pod -l app=java-demo -o jsonpath='{.items[0].spec.containers[*].name}'
kubectl -n production logs -l app=java-demo -c datakit-flameshot
結果に datakit-flameshot が含まれている必要があります。Profiling データの生成後は、Guance の Profiling 画面で確認できます。データがない場合は、Sidecar のログ、DataKit のアドレス、processes のコマンド正規表現、および対象プロセスの権限を確認してください。