TT Lab
はじめる
学ぶ 学習パス コース

CCA — Cilium認定アソシエイト

観測パイプラインとアイデンティティを整理する

TT Labで続きを見る

目標

Hubbleの観測パイプラインをvaluesファイルで宣言し、アイデンティティに含まれるラベルと除外されるラベルを明示的に整理し、実戦ですぐに使えるクエリ・診断表・アラートルールを作成します。

なぜ重要なのか

Cilium運用で「観察 → ポリシー化 → 監査 → 強制」のループが閉じるためには、観察の軸が先に立っている必要があります。ところが、Hubbleを有効にしただけでexportを付けないと、リングバッファがローテーションした瞬間に証拠が消えます。ノードあたりデフォルトの4095フローは、トラフィックの多いノードでは数秒分にしかならないこともあります。

アイデンティティのラベル整理が実務で重要なのにも、理由があります。pod-template-hashのようにロールアウトのたびに変わるラベルがアイデンティティに含まれると、デプロイ1回ですべてのPodが新しいアイデンティティを受け取り、ポリシーマップが丸ごと再計算されます。どのラベルが意味を持ち、どのラベルがノイズなのかを、チームで合意しておく必要があります。

アラートも同様です。ポリシーを強制適用した直後は、しきい値をわざと低く設定して、抜けていた許可ルールを早く見つけ、安定化したあとで運用水準に上げる、という2段階の運用が正攻法です。

Hubbleの設定とドキュメントは/root/cca-hubble/の下に作成し、Kubernetesの基本リソースは実際にapplyします。

ステップ

  1. ネームスペースcca-obsを作成してください。
  2. /root/cca-hubble/hubble-values.yamlを作成し、hubble.enabled: true、hubble.relay.enabled: true、hubble.ui.enabled: true、hubble.eventBufferCapacity: 16383を書いてください。
  3. 同じファイルにhubble.metrics.enabledのリストを追加し、drop、dns、flow、httpV2の4系統がすべて含まれるようにしてください。続けて、hubble.exportの下に動的なexport設定を置き、includeFiltersのverdictにDROPPEDとAUDITを一緒に入れてください。
  4. ネームスペースcca-obsにDeployment checkoutをレプリカ2でデプロイしてください。Podテンプレートのラベルはapp=checkoutとteam=paymentsの2つで、イメージはnginx:1.27-alpineです。
  5. 同じネームスペースにConfigMap identity-labelsを作成してください。キーincludedにはapp、team、io.kubernetes.pod.namespaceを、キーexcludedにはpod-template-hash、controller-revision-hash、pod-template-generationを入れます。
  6. /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つの理由と、それぞれの最初に疑う箇所を書いてください。
  7. /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です。

参考

観測ラボ用のネームスペースを作成する

ネームスペース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です。

累積カウンターをそのまま使ってはいけません。増加率で見る必要があります。ドロップの理由を区別しないと、ノイズがひどくなります。一瞬の跳ね上がりに反応しないように、継続時間も指定してください。