つい先日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
Projectは Application
の論理的グループを提供する機能で、複数チームが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
ApplicationSetはk8s 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-cm
に resource.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を利用可能に