🦑

ArgoCDのSync / Refresh について

2025/01/04に公開

ArgoCDのSync / Refreshについて毎回忘れるのでメモしておく。なるべく公式のディスカッションを参考にして整理したつもり。

Sync (同期)

  • アプリケーションの現在の状態(Live state)を、Gitリポジトリで定義された目標状態(Target state)に一致させる操作
  • 具体的には、Kubernetesクラスタに対して必要な変更を適用する
  • 同期ステータス(Sync status)は、Live stateがTarget stateと一致しているかを示す

Refresh (更新)

  • Refresh

    • ソースの変更(例:Gitの新しいコミット、Helmの新バージョン)を検知する
      • デフォルトで3分ごとに実行
    • ソースに変更がある場合のみ、マニフェストを再生成
    • Application Controllerによって要求される
  • Hard Refresh

    • アプリケーションのマニフェストキャッシュを強制的に無効化
    • ソースの変更有無に関わらず、マニフェストを強制的に再生成
    • デフォルトで24時間ごとにキャッシュが期限切れになり実行
    • ユースケース例:Helmチャートのコードを変更したが、バージョン番号は変更していない場合

処理の流れ:

Git Repository (target state)
        ↓
マニフェスト生成(kustomize build等)
        ↓
生成されたマニフェスト(target stateの具体的な表現形式)

Example:

# Gitリポジトリ内(これがtarget state)
kustomization.yaml:
  - patches:
    - replica count: 3

# 生成されたマニフェスト(target stateの表現形式)
deployment.yaml:
  replicas: 3

ArgoCDの2つの重要なキャッシュ

  1. Revision Cache

    • 目的:Gitリポジトリへの過剰な問い合わせを防ぐ
    • 保存内容:git ls-remoteの結果(GitリファレンスとSHA)
    • キャッシュキー:リポジトリ名
    • デフォルトの有効期間:3分
    • 例:
    git ls-remote の結果:
    cfb24701d...  HEAD
    b80f8cdca...  refs/heads/gh-pages
    cfb24701d...  refs/heads/master
    
  2. Manifest Cache

    • 目的:マニフェスト生成の処理負荷を軽減
    • 保存内容:生成されたKubernetesマニフェスト
    • キャッシュキー:Gitコミットハッシュを含む
    • デフォルトの有効期間:24時間

Refreshの動作と影響

  • Normal Refresh

    • Revision Cacheを無効化
    • git ls-remoteを実行してリファレンスを更新
  • Hard Refresh

    • Revision Cacheを無効化
    • Manifest Cacheも無効化
    • 完全な再生成が行われる

重要な概念の整理

  1. Target State

    • Gitリポジトリに定義された望ましい状態
    • kustomization.yaml、values.yaml等の定義
  2. Desired Manifest

    • Target Stateから生成された具体的なKubernetesマニフェスト
    • kustomize buildやhelm templateの結果
    • ArgoCDが内部でキャッシュする対象
  3. Refreshの役割

    • Normal Refresh: ソースの変更確認、変更があれば新しいDesired Manifestを生成
    • Hard Refresh: キャッシュを無視して強制的にDesired Manifestを再生成
  4. Syncの役割

    • キャッシュされたDesired Manifestを使用して、クラスタの状態(Live State)を更新

参考

Discussion