こんにちは!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を高可用性で構成することは、単にセキュリティツールをインストールするだけでなく、クラスター全体の安定性を設計するプロセスです。
- 3つ以上のレプリカを維持し、
- Topology Spreadで物理的な障害に備え、
- PDBと適切なリソース割り当てで内部的な安定性を確保してください。
このように強固な基盤を築いてこそ、後で複雑なポリシーを追加してもクラスターが揺らぐことはありません。💪
今日のガイドが、皆さんの楽しいKubernetes運用の一助となれば幸いです!
ご不明な点がございましたら、いつでもコメントでお知らせください!😊
コメントを残す