[Kyverno] 高可用性(HA)のためのレプリカ構成とリソース割り当て

こんにちは!Kubernetesのセキュリティと運用の安定性を担うKyvernoマスターガイド、第3回目です。🛡️

前回はHelmを使った基本的なインストールとvalues.yamlの最適化について軽く触れましたが、今回は運用環境(Production)で絶対に見逃してはならない最も重要なテーマ、「Kyverno高可用性(HA)構成とリソース割り当て戦略」について深く掘り下げていきます。🚀

Kyvernoは単なるツールではなく、クラスターの「ゲートウェイ」です。このゲートウェイが機能しなくなると、クラスター全体が麻痺する可能性があることをご存知でしたか?たった10分投資して、あなたのクラスターを鉄壁の防御にしましょう!


🏗️ 1. なぜKyvernoには高可用性(HA)が必須なのでしょうか?

KyvernoはKubernetesのAdmission Webhookとして動作します。これはどういう意味でしょうか?

ユーザーがkubectl applyを実行すると、APIサーバーはKyvernoに「これをデプロイしてもいい?」と尋ねます。もしこの時、Kyverno Podが停止していたり、応答できなかったりしたらどうなるでしょうか?

  • Fail Close設定時: セキュリティのためにすべてのリソース作成がブロックされます。(サービスデプロイ不可!🔥)
  • Fail Open設定時: セキュリティ検査なしにリソースがデプロイされ、クラスターが危険にさらされます。

したがって、Kyvernoを複数台起動するHA(High Availability)構成は、選択ではなく必須です。


👥 2. レプリカ構成戦略: 3の法則

運用環境では、最低3つのレプリカを推奨します。

なぜ2つではなく3つなのでしょうか? 🧐

  • アップグレード中の可用性: 1つをアップデートしている間に別の1つに問題が発生しても、最後の砦が残っている必要があります。
  • クォーラム(Quorum)維持: 分散システムにおいて、安定した合意と負荷分散のために奇数個のレプリカが有利です。

values.yaml 設定例:

YAML

replicaCount: 3

📍 3. Pod分散ポリシー: 「すべての卵を一つのカゴに入れるな」

レプリカを3つ起動したのに、たまたまその3つすべてが同じワーカーノード(Node)にデプロイされたら?そのノードが停止した瞬間、Kyvernoも全滅です。これを防ぐためにTopology Spread Constraintsを使用する必要があります。

  • 目標: Kyverno Podを異なるノード、さらに異なるアベイラビリティゾーン(AZ)に分散させる!
  • 効果: 特定のノードやゾーンに障害が発生してもサービスが維持されます。

values.yaml 設定例:

YAML

topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        app.kubernetes.io/instance: kyverno

⚡ 4. リソース割り当て(Resource Allocation): 「飢えさせず、食べ過ぎさせず」

Kyvernoはクラスター内のすべてのAPIリクエストを傍受して検査します。クラスターの規模が大きくなるにつれて、Kyvernoが使用するCPUとメモリも増加します。

① Requests & Limits 設定 🔋

Kyvernoが安定して動作できる空間を確保する必要があります。

  • CPU: ポリシー検査時に演算が集中するため、低すぎるとAPI応答速度が低下します。(レイテンシ増加)
  • Memory: クラスターにリソースが多いほど、キャッシングのためにメモリを多く使用します。OOM(Out Of Memory)キラーのターゲットにならないように、余裕を持って設定してください。

② 実践的な推奨スペック (中小規模クラスター基準)

YAML

admissionController:
  container:
    resources:
      requests:
        cpu: 100m
        memory: 256Mi
      limits:
        cpu: 500m
        memory: 512Mi

Tip: 大規模クラスターでは、メモリを1Gi以上に増設することを検討する必要があります。


🛡️ 5. 安全装置: PDB (Pod Disruption Budget)

クラスターの点検やノード交換作業時、KubernetesはPodを別のノードに移動させます(Eviction)。この時、Kyverno Podが一斉にすべて終了する大惨事を防ぐために、PDBを設定します。

  • 機能: 「いかなる状況でもKyverno Podは最低N個以上稼働していなければならない!」と強制するルールです。

values.yaml 設定例:

YAML

podDisruptionBudget:
  minAvailable: 1 # 少なくとも1つは生かしておけ!

🚦 6. Webhookタイムアウトチューニング

APIサーバーがKyvernoの応答をどれくらい待つかを決定する設定です。

  • 短すぎると: ネットワーク遅延時に正常なリクエストも拒否される可能性があります。
  • 長すぎると: Kyvernoに問題が発生した際に、クラスター全体のAPI応答が遅くなり、ユーザーが不満を感じる可能性があります。

通常、15秒前後が最も適切な妥協点です。

💾 付録: 運用環境のための総合values.yamlサンプル

上記で説明した高可用性(HA)、リソース割り当て、分散ポリシー、そしてPDB設定まで、すべて集約された実務用設定ファイルです。この内容をmy-values.yamlとして保存して使用してください。

YAML

# =========================================================
# Kyverno 本番環境対応構成
# =========================================================

# 1. レプリカ設定 (高可用性の確保)
replicaCount: 3

# 2. Pod中断バジェット (メンテナンス中の可用性保証)
podDisruptionBudget:
  minAvailable: 1

# 3. Pod分散ポリシー (ノード障害対策)
# 特定のノードにPodが集中しないように物理的に分散配置します。
topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        app.kubernetes.io/instance: kyverno

# 4. リソース割り当て (性能と安定性の最適化)
# クラスター規模に応じて以下の数値を調整してください。
admissionController:
  container:
    resources:
      requests:
        cpu: 100m
        memory: 256Mi
      limits:
        cpu: 500m
        memory: 512Mi

# 5. Webhookタイムアウトおよび再試行設定
# ネットワーク遅延による誤検知を防ぐため、15秒に設定します。
webhook:
  timeoutSeconds: 15

# 6. バックグラウンドスキャンコントローラー (既にデプロイされたリソースの監視)
backgroundController:
  resources:
    requests:
      cpu: 50m
      memory: 64Mi
    limits:
      cpu: 200m
      memory: 128Mi

# 7. リソースクリーンアップコントローラー (クリーンアップポリシーの有効化)
cleanupController:
  enabled: true
  resources:
    requests:
      cpu: 50m
      memory: 64Mi

# 8. モニタリングの有効化
# Prometheusがインストールされていれば、メトリクスを収集できます。
metricsService:
  enabled: true

🚀 設定適用方法

上記の構成ファイルを準備したら、ターミナルで次のコマンドを実行してクラスターに適用してください。

Bash

# ネームスペースが存在しない場合は作成
kubectl create namespace kyverno --dry-run=client -o yaml | kubectl apply -f -

# Helmによるインストールと更新
helm upgrade --install kyverno kyverno/kyverno 
  --namespace kyverno 
  --values my-values.yaml

💡 インストール後の最終確認リスト

  • [ ] kubectl get pod -n kyverno コマンドで3つのPodが異なるノードで稼働していることを確認してください。
  • [ ] kubectl get pdb -n kyverno コマンドでPDBが正常に作成されていることを確認してください。
  • [ ] kubectl logs を通じてWebhook登録プロセスでTLSエラーがないかチェックしてください。

🔍 インストール後の検証 – 「私のKyvernoは本当に健全か?」

Helmのインストールコマンドが成功したからといって、すべての設定が完璧に完了したわけではありません。Kyvernoがクラスターのゲートウェイとして適切に機能しているかを確認するための3つのチェックリストを必ず実行する必要があります。

① CRD(Custom Resource Definitions)確認

Kyvernoはポリシーを定義するために複数のカスタムリソースを使用します。以下のコマンドを通じて、Kyverno関連のCRDがすべて正常に作成されているかを確認してください。

Bash

kubectl get crd | grep kyverno

主要CRDリスト:

  • clusterpolicies.kyverno.io: クラスター全体に適用されるポリシー
  • policies.kyverno.io: 特定のネームスペースに適用されるポリシー
  • policyreports.kyverno.io: ポリシー遵守状況を記録するレポート
  • admissionreports.kyverno.io: リソース作成時の検査結果を含むレポート

② Admission Webhook状態点検 🔗

KyvernoはKubernetes APIサーバーとWebhookで通信します。この接続が切れるとポリシーが適用されません。

Bash

# Mutating Webhookの確認
kubectl get mutatingwebhookconfigurations | grep kyverno

# Validating Webhookの確認
kubectl get validatingwebhookconfigurations | grep kyverno

出力結果にkyverno-resource-mutating-webhook-cfgのような項目が表示され、AGEがインストール時間と一致している必要があります。

③ システム構成要素および可用性確認 🚦

values.yamlで設定した3つのレプリカが異なるノードに適切にデプロイされ、Running状態であるかを確認します。

Bash

# すべてのKyverno関連Podの状態確認
kubectl get pods -n kyverno -o wide

# サービス状態の確認 (特にMetricsポート8000を確認)
kubectl get svc -n kyverno

-o wide オプションを使用して、各Podが異なるNODEにデプロイされているか(Topology Spread適用状況)を直接目で確認することが重要です。


🛠️ トラブルシューティング: 状態が良くない時(NotReady)

もしPodがRunning状態でないか、Webhookエラーが発生した場合は、以下のログを確認してください。

Bash

# 特定のPodのログをリアルタイムで確認
kubectl logs -f -n kyverno -l app.kubernetes.io/instance=kyverno
  • ほとんどの原因: TLS証明書発行エラー、リソース割り当て不足(OOM)、またはノード間のネットワーク通信遮断(Security Group/Network Policy)である可能性が高いです。

##

🌟 終わりに: 安定したセキュリティはインフラ設計から!

Kyvernoを高可用性で構成することは、単にセキュリティツールをインストールするだけでなく、クラスター全体の安定性を設計するプロセスです。

  1. 3つ以上のレプリカを維持し、
  2. Topology Spreadで物理的な障害に備え、
  3. PDB適切なリソース割り当てで内部的な安定性を確保してください。

このように強固な基盤を築いてこそ、後で複雑なポリシーを追加してもクラスターが揺らぐことはありません。💪

今日のガイドが、皆さんの楽しいKubernetes運用の一助となれば幸いです!

ご不明な点がございましたら、いつでもコメントでお知らせください!😊



Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です