プロダクション環境のKubernetesクラスターにおいて、kubectl apply -fによる命令的な変更操作は、しばしば「構成ドリフト(Configuration Drift)」という深刻な問題を引き起こします。CIパイプラインが正常に完了したにもかかわらず、実際のリソース状態がGit上の定義と乖離している現象です。これは、緊急時の手動パッチ適用や、追跡不可能なサイドエフェクトによって発生します。本稿では、ArgoCDを中核としたGitOpsモデルを採用し、Gitを「信頼できる唯一の情報源(Single Source of Truth)」として確立するためのアーキテクチャ設計と実装詳細について論じます。
プッシュ型CI/CDの限界とセキュリティリスク
従来のJenkinsやGitLab CIを用いたプッシュ型デプロイメントには、構造的な脆弱性が存在します。CIサーバーがターゲットクラスターへの書き込み権限(KUBECONFIGや強力なServiceAccountトークン)を保持する必要があるため、攻撃対象領域(Attack Surface)が拡大します。
さらに、プッシュ型は「Fire and Forget」モデルになりがちです。パイプラインがコマンドを実行した瞬間の成功は保証しますが、その後のクラスター内での自律的な変更(Horizontal Pod Autoscalerによるスケーリングや、アドミッションコントローラーによるMutating Webhookの影響)を継続的に監視し、是正することはできません。
ArgoCDによるプル型アーキテクチャとReconciliation Loop
GitOpsと従来のCI/CDの違いは、デプロイのトリガーの方向にあります。ArgoCDはKubernetesクラスター内部で動作し、Gitリポジトリ(Desired State)と現在のクラスター状態(Live State)を絶えず比較します。この調整ループ(Reconciliation Loop)こそが、宣言的デリバリーの核心です。
Kubernetes Controller Pattern: ArgoCDは実質的にカスタムコントローラーとして機能します。Gitリポジトリのハッシュ変更を検知するか、定期的なポーリング(デフォルト3分)によってドリフトを検出し、自動的または手動承認を経て同期(Sync)を実行します。
Application CRDの構造解析
ArgoCDにおけるデプロイ単位はApplicationというCustom Resource Definition (CRD)で管理されます。以下は、HelmチャートとKustomizeを用いたデプロイを定義する本番グレードのマニフェスト例です。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: payment-service-prod
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io # アプリ削除時にリソースも削除する設定
spec:
project: production-project
source:
repoURL: 'https://github.com/org/k8s-manifests.git'
targetRevision: HEAD
path: apps/payment-service/overlays/prod
# Helmを使用する場合のパラメータオーバーライド例
helm:
valueFiles:
- values-prod.yaml
parameters:
- name: replicaCount
value: '3'
destination:
server: 'https://kubernetes.default.svc'
namespace: payment-prod
# 自動同期と修復の設定
syncPolicy:
automated:
prune: true # Gitにないリソースを削除
selfHeal: true # 手動変更を検知して強制的にGitの状態に戻す
syncOptions:
- CreateNamespace=true
- PruneLast=true # 依存関係の削除順序を制御
マルチクラスター環境におけるGitOps管理戦略
大規模な組織では、数百のマイクロサービスを複数のクラスター(Dev, Staging, Prod-US, Prod-EUなど)に展開する必要があります。個別にApplicationリソースを作成するのはスケーラビリティに欠けます。ここで「App of Apps」パターンまたはApplicationSetコントローラーの導入が不可欠となります。
ApplicationSetによる動的生成
ApplicationSetを使用すると、Gitのディレクトリ構造やクラスターのラベルに基づいて、Applicationリソースを動的に生成できます。これにより、新しいクラスターを追加した際、自動的に必要なベースライン構成(Monitoring, Logging, Ingress Controllerなど)がデプロイされる仕組みを構築可能です。
ベストプラクティス: ジェネレーターとしてGit Generatorを使用し、ディレクトリパスに基づいて環境ごとのオーバーレイ(Kustomize)を自動検出させる構成が、最もメンテナンスコストが低く抑えられます。
シークレット管理と暗号化戦略
GitOpsの最大の課題は「Gitに機密情報(DBパスワード、APIキー)を平文で保存できない」点です。これに対する主要なアプローチは以下の2つです。
- Sealed Secrets: 公開鍵で暗号化したデータをGitにコミットし、クラスター内のコントローラーが秘密鍵で復号して
Secretリソースを生成する方式。シンプルですが、鍵のローテーション管理が必要です。 - External Secrets Operator: AWS Secrets ManagerやHashiCorp Vaultなどの外部ストアと連携し、必要なタイミングで
Secretをフェッチする方式。エンタープライズ環境では、既存のセキュリティ基盤と統合できるため推奨されます。
デプロイメント戦略の比較:Push vs Pull
従来のCI主導アプローチと、ArgoCDを用いたGitOpsアプローチの技術的差異を以下の表にまとめます。
| 比較項目 | Push型 (Jenkins/GitLab CI) | Pull型 (ArgoCD/Flux) |
|---|---|---|
| クラスター認証情報 | CIサーバーに保存 (リスク高) | クラスター内部で完結 (リスク低) |
| ドリフト検出 | 不可 (次回のデプロイまで不明) | 常時監視 (即時検出・修復) |
| デプロイの可視性 | CIログに依存 | 専用UI/CLIでリソース状態を可視化 |
| 災害復旧 (DR) | スクリプトの再実行が必要 | 新しいクラスターにArgoCDを入れるだけで復元 |
ArgoCD導入時の注意点とアンチパターン
ArgoCDは強力ですが、誤った設定はシステム全体のリスクとなります。特にselfHeal(自動修復)機能は、開発環境では有用ですが、本番環境でのデバッグ中やインシデント対応中に、オペレーターが行った緊急回避的な設定変更を勝手に上書きしてしまう可能性があります。これを防ぐためには、メンテナンスウィンドウ中に自動同期を一時停止する運用フローや、Resource Hooksを活用した安全なロールアウト戦略が求められます。
注意: CIパイプラインとGitOpsリポジトリを密結合させないでください。CIはコンテナイメージのビルドとプッシュに専念させ、マニフェストリポジトリの更新(image tagの書き換え)のみを行うべきです。これにより責任分界点が明確になり、ロールバックもGitのrevertのみで完結します。
ArgoCDを活用したGitOpsは、単なるツールの導入ではなく、運用プロセスのパラダイムシフトです。宣言的な定義に基づく厳格な状態管理は、システムの予見可能性を高め、SREチームの運用負荷を劇的に低減させる基盤となります。
Post a Comment