TECHSTEP

ITインフラ関連の記事を公開してます。

ArgoCD ver 1.8 ~ 2.2のリリース内容を眺める

つい先日ArgoCD ver 2.2.0がリリースされたので、今回はその内容を眺めてみます。

また、以前ArgoCDを触ってからだいぶ時間が空いてしまい、その間アップデートがいくつもあったので、ver 1.8からおさらいしようと思います。

ver 2.2だけ見たい場合はこちらから飛んでください

なお、過去の性能改善系はなるべく省き、機能追加の部分に絞ってます。

1.8

ver 1.8は2020/12/10にリリースされました。

性能関連

annotation-base path detection

argocd.argoproj.io/manifest-generate-paths というannotationを利用できるようになりました。これを利用すると、ここで指定したパス以外のファイルが変更されても、不要なreconciliationをスキップできます。またこの時に前回のコミットで生成したマニフェストを再利用することで、マニフェストの生成をスキップすることもできます。

Application Controllerの水平スケール

application-controllerは、ターゲットクラスターのキャッシュとアプリのreconciliationを管理する責務を担います。これまでapplication-controllerはArgoCDの中で唯一水平スケールすることのできないコンポーネントで、特にクラスター数が数百を超えるとボトルネックとなるポイントでした。

今回cluster shardを導入することで application controllerを複数稼働できるようになりました。controllerを増やすことでクラスター接続数を増加することができ、reconciliationパフォーマンスも改善することができます。

Core Func

Namespace and CRD creation

namespaceやCRDといったリソースは、他のリソースを作成する前に作成されている必要のあるものです。そのためArgoCDでは PreSync のフェーズよりも前に作成されるのが望ましいです。

これを実現するため、namespaceに紐づいたリソースを検知すると、まずnamespaceを作るように、またCRを作る前にCRDが必要な場合もそれを検知し、作成する様な挙動に変更されました。

unknown field of built-in k8s type

ArgoCD version 1.2から sync-options: validate=false という形で指定すると、デプロイ時のvalidationをスキップすることができます( kubectl apply --validate=false と同様の仕組み)。

これまではvalidationオフの状態でsyncすると、unknown fieldはドロップされ、out-of-syncとは判定されなかったのが、このバージョンからout-of-syncになるよう変更されました。

endpoint diffing

Kubernetes Endpoint Controllerの挙動と、ArgoCDでの差分検出時の挙動がうまくかみ合わず、false-positiveな差分検知をしてしまっていたようです。リリースによりこの問題が修正されました。

app-of-apps health assessment

ArgoCDでは app-of-apps パターンという、Application自体をApplicationで管理するパターンが広く知られています。app-of-apps パターンを採用している場合、子のApplicationがunhealthyになると親のApplicationもunhealthyになっていました。この挙動は多くのユーザーにとって冗長であり、混乱を生む原因であるとして、built-inのヘルスチェックが削除されました。

なおcustom health checkを使用することで、必要に応じて機能を追加することはできます。

Global Project

 ProjectApplication の論理的グループを提供する機能で、複数チームがArgoCDを使うようなマルチテナントな環境で特に有用です。Projectではリポジトリクラスター、リソースの種別を制限するRuleを設定することができます。

Global Projectを利用することで、ほかのProjectに同じ設定を渡すことができます。 argocd-cm ConfigMapに、設定元となるプロジェクトと、それを反映するプロジェクトの条件を追記することで、該当するProjectに指定の設定を反映することができます。

利用できるパラメータは、namespaceやclusterの制限、リポジトリの指定、SyncWindowsなどになります。

コンフィグ管理ツール
  • oci base repo: HelmがOCIのサポートを開始したので、ArgoCDもそれに対応しました。OCI registry内で提供されるHelm chartを利用可能になりました。

  • configurable helm version: ArgoCDはHelm v2/3のどちらのバージョンもサポートします。ver 1.8から、Helmのどちらのバージョンを使用するべきか、chart定義のapiversionで決定されるようになりました。Helmのバージョン違いで互換性の問題が出ると、希望のバージョンで上書きできます。

UI

  • application filter: Application Listページにあるfilterを見つけやすく、条件のクリアもやりやすくなりました。

  • git tag/branch 自動補完: Gitリポジトリのブランチ・タグ名をリストで表示してくれるようになりました。

2.0

ver 2.0は2021/4/7にリリースされました。メジャーアップデートということもあり、新しい機能が多く発表されました。

ApplicationSet

ApplicationSetk8s custom resourceとして利用でき、ArgoCDを拡張することができます。ApplicationSetは先日触れましたが、主な機能としては以下の通りです。

ユースケースとしては、Kubernetesに導入する各種add-onの管理、モノレポでのArgoCDの活用などが挙げられます。特に大規模な環境だと、ArgoCD単一では管理コストが高くなるような設計に対して、 ApplicationSet の利用が役に立つケースは色々とありそうです。

ArgoCD Image Updater

ArgoCD Image UpdaterはArgoCDがApplication で利用するコンテナイメージのレジストリをモニターし、新しいコンテナイメージがアップロードされると、マニフェストを自動で書きかえて更新する機能を提供します。 これと同じ機能はFluxなどでは以前から提供されていた機能ですが、ArgoCDでもこの機能を利用することができるようになりました。

利用時はArgoCDと同じクラスター上にデプロイし、 argocd-cm ConfigMap等に必要な設定を入れれば使えるようです。

ArgoCD Notification

ArgoCDは通知サービスとの連携をするために複数の選択肢が存在しましたが、今後はArgoCD Notificationsでサポートすることになったようです。ArgoCD Notifications自体は以前から存在しましたが、コミュニティなどからのFBを受けて改善をしていたようです。

ArgoCD Notificationsも以前触れたことがありますが、導入はそれほど難しくないので、Slackなどの通知ツールをArgoCDと簡単に連携することができます。

Core feature

Resource deletion/pruning

ArgoCDは Application リソースを削除するとき、もしくはUIから個別リソースの削除を選択すると、Application Sync時に不要なリソースは削除する動きになります。

従来この処理はForegroundで処理をしていましたが、このときArgoCDが不要なリソースを削除しようとしてスタックすることがあったようです。 このバージョンではPrunePropagationPolicy=background という新しいSyncオプションを追加し、backgroundでのリソース削除を選択可能にしました。

Sync changed resources only

これまでArgoCDではSync時はリソース変更の有無にかかわらず、全てのアプリリソースにkubectl applyを実行していました。これは特に数百単位のリソースを扱う際に、Sync完了まで多くの時間を要することがありました。 ApplyOutOfSyncOnly=true というオプションを利用すると、変更リソースのみをsyncすることが可能になりました。

Prune last

PruneLast=true というオプションを追加すると、他のリソースのsyncが完了した後でpruneを実行します。Kubernetesリソース間で依存関係があるような場合に有効になります。

CRDに対するヘルスチェックの追加

ver 2.0ではSealed Secrets / External Secrets / Strimzi CRDに対応しました。

UI

  • Pods view: 全てのリソースを一度に表示するのでなく、Podと関連するリソースのみ表示できるようになりました。Podを管理する上位リソース毎、Node毎など、複数の検索候補を提供します。

  • Logs viewer: 親リソースでPodのログをまとめたり、ログストリームの有効無効化、フィルタリング機能などを実装しました。またargocd CLIではログストリームをサポートしており、 argocd app logs と打つと、Application配下の複数のPodのログを出力することができます。

  • banner feature: バナー上に通知を表示することができるようになりました。

その他

セキュリティ面では、脆弱性への対応、debianからubuntuへコンテナベースイメージの変更など行いました。

2.1

ver 2.1は2021/8/20にリリースされました。

ArgoCD Core

軽量版のArgoCD distributionとしてArgoCD Coreが発表されました。ArgoCDにはマルチテナントをサポートするため多様な機能が含まれますが、それが不要なユーザーはArgoCD Coreを利用し、必要最小限の機能だけを利用することができます。ArgoCD Coreは、ArgoCD自体の機能と、KubernetesビルトインのRBACによるアクセス制御などを提供します。

Core feature

diffing customization

ArgoCDで差分が発生してもそれを無効化するDiffingという機能があります。ver 2.1から、Diffing機能にJQパスを利用できるようになりました。

CRDに対するヘルスチェックの追加

ver 2.1で Trident / Elastic Cloud on Kubernetes / Cluster API / MinIO が追加されました。

リポジトリ登録の簡易化

これまでGitリポジトリをArgoCDに登録するには、argocd-cm ConfigMapに追加する必要がありました (argocd repo add コマンドでも可能)。それがsecretリソースを追加するだけで完了するようになりました。

Enhanced resource customaization

リソースヘルスチェックのカスタマイズが可能になりました。これまでは argocd-cmresource.customization キーを設定することで実現していました。ver 2.1では resource.customizationキーを廃止し、リソースごと(GroupKindごと?)に設定できるようにしました。これにより、kustomizeなどの管理ツールをより使いやすくなったようです。

Kubernetes Secretから秘匿情報を参照可能に

Kubernetes Secretの値をArgoCDの設定に利用することが可能になりました。 argocd-secret という名称のSecretリソースを作成する、または appkubernetes.io/part-of: argocd というラベルを付与したSecretを作成すると、別ファイルから Secretデータ情報を呼び出すことができるようになりました。

ArgoCD server processの設定

オプションとして argocd-cmd-params-cm ConfigMapが導入されました。ArgoCDは複数のサービスが連動して機能を提供しますが、それらサービスに対する設定をこのConfigMapで設定することが可能になりました。

argocd-utilの終了、argocd adminへの移行

ver 2.0で導入された argocd-util CLIが廃止され、同機能が argocd admin コマンドで提供されるようになりました。

argocd admin では、ArgoCDを管理する運用者向けのコマンドが提供されており、管理対象のクラスターのkubeconfigの出力、デプロイ前のArgoCDの設定変更のvalidate、ArgoCDオブジェクトの生成などが可能です。

UI

  • Application Listページの改善: status barの追加、検索ボックスのデザイン変更などがされました。

 

2.2

2021/12/15にリリースされました~。

Project scoped repositories and clusters

これまでのよくある運用フローとして、管理者・運用者がGitリポジトリクラスター登録を行い、開発者は新規で利用するリポジトリなどを申請する形があります。この場合、開発者が新しいリポジトリクラスターを登録したくても権限がなく、運用者の作業を待つ必要がありました。

これに対応するため、Project-scopeなリポジトリクラスターを機能として追加しました。これにより開発者は自分でリポジトリクラスターの追加を実行できるようになります。

この機能は、Project向けにRBACルールを設定して利用可能なリポジトリクラスターを制御し、開発者がRBACに適合したリソースをデプロイすることで実現できます。実際は AppProject リソース中に定義する spec.role 内でポリシーを定義することで、権限を制御するようです。

Config management plugins v2

ArgoCDでは kustomize / helmといったポピュラーなマニフェスト管理ツールと組み合わせることが可能ですが、今回リリースされる Config Management Pluginではさらに拡張可能になります。この機能ではk8sマニフェストを生成するジェネレータとしてスクリプトを利用できるようになります。

2.2ではサイドカーイメージの中でプラグインを起動します。サイドカーイメージはパッケージの依存関係をパッケージすることで、nodejs/pythonといった言語を使うこともできます。

Resource tracking

 argocdは”app.kubernetes.io/instance”というラベルによってリソースを追跡しています。これによる課題として、①ラベルとして使える文字数が63文字しかない、②他のツールがラベルを書き換えると矛盾が発生する、③1クラスターに複数ArgoCDをデプロイしたときにリソースとArgoの関係が分からない、などが出てきました。これを解決するため、新しいannotationとして argocd.argoproj.io/tracking-id を利用できるようになります。

tracking-id に変更すると、Application名だけでなくNamespaceなどの情報も追加されます。このannotationは他のKubermnetesツールとのコンフリクトは発生せず、また一つのクラスター上に複数のArgoCDを導入した場合も区別しやすくなります。

その他

その他の改善として以下のポイントが挙げられています。

  • ArgoCD RBACがregex matchをサポート: これまでの globMatch に加え、regexMatch も利用できるようになりました(こちらの例がわかりやすそうです)。

  • CRDに対するヘルスチェックの追加: あらたに KubeVirt / Cassandra / Openshift Route / Openshift DeploymentConfig / Confluent / Apache Sparkを追加しました。

  • バナー表示の位置を変更可能に: UI上のバナーの位置を画面のtop/bottomに変更可能になりました。

  • AppProjectのdestinationにCluster nameを利用可能に