観測パイプラインとアイデンティティを整理する
目標
Hubbleの観測パイプラインをvaluesファイルで宣言し、アイデンティティに含まれるラベルと除外されるラベルを明示的に整理し、実戦ですぐに使えるクエリ・診断表・アラートルールを作成します。
なぜ重要なのか
Cilium運用で「観察 → ポリシー化 → 監査 → 強制」のループが閉じるためには、観察の軸が先に立っている必要があります。ところが、Hubbleを有効にしただけでexportを付けないと、リングバッファがローテーションした瞬間に証拠が消えます。ノードあたりデフォルトの4095フローは、トラフィックの多いノードでは数秒分にしかならないこともあります。
アイデンティティのラベル整理が実務で重要なのにも、理由があります。pod-template-hashのようにロールアウトのたびに変わるラベルがアイデンティティに含まれると、デプロイ1回ですべてのPodが新しいアイデンティティを受け取り、ポリシーマップが丸ごと再計算されます。どのラベルが意味を持ち、どのラベルがノイズなのかを、チームで合意しておく必要があります。
アラートも同様です。ポリシーを強制適用した直後は、しきい値をわざと低く設定して、抜けていた許可ルールを早く見つけ、安定化したあとで運用水準に上げる、という2段階の運用が正攻法です。
Hubbleの設定とドキュメントは/root/cca-hubble/の下に作成し、Kubernetesの基本リソースは実際にapplyします。
ステップ
- ネームスペース
cca-obsを作成してください。 /root/cca-hubble/hubble-values.yamlを作成し、hubble.enabled: true、hubble.relay.enabled: true、hubble.ui.enabled: true、hubble.eventBufferCapacity: 16383を書いてください。- 同じファイルに
hubble.metrics.enabledのリストを追加し、drop、dns、flow、httpV2の4系統がすべて含まれるようにしてください。続けて、hubble.exportの下に動的なexport設定を置き、includeFiltersのverdictにDROPPEDとAUDITを一緒に入れてください。 - ネームスペース
cca-obsにDeploymentcheckoutをレプリカ2でデプロイしてください。Podテンプレートのラベルはapp=checkoutとteam=paymentsの2つで、イメージはnginx:1.27-alpineです。 - 同じネームスペースにConfigMap
identity-labelsを作成してください。キーincludedにはapp、team、io.kubernetes.pod.namespaceを、キーexcludedにはpod-template-hash、controller-revision-hash、pod-template-generationを入れます。 /root/cca-hubble/hubble-queries.txtに、hubble observeで始まるクエリを5行以上書いてください。その中に、--verdict DROPPED、--verdict AUDIT、--namespace cca-obs、--protocol dns、そして--from-podで特定のPodを指定するクエリが、それぞれ最低1回ずつ含まれている必要があります。続けて、/root/cca-hubble/drop-reasons.mdにMarkdownの表を作成し、POLICY_DENIED、CT_MAP_INSERT_FAILED、UNSUPPORTED_L3_PROTOCOL、STALE_OR_UNROUTABLE_IPの4つの理由と、それぞれの最初に疑う箇所を書いてください。/root/cca-hubble/hubble-alerts.yamlにPrometheusのアラートルールを作成してください。groups[0].nameはcilium-policyで、ルールは2つです。1つ目は、名前がPolicyDropSpikeで、exprにhubble_drop_totalのrateを使いつつPOLICY_DENIEDの理由に絞り、for: 10m、severityはwarningです。2つ目は、名前がCiliumAgentDownで、severityはcriticalです。
参考
- ConfigMapは、
kubectl create configmap identity-labels -n cca-obs --from-literal=included=... --from-literal=excluded=...で作成すると早いです。値はカンマでつないでもかまいません。 - Markdownの表の行は
|で始まります。ヘッダー行と区切り線の行まで含めて、6行以上になります。 - よくある間違い1: ラベルをDeploymentの
metadata.labelsにだけ付けること。アイデンティティはPodのラベルから計算されるので、spec.template.metadata.labelsに書かれている必要があります。 - よくある間違い2: アラートのexprに累積カウンターをそのまま使うこと。増加率で見てこそ、急増を捕捉できます。
forはYAMLのキーなので、引用符なしでそのまま書けば問題ありません。
観測ラボ用のネームスペースを作成する
ネームスペースcca-obsを作成してください。
名前だけを正確に合わせればよい、最初のステップです。
Hubbleを有効にする値を書く
/root/cca-hubble/hubble-values.yamlを作成し、hubble.enabled: true、hubble.relay.enabled: true、hubble.ui.enabled: true、hubble.eventBufferCapacity: 16383を書いてください。
サーバー、集約役、画面の3つを、それぞれ有効にする必要があります。デフォルトのリングバッファはノードあたり4095フローで、トラフィックが多いとすぐにローテーションするので、拡張の値もあわせて指定してください。
メトリクスとセキュリティイベントをエクスポートする
同じファイルにhubble.metrics.enabledのリストを追加し、drop、dns、flow、httpV2の4系統がすべて含まれるようにしてください。続けて、hubble.exportの下に動的なexport設定を置き、includeFiltersのverdictにDROPPEDとAUDITを一緒に入れてください。
同じファイルに続けて書きます。ドロップ・DNS・フロー・HTTPの4系統を有効にし、exportのフィルターには、実際にブロックされたものと、監査モードでブロックされたはずのものの両方を入れてください。
ラベル付きのワークロードをデプロイする
ネームスペースcca-obsにDeployment checkoutをレプリカ2でデプロイしてください。Podテンプレートのラベルはapp=checkoutとteam=paymentsの2つで、イメージはnginx:1.27-alpineです。
アイデンティティはPodのラベルの集合から計算されるので、ラベルはDeploymentではなく、Podテンプレートにある必要があります。デプロイすると、コントローラーがラベルを1つ自動で追加してくれます。
含めるラベルと除外するラベルを整理する
同じネームスペースにConfigMap identity-labelsを作成してください。キーincludedにはapp、team、io.kubernetes.pod.namespaceを、キーexcludedにはpod-template-hash、controller-revision-hash、pod-template-generationを入れます。
再デプロイのたびに値が変わるラベルがアイデンティティに入ると、ロールアウト1回でポリシーマップをすべて再計算しなければなりません。そのようなラベルを選んで、除外リストに入れてください。
よく使うクエリとドロップ理由の表を作成する
/root/cca-hubble/hubble-queries.txtに、hubble observeで始まるクエリを5行以上書いてください。その中に、--verdict DROPPED、--verdict AUDIT、--namespace cca-obs、--protocol dns、そして--from-podで特定のPodを指定するクエリが、それぞれ最低1回ずつ含まれている必要があります。続けて、/root/cca-hubble/drop-reasons.mdにMarkdownの表を作成し、POLICY_DENIED、CT_MAP_INSERT_FAILED、UNSUPPORTED_L3_PROTOCOL、STALE_OR_UNROUTABLE_IPの4つの理由と、それぞれの最初に疑う箇所を書いてください。
判定フィルター、ネームスペースの絞り込み、DNSプロトコル、特定のPodの指定がすべて含まれて、はじめて実戦で使えます。診断表には、理由ごとに、何を先に疑うべきかを書いてください。
ドロップ急増とagentダウンのアラートを作成する
/root/cca-hubble/hubble-alerts.yamlにPrometheusのアラートルールを作成してください。groups[0].nameはcilium-policyで、ルールは2つです。1つ目は、名前がPolicyDropSpikeで、exprにhubble_drop_totalのrateを使いつつPOLICY_DENIEDの理由に絞り、for: 10m、severityはwarningです。2つ目は、名前がCiliumAgentDownで、severityはcriticalです。
累積カウンターをそのまま使ってはいけません。増加率で見る必要があります。ドロップの理由を区別しないと、ノイズがひどくなります。一瞬の跳ね上がりに反応しないように、継続時間も指定してください。