Argo CDを使用したGitOpsの実装

導入

Argo CDは、Kubernetesの上でGitOps連続デリバリーを行うための人気のあるオープンソースの実装です。アプリケーション、定義、設定、および環境は宣言的でバージョン管理されるべきです。また、アプリケーションのデプロイメントとライフサイクル管理は自動化され、監査可能で理解しやすい必要があります。これらすべてをArgoを使用して行うことができます。

Argo CDは、同じGitOpsパターンと原則に従い、クラスタの状態を宣言的な方法で維持します。同期はGitリポジトリを介して行われ、そこにはKubernetesマニフェストが格納されています。 Kubernetesマニフェストはいくつかの方法で指定できます:

  • Kustomizeアプリケーション。
  • Helmチャート。
  • Ksonnetアプリケーション。
  • Jsonnetファイル。
  • YAML/jsonマニフェストのプレーンディレクトリ。
  • 構成管理プラグインとして構成された任意のカスタム構成管理ツール。

各アプリケーションがKubernetesクラスターで実行されると同様に、Argo CDはYAMLマニフェスト内に格納されたカスタムリソース定義(CRD)を介して構成されます。最も重要なものはApplication CRDです。Argo CDアプリケーションでは、どのGitリポジトリを使用してどのKubernetesクラスターを同期するかを定義します。それは、Argo CDがデプロイされている同じKubernetesクラスターであっても、外部のものであっても構いません。

Argo CDは、現在の(またはライブの)状態をGitリポジトリで指定された目標状態と比較し続けるKubernetesコントローラーとして実装されています。目標状態から逸脱した展開されたアプリケーションはOutOfSyncと見なされます。Argo CDは違いを報告し、可視化し、ライブ状態を自動的または手動で目標状態に同期する機能を提供します。

Argo CDには多くの機能がありますが、最も注目すべきものは次のとおりです:

  • KustomizeHelmKsonnetJsonnetplain-YAMLなど、複数の構成管理/テンプレート化ツールのサポート。
  • ・複数のクラスターの管理と展開の能力。
  • ・SSO統合(OIDCOAuth2LDAPSAML 2.0GitHubGitLabMicrosoftLinkedIn)。
  • ・認可のためのマルチテナンシーおよびRBACポリシー。
  • ・アプリケーションリソースのヘルスステータス分析。
  • Gitリポジトリにコミットされたアプリケーション設定のロールバック/ロールアウト。
  • 自動化された設定ドリフトの検出と可視化。
  • アプリケーションのアクティビティのリアルタイムビューを提供するWeb UI。
  • 自動化およびCI統合のためのCLI。
  • Webhookの統合(GitHub、BitBucket、GitLab)。
  • 複雑なアプリケーション展開(例:ブルー/グリーンおよびカナリアアップグレード)をサポートするPreSync、Sync、PostSyncフック。
  • Prometheusメトリクス。

このチュートリアルでは、次のことを学びます:

  • Helmを使用してArgo CDDOKSクラスターにプロビジョニングする方法。
  • Kubernetesクラスターアプリケーションの状態をGitリポジトリと同期させる方法(GitOps原則を使用します)。
  • Argo CDを使用してアプリケーションをデプロイおよび管理する方法。

このチュートリアルのすべての手順を完了した後、Argo CDがデプロイされたDOKSクラスターが次のことを行います:

DOKS と Argo CD の Helm リリース概要

以下の図は、Argo CD が Git リポジトリを使用してホストされた Helm アプリケーションを管理する方法を示しています:

目次

前提条件

このチュートリアルを完了するには、以下が必要です:

  1. A working DOKS cluster that you have access to. Please follow the Starter Kit DOKS Setup Guide to find out more.to find out more.
  2. A GitHub repository and branch, to store Argo CD and your applications manifests. Must be created beforehand.
  3. A Git client, for cloning the Starter Kit repository.
  4. Kubectl CLI、Kubernetes との相互作用のためのものです。次の手順に従って、kubectldoctl でクラスタに接続してください。
  5. Argo CLI は、Argo CD をコマンドラインインターフェースで操作するためのものです。
  6. Kubeseal は、シークレットの暗号化と Sealed Secrets Controller との相互作用のためのものです。
  7. Helm は、Argo CD のリリースとアップグレードを管理するためのものです(オプションですが、一般的には本番システムで推奨されます)。

アプリケーションデプロイメントのための Argo CD の概念の理解

Argo CDは、アプリケーションの展開とライフサイクルを管理するためにアプリケーションのコアコンセプトを使用しています。 Argo CDアプリケーションマニフェスト内では、アプリケーション定義をホスティングするGitリポジトリと、それに対応するKubernetesクラスターを定義します。 言い換えると、Argo CDアプリケーションはソースリポジトリとKubernetesクラスターの間の関係を定義します。 これは非常に簡潔でスケーラブルな設計であり、複数のソース(Gitリポジトリ)と対応するKubernetesクラスターを関連付けることができます。

A major benefit of using applications is that you don’t need to deploy Argo to each cluster individually. You can use a dedicated cluster for Argo, and deploy applications to all clusters at once from a single place. This way, you avoid Argo CD downtime or loss, in case other environments have issues or get decommissioned.

さらに、似たようなアプリケーションをプロジェクトにグループ化することもできます。 プロジェクトは、複数のチームで作業する際に、アプリケーションと関連する役割/権限を論理的にグループ化します。 指定されていない場合、新しいアプリケーションはdefaultプロジェクトに属します。 defaultプロジェクトは自動的に作成され、制限はありません。 デフォルトプロジェクトは変更できますが、削除はできません。

スターターキットは、Argo CDを使用した素早いスタートのためのデフォルトプロジェクトを使用しています。その後、アプリケーションを作成する方法を学びます。スターターキットコンポーネントごとに、そしてアプリケーションソースとしてHelmチャートを使用します。Argo CDはHelmソースに限定されず、KustomizeKsonnetJsonnetなどの機能も活用できます。詳細については、アプリケーションソースページをご覧ください。

Argo CDのグラフィカルUI(Webインターフェース)を使用してアプリケーションを作成できますが、スターターキットはGitOpsの宣言的な方法に依存しています。各YAML構成は、各アプリケーションのレシピとして機能し、したがってGitリポジトリに保存できます。つまり、環境を再作成したり、別のクラスタに移動したりする場合でも、Argo CDのセットアップを常に再作成できます。さらに重要なことに、Git履歴を介して各変更を監査および追跡できます。 Argo CDの構成ファイルも、アプリケーション開発に使用されるGitリポジトリとは別のGitリポジトリに保存するのがベストプラクティスです。トピックに関する詳細については、Argo CD公式ドキュメントウェブサイトのベストプラクティスページをお読みください。

重要な注意:
考慮しておくべき重要な側面は、デフォルトでは Argo CD が新しいアプリケーションを自動的に同期しないことです。ArgoCD アプリケーションが最初に作成されると、その状態は OutOfSync になります。これは、ArgoCD アプリケーションが指す Git リポジトリの状態が Kubernetes クラスタの状態と一致しないことを意味します。新しい ArgoCD アプリケーションを作成しても、ターゲットクラスターへの自動デプロイメントはトリガーされません。

自動同期と孤立したリソースの削除(プルーニング)を有効にするには、syncPolicy を作成する必要があります。また、Argo CD を構成して、kubectl を介して手動で行った変更を自動的に元に戻すこともできます。公式ドキュメントのウェブサイトで 自動同期ポリシー について詳しく読むことができます。

Git リポジトリ ソースを使用する典型的な Application CRD は以下のようになります:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-apps
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myrepo/my-apps.git
    targetRevision: HEAD
    path: apps
  destination:
    server: https://kubernetes.default.svc
    namespace: my-apps
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

上記構成の説明:

  • spec.project: アプリケーションに使用するプロジェクトを Argo CD に伝えます(この例では default)。
  • spec.source.repoURL: クラスター状態を同期するために使用される Git リポジトリの URL。
  • spec.source.targetRevision: 同期に使用される Git リポジトリのリビジョン(ブランチやタグ名でも構いません)。
  • spec.source.path: ソースファイル(YAML マニフェスト)が格納されている Git リポジトリのパス。
  • spec.destination.server: ターゲット Kubernetes クラスターのアドレス。通常、Argo CD が展開されているクラスターと同じクラスターを指します:https://kubernetes.default.svc
  • spec.destination.namespace: アプリケーションに使用するKubernetesの名前空間。
  • spec.syncPolicy.automated: クラスタ内のアプリケーションをGitリポジトリと自動的に同期するために自動化を有効にします。
  • spec.syncPolicy.automated.prune: Pruneは、自動同期の一部として、ソースで見つからないクラスタからリソースを削除するかどうかを指定します。
  • spec.syncPolicy.automated.selfHeal: クラスタ内で手動で変更された場合(例:kubectlを介して)、リソースを望ましい状態に戻すかどうかを指定します。

また、クラスタ内のアプリケーションをインストールするためのソースとしてHelmリポジトリを使用することもできます。Helmリポジトリソースを使用した典型的なApplication CRDは、以下のようになります(Gitリポジトリの例と同様ですが、Helmチャートリポジトリが使用されます):

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sealed-secrets
  namespace: argocd
spec:
  project: default
  source:
    chart: sealed-secrets
    repoURL: https://bitnami-labs.github.io/sealed-secrets
    targetRevision: 2.4.0
    helm:
      releaseName: sealed-secrets
      values: |
        replicaCount: 2
  destination:
    server: "https://kubernetes.default.svc"
    namespace: kubeseal

上記の構成の説明:

  • spec.source.chart: アプリケーションのソースとして使用するHelmチャート。
  • spec.source.repoURL: HelmチャートリポジトリのURL。
  • spec.source.targetRevision: アプリケーションに使用するHelmチャートのバージョン。
  • spec.source.helm.releaseName: Kubernetesクラスタに作成するHelmリリース名。
  • spec.source.helm.values: helmテンプレートに渡すHelmの値を指定します。通常、ブロックとして定義されます。
  • spec.destination.server: ターゲットKubernetesクラスタのアドレス。 Argo CDがデプロイされているクラスタと同じクラスタを使用している場合、通常はhttps://kubernetes.default.svcを指します。
  • spec.destination.namespace:アプリケーションに使用するKubernetesの名前空間。

Argo CDのコアコンセプトについては、公式のドキュメントウェブサイトで詳細を読んでください。次に、KubernetesクラスターにArgo CDをデプロイするための利用可能なインストールオプションを見つけます。

Argo CDのインストール

Argo CDは、kubectlまたはHelmを使用してインストールできます。

  1. kubectlとインストールマニフェストファイルを使用します。この方法では、さまざまなインストールパラメーターを直接制御することはできません。Helmベースのインストールにあまり慣れていない場合は、これが始めるのに最も直接的なオプションです。
  2. Helmベースのインストール。Argo CDアプリケーションのデプロイメントとライフサイクルに対するより細かい制御が可能です。 HA(ハイアベイラビリティ)セットアップやArgo CDを本番で使用する場合に推奨されます。

次に、利用可能な機能に応じて、2つのオプションがあります。

  • マルチテナントモード。このタイプのインストールは、組織内の複数のアプリケーション開発チームにサービスを提供し、プラットフォームチームによって管理されます。エンドユーザーは、Web UIまたはargocd CLIを使用してAPIサーバーを介してArgo CDにアクセスできます。
  • Coreのみモード。これは、グラフィカルユーザーインターフェイス、APIサーバー、SSOなどを備えたトリミングされたインストールであり、各コンポーネントの軽量(非HA)バージョンをインストールします。

スターターキットは、DOKSクラスターにArgo CDをインストールするためにMulti-TenantおよびHigh Availabilityモードを使用しています。この方法で、信頼性の高いセットアップが可能であり、ユーザーインターフェイスを含むすべての利用可能な機能を探索できます。詳細については、インストール方法のドキュメントページをご覧ください。

Kubectlベースのインストール

この方法では、kubectlが必要であり、2つのステップのプロセスです:

  1. Argo CD自体を展開するためのnamespaceを作成します。
  2. kubectlを介してHAインストールマニフェストを実行します。

次のコマンドを順番に実行してください:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml

これで、インストールが成功したかどうかを確認してください。まず、すべてのArgo CDデプロイメントが正常であるかどうかを確認してください:

kubectl get deployments -n argocd

出力は次のようになります(READY列を確認してください – すべてのPodsが実行されている必要があります):

Output
NAME READY UP-TO-DATE AVAILABLE AGE argocd-applicationset-controller 1/1 1 1 51s argocd-dex-server 1/1 1 1 50s argocd-notifications-controller 1/1 1 1 50s argocd-redis-ha-haproxy 3/3 3 3 50s argocd-repo-server 2/2 2 2 49s argocd-server 2/2 2 2 49s

Argo CDサーバーは、HAモードのためにreplicasetの最小値を2に設定する必要があります。何らかの理由で一部のデプロイメントが正常でない場合は、影響を受けるコンポーネントのPodのKubernetesイベントとログを確認してください。

ヘルムベースのインストール

この方法では、ローカルマシンにHelmをインストールする必要があります。Starter Kit は、使用を開始するための準備ができたHelm値ファイルを提供し、Argo CDをHAモード(自動スケーリングなし)でインストールします。

以下の手順に従って、Helmベースのインストールを完了してください。

  1. まず、Starter Kitディレクトリをクローンし(すでにクローンされていない場合)、ディレクトリをローカルコピーに変更します。
git clone https://github.com/digitalocean/Kubernetes-Starter-Kit-Developers.git
cd Kubernetes-Starter-Kit-Developers
  1. 次に、Argo CD Helmリポジトリを追加します。
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update argo 
  1. 次に、インストール可能なチャートを検索するためにargo Helmリポジトリを検索します。
helm search repo argo

出力は次のようになります。

Output
NAME CHART VERSION APP VERSION DESCRIPTION argo/argo 1.0.0 v2.12.5 A Helm chart for Argo Workflows argo/argo-cd 4.9.4 v2.4.0 A Helm chart for Argo CD, a declarative, GitOps... ...
  1. 次に、お好みのエディター(できればYAMLリントサポート付き)を使用して、Starter Kitリポジトリで提供されるArgo CD Helm値ファイルを開いて調査します。たとえば、VS Codeを使用できます。
code 14-continuous-delivery-using-gitops/assets/manifests/argocd/argocd-values-v4.9.4.yaml
  1. 最後に、Argo CDをDOKSクラスターに展開します。
HELM_CHART_VERSION="4.9.4"
helm install argocd argo/argo-cd --version "${HELM_CHART_VERSION}" \
  --namespace argocd \
  --create-namespace \
  -f "14-continuous-delivery-using-gitops/assets/manifests/argocd/argocd-values-v${HELM_CHART_VERSION}.yaml"

–create-namespace \

注:
Helmチャートの特定のバージョンが使用されています。この場合、4.9.4が選択されており、これはアプリケーションの2.4.0バージョンにマップされます。一般的に、特定のバージョンにロックするのは良い習慣です。これにより、予測可能な結果が得られ、Gitを介したバージョン管理が可能になります。

helm ls -n argocd

次に、Helmリリースが成功したかどうかを確認します。

NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
argocd  argocd          1               2022-03-23 11:22:48.486199 +0200 EET    deployed        argo-cd-4.9.4   v2.4.0

出力は次のように見えます(STATUS列の値はdeployedに設定される必要があります):

kubectl get deployments -n argocd

最後に、Argo CDアプリケーションのデプロイメント状態を確認します:

Output
NAME READY UP-TO-DATE AVAILABLE AGE argocd-applicationset-controller 1/1 1 1 2m9s argocd-dex-server 1/1 1 1 2m9s argocd-notifications-controller 1/1 1 1 2m9s argocd-redis-ha-haproxy 3/3 3 3 2m9s argocd-repo-server 2/2 2 2 2m9s argocd-server 2/2 2 2 2m9s

出力は次のように見えます(READY列を確認してください – すべてのPodsが実行されている必要があります):

Argo CDサーバーは、HAモードのreplicasetの最小値を2とする必要があります。何らかの理由で、いくつかのデプロイメントが正常でない場合は、影響を受けるコンポーネントのPodのKubernetesイベントとログを確認してください。

Argo CD Helmチャートの詳細については、コミュニティが管理するリポジトリにアクセスしてください。

次に、Argo CDによって提供されるグラフィカルユーザーインターフェースの主な機能にアクセスして探索する方法を学びます。

Argo CD Webインターフェイスへのアクセスと探索

Argo CDの素晴らしい機能の1つは、Webインターフェースです。このインターフェースを使用して、さまざまな管理タスクを実行し、アプリケーションのデプロイメント状況を表示できます。グラフィカルユーザーインターフェースを使用してアプリケーションを作成し、さまざまな方法でArgo CDとやり取りできます。もう1つの重要な機能は、各アプリケーションの状態を検査し、Kubernetesイベントやアプリケーションログにアクセスできることです。さらに、Argo CDは、各アプリケーションデプロイメントが使用しているすべてのKubernetesオブジェクト(レプリカセット、ポッドなど)の視覚的な表現を提供します。

kubectl port-forward svc/argocd-server -n argocd 8080:443

Webインターフェースには、argocd-server Kubernetesサービスをポートフォワーディングしてアクセスできます。シェルターミナルで以下のコマンドを実行してください:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

そして、Webブラウザを開き、localhost:8080に移動してください(現時点では無効なTLS証明書を無視してください)。Argo CDのログインページが表示されます。デフォルトの管理者ユーザー名はadminで、パスワードはインストール時にランダムに生成されます。以下のコマンドを実行して取得できます:

次に、アプリケーションダッシュボードページにリダイレクトされます。ここから、UIを介してアプリケーションを表示、作成、または管理したり(YAMLエディターも利用可能)、同期または更新操作を実行したりできます:

アプリケーションタイルをクリックすると、関連するすべてのオブジェクトの視覚的な表現も表示されます:

次のセクションでは、アプリケーションプロジェクト、リポジトリ、およびクラスターを管理できます:

最後に、ユーザー情報セクションには利用可能なユーザーが表示され、管理者パスワードの更新が可能です。

各セクションとサブセクションを詳細に調べて、利用可能なすべての機能を探索できます。次に、argocd という名前のCLI対応版の使用方法を学びます。

Argo CD CLIの使い方を知る

argocd
Usage:
  argocd [flags]
  argocd [command]

Available Commands:
  account     Manage account settings
  admin       Contains a set of commands useful for Argo CD administrators and requires direct Kubernetes access
  app         Manage applications
  cert        Manage repository certificates and SSH known hosts entries
  cluster     Manage cluster credentials
  completion  output shell completion code for the specified shell (bash or zsh)
  context     Switch between contexts
  gpg         Manage GPG keys used for signature verification
  help        Help about any command
...

Argo CDは、ウェブインターフェイスまたはCLIのどちらかを使用して同じセットの機能を利用できます。 argocd CLIを使用するには、別のシェルウィンドウを開いて、単にargocdと入力します。デフォルトでは、利用可能なコマンドとオプションが表示されます:

argocd app --help

任意のコマンドまたはサブコマンドに対して、次のパターンを使用して対応するヘルプページを呼び出すことができます: argocd <command/subcommand> --help。たとえば、appコマンドの利用可能なオプションを確認したい場合:

Manage Applications
Usage:
  argocd app [flags]
  argocd app [command]

Examples:
  出力は次のようになります:
  argocd app list
  
  # すべてのアプリケーションをリストします。
  argocd app get my-app
...

# アプリケーションの詳細を取得します。

他のコマンド/サブコマンドも調べて、利用可能なすべてのオプションを確認してください。次に、最初のArgo CDアプリケーションをブートストラップする方法を学びます。これにより、Starter Kitのすべてのコンポーネントが自動的に展開されます。

Argo CDアプリケーションのブートストラップ

新規インストール時、Argo CDはアプリケーションを同期する先やアプリケーションマニフェストのソースとして使用できるGitリポジトリを知りません。そのため、最初のステップはブートストラップと呼ばれる一度だけの操作を実行することです。このセクションで提示されるすべての操作は、argocd CLIまたはグラフィカルユーザーインターフェースを使用して実行できます。

クラスターをブートストラップする複数の方法があります(例:スクリプトを使用)。ただし、通常、Argo CDユーザーはアプリのアプリパターンを使用します。これは、最初にgood CLI(またはWebインターフェース)を使用して親アプリケーションを作成し、その後、Kubernetesクラスター内の残りのアプリケーションを参照してブートストラップすることを意味します。

Gitリポジトリレイアウトの準備

clusters
└── dev
    └── helm
        ├── cert-manager-v1.8.0.yaml
        ├── nginx-v4.1.3.yaml
        ├── prometheus-stack-v35.5.1.yaml
        ├── sealed-secrets-v2.4.0.yaml
        └── velero-v2.29.7.yaml

まず、Gitリポジトリを一貫したレイアウトで使用できるように準備する必要があります。次の例では、Gitリポジトリのレイアウト構造を以下のように作成します:

  1. ターミナルを開き、Gitリポジトリのレイアウトを作成するために以下の手順に従ってください:
git clone <YOUR_ARGOCD_GIT_REPOSITORY_ADDRESS>
  1. 最初に、テスト用のArgo CDをクローンするためのgitリポジトリをクローンします(<>プレースホルダを適切に置き換えてください):
cd <YOUR_GIT_REPO_LOCAL_COPY_DIRECTORY>
mkdir -p clusters/dev/helm
  1. 次に、ディレクトリをローカルコピーに変更し、ディレクトリ構造を作成します(<>プレースホルダを適切に置き換えてください):
CERT_MANAGER_CHART_VERSION="1.8.0"
NGINX_CHART_VERSION="4.1.3"
PROMETHEUS_CHART_VERSION="35.5.1"
SEALED_SECRETS_CHART_VERSION="2.4.0"
VELERO_CHART_VERSION="2.29.7"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/cert-manager-v${CERT_MANAGER_CHART_VERSION}.yaml" > "clusters/dev/helm/cert-manager-v${CERT_MANAGER_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/nginx-v${NGINX_CHART_VERSION}.yaml" > "clusters/dev/helm/nginx-v${NGINX_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/prometheus-stack-v${PROMETHEUS_CHART_VERSION}.yaml" > "clusters/dev/helm/prometheus-stack-v${PROMETHEUS_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/sealed-secrets-v${SEALED_SECRETS_CHART_VERSION}.yaml" > "clusters/dev/helm/sealed-secrets-v${SEALED_SECRETS_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/velero-v${VELERO_CHART_VERSION}.yaml" > "clusters/dev/helm/velero-v${VELERO_CHART_VERSION}.yaml"
  1. 各コンポーネントに提供されるアプリケーションマニフェストをコピーします(各manifestの構造も確認できます):

最後に、変更をコミットしてオリジンにプッシュします。

次に、親アプリケーションデプロイメントを作成し、Argo CDにすべてのStarter KitアプリケーションをDOKSクラスターに自動的に同期させます。

Argo CD CLIを使用したアプリケーションのアプリ化

このセクションでは、argocd CLIを使用して、app of apps パターンを作成して使用し、DOKSクラスターにすべてのStarter Kitコンポーネントをデプロイする方法を学びます。以下の図は、メインの概念を示しています:

kubectl port-forward svc/argocd-server -n argocd 8080:443

まず、別のターミナルウィンドウでローカルマシン上のArgo CDメインサーバーをポートフォワードする必要があります:

ADMIN_USER="admin"
ADMIN_PASSWD="$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)"
argocd login localhost:8080 --username $ADMIN_USER --password $ADMIN_PASSWD --insecure

次に、argocd CLIが動作するために、Argo CD APIサーバーへのアクセスが必要です。別のターミナルウィンドウを開き、argocdクライアントをArgo CDサーバーインスタンスで認証する必要があります:

Output
'admin:login' logged in successfully Context 'localhost:8080' updated

出力は次のようになります:

argocd app create starter-kit-apps \
    --dest-namespace argocd \
    --dest-server https://kubernetes.default.svc \
    --repo https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git \
    --path clusters/dev/helm

次に、以下のコマンドを実行してstarter-kit-apps親アプリケーションを作成してください(<>プレースホルダーを適切に置き換えてください):

  • –dest-namespace argocd \
  • –dest-server https://kubernetes.default.svc \
  • 上記のコマンドは、新しいArgo CDアプリケーションargocdネームスペースにstarter-kit-appsという名前で作成し、以下のように構成されます:

Argo CDが展開されている同じKubernetesクラスターを対象とする。なぜなら--dest-serverhttps://kubernetes.default.svcに設定されているからです。

argocd app sync starter-kit-apps 

--repo引数で設定されたGitHubリポジトリを使用してクラスターを同期する。

Output
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd sealed-secrets-controller OutOfSync Missing ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd velero OutOfSync Missing ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd ingress-nginx OutOfSync Missing ... ... GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE argoproj.io Application argocd sealed-secrets-controller Synced application.argoproj.io/sealed-secrets-controller created argoproj.io Application argocd ingress-nginx Synced application.argoproj.io/ingress-nginx created argoproj.io Application argocd kube-prometheus-stack Synced application.argoproj.io/kube-prometheus-stack created argoproj.io Application argocd velero Synced application.argoproj.io/velero created argoproj.io Application argocd cert-manager Synced application.argoproj.io/cert-manager created

--path引数で見つかったclusters/dev/helmディレクトリ内のすべてのアプリケーションマニフェストをスキャンして適用します。

次に、starter-kit-appsアプリケーションを同期する必要があります(Argo CDはデフォルトでは何も同期しませんので、指定する必要があります):

argocd app list

出力は次のようになります:

Output
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY ... ingress-nginx https://kubernetes.default.svc ingress-nginx default OutOfSync Missing Auto-Prune ... cert-manager https://kubernetes.default.svc cert-manager default OutOfSync Missing Auto-Prune ... kube-prometheus-stack https://kubernetes.default.svc monitoring default OutOfSync Missing Auto-Prune ... sealed-secrets-controller https://kubernetes.default.svc sealed-secrets default OutOfSync Missing Auto-Prune ... starter-kit-apps https://kubernetes.default.svc argocd default Synced Healthy <none> ... velero https://kubernetes.default.svc velero default OutOfSync Missing Auto-Prune ...

上記のコマンドが完了した後、Argo CDサーバーのメインダッシュボードに新しいアプリケーションが表示されるはずです。ウェブブラウザを開き、http://localhost:8080に移動してください。次に、Applicationsタブを選択し、starter-kit-appsタイルをクリックしてください(構成グラフを見てapp of appsパターンに気付いてください):

argocd app sync -l argocd.argoproj.io/instance=starter-kit-apps

また、CLIを使用して新しいアプリケーションを検査することもできます:

出力は次のようになります:

argocd app list

starter-kit-apps親アプリケーションは同期済みとして表示されますが、子アプリケーションは同期されていません。次に、ウェブインターフェースを使用するか、CLIを介してすべてを同期させることができます:

Output
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS ... ingress-nginx https://kubernetes.default.svc ingress-nginx default Synced Healthy Auto-Prune <none> ... cert-manager https://kubernetes.default.svc cert-manager default Synced Healthy Auto-Prune <none> ... kube-prometheus-stack https://kubernetes.default.svc monitoring default Synced Healthy Auto-Prune <none> ... sealed-secrets-controller https://kubernetes.default.svc sealed-secrets default Synced Healthy Auto-Prune <none> ... starter-kit-apps https://kubernetes.default.svc argocd default Synced Healthy <none> <none> ... velero https://kubernetes.default.svc velero default OutOfSync Missing Auto-Prune SyncError ...

同期操作には時間がかかる場合があります(すべてのデプロイされるアプリケーションのKubernetesオブジェクトの複雑さと数に応じて、5〜10分かかる場合があります):

しばらくしてから、すべてのアプリケーションを再度リストしてください:

argocd app create starter-kit-apps \
  --dest-namespace argocd \
  --dest-server https://kubernetes.default.svc \
  -repo https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git \
  --path clusters/dev/helm \
   --sync-policy automated \
  --auto-prune \
  --self-heal
  • 出力は次のようになります(すべてのアプリケーションが今や同期されていることに注意してください):
argocd app get velero

Veleroアプリケーションの展開は、AbsyncError状態になり、読者がArgo CDでアプリケーションの問題を診断し、理解する練習として意図的に残されます。Argo CDアプリケーションの問題を診断する方法については、以下のHintsセクションを参照してください。
親アプリケーションのブートストラップは、一度だけの操作です。各アプリケーションの後続のGit変更では、Argo CDはドリフトを検出し、必要な変更を適用します。Argo CDは、Gitリポジトリの変更を検出するためにデフォルトでポーリングメカニズムを使用しています。デフォルトのリフレッシュ間隔3分に設定されています。ポーリングメカニズムに頼らずに、Gitウェブフックのパワーも活用できます。Gitのウェブフックを使用するようにArgo CDを作成および構成する方法については、公式ドキュメントのウェブサイトを参照してください。

Output
Name: velero Project: default Server: https://kubernetes.default.svc Namespace: velero URL: https://argocd.example.com/applications/velero Repo: https://vmware-tanzu.github.io/helm-charts Target: 2.27.3 Path: SyncWindow: Sync Allowed Sync Policy: Automated (Prune) Sync Status: OutOfSync from 2.27.3 Health Status: Missing CONDITION MESSAGE LAST TRANSITION SyncError Failed sync attempt to 2.27.3: one or more objects failed to apply (dry run) (retried 5 times). 2022-03-24 12:14:21 +0200 EET GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE velero.io VolumeSnapshotLocation velero default Failed SyncFailed PostSync error validating data: ValidationError(VolumeSnapshotLocation.spec): missing required field "provider" in io.velero.v1.VolumeSnapshotLocation.spec velero.io BackupStorageLocation velero default Failed SyncFailed PostSync error validating data: [ValidationError(BackupStorageLocation.spec.objectStorage): missing required field "bucket" in io.velero.v1.BackupStorageLocation.spec.objectStorage, ValidationError(BackupStorageLocation.spec): missing required field "provider" in io.velero.v1.BackupStorageLocation.spec] ...

Hints:必要に応じて、親アプリケーションを自動的に同期させる(自己修復および自動プルーニングも有効にする)には、次のコマンドを使用できます(<>のプレースホルダーを適切に置き換えることを忘れないでください):

–dest-namespace argocd \

–dest-server https://kubernetes.default.svc \

–sync-policy automated \

–auto-prune \

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

同期の失敗が発生した場合は、常に対象のアプリケーションの Kubernetes イベントを検査できます(argocd app get <application_name> 経由):

出力は次のようになります:

  • 次に、app of apps パターン を使用して、同じ手順を Argo CD グラフィカルユーザーインターフェースを介して実行する方法を学びます。
  • Argo CD Web インターフェースを使用した App of Apps パターンの使用
  • このセクションでは、Argo CD Web インターフェースを使用して、DOKS クラスターに Starter Kit のすべてのコンポーネントをデプロイするために app of apps パターンを作成し、活用する方法を学びます。以下の図は、主要なコンセプトを示しています:
  • 上記の図に示されているように、Web インターフェースを介した新しいアプリケーションのブートストラップは、CLI の対応部分と非常に類似しています。唯一の違いは、異なるパネル/ウィンドウ間を移動し、ポイントアンドクリック操作を使用することです。裏では、Argo CD は必要なアプリケーションの CRD を作成し、Kubernetes クラスターに変更を適用します。
  • まず、Web ブラウザを開いて Argo CD Web コンソールにログインしてください。デフォルトのユーザー名は admin であり、デフォルトのパスワードは次のように取得します:
  • ログインしたら、アプリケーションのダッシュボードページにリダイレクトされます(新規インストールでは、ダッシュボードは空です)。次に、Create Applicationボタンをクリックします。新しいパネルがポップアップし、アプリケーションの詳細を求められます:
  • 適切に各フィールドに入力してください:

Application Name: 新しいアプリケーションの名前(例:starter-kit-apps)。

Project: このアプリケーションが属するプロジェクト名(Argo CDを初めて使用する場合、defaultを使用できます)。

Sync PolicySync Options: 同期ポリシーとオプションを設定します(例:ManualAutomatic、リトライ回数、リトライ間隔など)。

ソースRepository URL: GitHubリポジトリのURLアドレス – 例:https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git

ソースPath: アプリケーションマニフェストが保存されているGitHubリポジトリディレクトリパス(例:clusters/dev/helm)。

ディスティネーションCluster URL: GitHubリポジトリと同期するターゲットKubernetesクラスタ(Argo CDが展開されているローカルクラスタの場合、https://kubernetes.default.svcなど)。

ディスティネーションNamespace: Argo CDアプリケーションに使用するターゲットKubernetesクラスタのネームスペース(通常はargocd)。

すべてのアプリケーションの詳細を入力したら、上部のCreateボタンをクリックします。ダッシュボードページに新しいアプリケーションタイルが表示されます:

アプリケーションタイルをクリックすると、構成グラフを見ることでアプリのアプリのパターンを観察できます:

上記の画像を見ると、すべてのアプリケーションがOutOfSyncとしてマークされていることに気付きます。次のステップは、親アプリケーションで同期操作をトリガーすることです。その後、すべての子アプリケーションも同期されます。続けて、親アプリケーションタイルのSyncボタンを押してください。右側に新しいパネルが表示されます(下部にすべての子アプリが選択されていることに注意してください):

デフォルト値のままにして、上部の同期ボタンを押し、Argo CDが同期操作をすべてのアプリケーションに連鎖させる様子を見てください:

Veleroアプリケーションの展開が失敗し、読者がArgo CDのアプリケーションの問題を診断し学習するための練習として、SyncError状態に残されます。Argo CDのアプリケーションの問題を診断する方法を学ぶために、以下のヒントセクションを参照してください。

すべてがうまくいけば、すべてのアプリケーションには緑の枠があり、状態はHealthyおよびSyncedである必要があります。ブートストラッププロセスは、1回限りの操作です。後続のGitの変更ごとに、Argo CDはドリフトを検出し、必要な変更を適用します。Argo CDは、デフォルトでGitリポジトリの変更を検出するためにポーリングメカニズムを使用します。デフォルトのリフレッシュ間隔3分に設定されています。ポーリングメカニズムに依存せず、Gitのウェブフックのパワーも活用できます。Git webhooks を使用するように Argo CD を作成および設定する方法については、公式ドキュメントのウェブサイトをご覧ください。

ヒント:希望する場合、SYNC POLICYフィールドの値をAutomaticに設定して親アプリケーションを自動的に同期させることができます。セルフヒーリングと自動的なプルーニングを有効にするには、PRUNE RESOURCESSELF HEALのチェックボックスにチェックを入れます。

同期の失敗が発生した場合は、常に該当するアプリケーションのKubernetesイベントを検査できます。Webインターフェースを使用して、影響を受けるアプリケーションタイルに移動できます:

次に、アプリケーションページヘッダーのLAST SYNC RESULTセクションから、赤色でフラグが立っているSync failedメッセージリンクをクリックします。新しいパネルがポップアップし、同期操作が失敗した理由に関する有用な情報が表示されます:

Application Setsは、Argo CDが提供するもう一つの強力な機能です。ApplicationSet ControllerはArgo CDのサブプロジェクトであり、テンプレート化された定義を介したアプリケーションの自動化を追加します。この機能は、アプリケーションマニフェスト内の繰り返しを回避するのに役立ちます(DRY原則を活用します)。

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-app
spec:
  generators:
    - list:
        elements:
          - cluster: dev
            url: https://kubernetes.dev.svc
          - cluster: qa
            url: https://kubernetes.qa.svc
          - cluster: prod
            url: https://kubernetes.prod.svc
  template:
    metadata:
      name: '{{cluster}}-app'
    spec:
      project: default
      source:
        repoURL: https://github.com/myrepo/my-applicationset.git
        targetRevision: HEAD
        path: clusters/{{cluster}}/my-apps
      destination:
        server: '{{url}}'
        namespace: argocd

ApplicationSetコントローラーは、Argo CDと同じ名前空間内にインストールされ、新しいApplicationSetカスタムリソース(CR)の内容に基づいてArgo CDアプリケーションを自動生成します。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: dev-app
spec:
  project: default
  source:
    repoURL: https://github.com/myrepo/my-applicationset.git
    targetRevision: HEAD
    path: clusters/dev/my-apps
  destination:
    server: https://kubernetes.dev.svc
    namespace: argocd

注意:Argo CDのバージョン2.3.xからは、ApplicationSet Controllerを別途インストールする必要はありません。なぜなら、それがArgo CDのメインインストールの一部になったからです。Starter Kitではversion >= 2.3.1を使用しているので、何も変更する必要はありません。

ApplicationSetの主なアイデアは、generatorとして機能する値のリストと、入力リストの値で埋められるtemplateに基づいています。リストからの各アイテムについて、新しいアプリケーションテンプレートが順番に生成されます。基本的には、1つのApplicationSet CRDを定義し、入力値に基づいて必要なだけのArgoCD Application CRDを生成させることができます。したがって、複数のApplication manifestsを作成して取り扱う代わりに、single manifestであるApplicationSetを介してすべてを管理します。

このコンセプトは、パラメータ化されたアプリケーションテンプレートを使用して、multi-clusterおよびmulti-environmentセットアップの管理も簡素化します。Applicationセットには、List Generators以外にも他のジェネレータが含まれています:

Cluster generator: Argo CDで定義されたクラスタを使用してアプリケーションのテンプレートを作成します。

argocd app delete starter-kit-apps

Git generator: Gitリポジトリのファイル/ディレクトリを使用してアプリケーションのテンプレートを作成します。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: cert-manager
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
...

典型的なApplicationSet CRDは、List Generatorを使用して次のように見えます:

上記のApplicationSetをKubernetesクラスタに適用すると、3つのArgo CDアプリケーションがレンダリングされます。たとえば、dev環境アプリケーションは以下のようにレンダリングされます:

テンプレートエンジンは非常に強力であり、多くの可能性を提供します。この機能について詳しくは、メインのApplicationSetドキュメントウェブサイトをご覧ください。

Argo CDアプリケーションのアンインストール

Argo CDで管理されているアプリケーションのアンインストール(または削除)は、Gitリポジトリソースから対応するマニフェストを削除することで行います。 app of appsパターンを使用して作成されたアプリケーションの場合、親アプリケーションのみを削除する必要があります(CLIまたはWebインターフェースを介して)。その後、プロセスの一環として、すべての子アプリケーションが削除されます。

  • argocd CLIを使用してstarter-kit-apps親アプリケーション(子アプリケーションも含む)を削除する方法:
  • 親アプリケーションが削除されると、子アプリケーションおよびそれらのリソースがすべて削除されることを確認するには、適切なApplication definitionに適切なfinalizerを追加してください:

Source:
https://www.digitalocean.com/community/developer-center/implementing-gitops-using-argo-cd