Argo とはなんだ？

Argo(アルゴ）は、2020年4月にCNCFのインキューベーション・プロジェクトになった。筆者が所属するIBMでも、注目のプロジェクトで適用が始まっているので、その概要について調べてみた。


## アルゴとは

アルゴプロジェクトは、ワークフロー、デプロイ、ロールアウト、およびイベントなど、ジョブやアプリケーションをデプロイし、実行するためのKubernetes-ネイティブツールのセットだ。継続的デリバリー、累進的デリバリーなどの **GitOps** パラダイムによって、Kubernetesで**MLOps** つまり機械学習のDevOps基盤を推進する。


アルゴ プロジェクトは、CNCFが支援するプロジェクトであり。この活動は複数あるが、本記事では、主要な4つのグループを取り上げる。

1. アルゴ ワークフロー (Argo Workflow)
2. アルゴ CD (Argo CD (Continuous Development))
3. アルゴ ロールアウト (Argo Rollouts)
4. アルゴ イベント (Argo Events)

![argo-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/1626a739-4b42-ae80-39ce-b3dc2e1766d3.png)


Tekton Pipeline や Trigger のタスクの１ステップに、アルゴを組み込むことができるので、Tektonのトリガーで受けた git push の イベントから、Argo CDにつないでアプリケーションの状態管理など、連携運用も可能である。

Argoは、2017年にApplatixで開発された。その後、Applatixは2018年にIntuitによって買収された。2020年4月にCNCFのインキューベーション・プロジェクトになった。


参考資料:
* https://argoproj.github.io/
* https://github.com/argoproj/
* YouTube Argo Channel, https://www.youtube.com/channel/UCOvYmppcbOPm1viN6ust3lA
* OperatorHub Argo CD, https://operatorhub.io/operator/argocd-operator
* CI/CD With Argo On Kubernetes, https://medium.com/axons/ci-cd-with-argo-on-kubernetes-28c1a99616a9
* https://blog.argoproj.io/argo-goes-to-cncf-incubator-f0e9dfb40597
* Google Cloudが機械学習の工程パイプラインを作るツールを提供, https://jp.techcrunch.com/2020/03/12/2020-03-11-google-cloud-launches-new-mlops-tools-for-deploying-ml-pipelines/



## アルゴ ワークフロー (Argo Workflow)

アルゴ ワークフローは、機械学習などの複雑なバッチ処理のスケジューラーとして利用されている。学習用データのセットの生成、後続のデープラーニングの処理などで利用されている。これは Kubernetes 上の並列ジョブのためのワークフローエンジンである。 これはカスタムリソース定義(CRD)によって実装され、次の様な特徴がある。

* ワークフローは、個々のタスクのステップをコンテナで構成するため、開発言語や環境からの制約が少ない画期的な実行基盤である。
* 複数タスクの連なり、または、有向非巡回グラフ（DAG）によってタスク間の依存関係を導出して、ワークフローの実行モデルを構成する。
* アルゴ ワークフローは、断片的な時間で、機械学習やデータ処理の計算集中型ジョブを簡単に実行できる。
* ソフトウェア製品の複雑な構成をおこなうこと無く、CICDパイプラインをKubernetes上で実現する。

[IBM Cloud で Argo workflow を動かす時の課題とOperatorによる対処法](https://qiita.com/MahoTakara/items/a2d4e041cf3b6a295869)も合わせてご覧ください。

![スクリーンショット 2020-07-27 15.59.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/c78e4171-6d50-d73b-3baa-31adab75a3ef.png)


#### はじめかたのリンク

* チュートリアル https://github.com/argoproj/argo/blob/master/docs/quick-start.md
* ワークフローのサンプル, https://argoproj.github.io/argo/examples/
* インストール, https://argoproj.github.io/argo/installation/
* https://github.com/argoproj/argo
* https://blog.argoproj.io/artifacts-management-in-container-native-workflows-part-1-f6efa838666b




## アルゴ CD (Argo CD (Continouse Development))

アルゴCDは、目的とする環境で、アプリケーションが目的とする状態となるように、デプロイを自動化する。 デプロイするアプリケーションのブランチによる更新を追跡、タグ、Gitコミット時のマニフェストの特定バージョンへの固定などがある。

アルゴCDは、Kubernetesコントローラとして実装され、アプリケーションの動作を継続的にモニターして、現在状態から目的とする状態へ変えていく。Gitリポジトリを通じて状態を設定する。 デプロイされたアプリケーションの現状が、目的とする状態から外れることを OutOfSync (同期外）とみなす。 アルゴCDは、目的とする状態と現状の差異を視覚化しレポートする。現状を目的の状態にするために、自動的同期または手動同期の手段を提供する。 Gitリポジトリでターゲット状態へ加えられた変更は、自動的に適用され、指定されたターゲット環境へ反映される。
アルゴCDは、アプリケーションの目的状態の定義をGitリポジトリを使うことで、GitOpsパターンに従う。 Kubernetesマニフェストは幾つかの方法で指定できる。

* kustomize:  kustomize は、Kubernetes の YAML をソースにして、目的にカスタマイズした YAML を生成する。
* helmチャート: helm は Kubernetes のパッケージマネージャーで、YAML形式のマニフェスト一式をパッケージした一塊をチャートと呼ぶ。
* ksonnet: Kubernetes マニフェストの記述、共有、デプロイのフレームワークで、CLIによってアプリケーションのマニフェストを簡単に生成する。プロジェクトは終了
* jsonnet: Json のテンプレートエンジン
* プレーンな YAML/Json マニフェスト

さらに具体的な記事を書きましたので、「[Argo CD の GitOpsを確認してみた](https://qiita.com/MahoTakara/items/b52c2bdd1243c8190ee9)」ご参照ください。

![スクリーンショット 2020-07-27 15.49.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/ab2a3b25-3d33-c2c1-3ad7-2caa1812ffb5.png)



#### はじめかたのリンク

* Argo-CD Getting Started, https://github.com/argoproj/argo-cd/blob/master/docs/getting_started.md
* Getting Started, https://argoproj.github.io/argo-cd/getting_started/
* Introduction to Argo CD : Kubernetes DevOps CI/CD, https://github.com/argoproj/argo-cd
* Getting Started with ArgoCD on OpenShift 4, https://www.youtube.com/watch?v=xYCX2EejSMc




## アルゴ ロールアウト (Argo Rollouts)

Argoロールアウトは、KubernetesコントローラとCRDのセットであり、ブルー・グリーン・デプロイ、カナリアリリース、カナリア分析、実験的配信など、Kubernetesへの段階的な配信などの高度なデプロイ機能を提供する。

Argoロールアウトは、イングレスコントローラーおよびサービスメッシュと統合し、ロールアウト中にシェーピング機能を利用してトラフィックを新しいバージョンに徐々にシフトする。さらに、ロールアウトは、さまざまなプロバイダーからのメトリックを参照および解釈して、主なKPIを検証し、ロールアウト時に、自動昇格またはロールバックを進める。


#### はじめたかのリンク
* Getting Started, https://argoproj.github.io/argo-rollouts/getting-started/
* Roleout Demo, https://github.com/argoproj/rollouts-demo
* https://github.com/argoproj/argo-rollouts
* https://www.youtube.com/watch?v=2WSJF7d8dUg



## アルゴ イベント (Argo Events)

Argo イベントは、Kubernetesのイベント駆動型ワークフロー自動化フレームワークで、webhook、s3、スケジュール、メッセージングキュー、gcp pubsub、sns、sqsなどのさまざまなソースからのイベントで、K8sオブジェクト、Argoワークフロー、サーバーレスワークロードなどをトリガーするのに役立ち、以下の特徴がある。

* 20以上のイベントソースからのイベントをサポート
* ワークフロー自動化のためにビジネスレベルの制約ロジックをカスタマイズ
* シンプルな線形のリアルタイムから複雑なマルチソースイベントまで、すべてを管理
* トリガーとしてKubernetesオブジェクト、Argoワークフロー、AWS Lambda、サーバーレスなどをサポート
* CloudEventsに準拠

#### トリガー対象のイベント

* Argo Workflows
* Standard K8s Objects
* HTTP Requests / Serverless Workloads (OpenFaas, Kubeless, KNative etc.)
* AWS Lambda
* NATS Messages
* Kafka Messages
* Slack Notifications
* Argo Rollouts
* Custom Trigger / Build Your Own Trigger
* Apache OpenWhisk

具体的な活用例として「[Argo Events と Workflow の連携](https://qiita.com/MahoTakara/items/2a1473fe211b5fbc393d)」のリンクもご参照願います。

![screenshot-argo-events.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/2ba99cba-ec42-f915-2957-cf506ef0acc6.png)



#### はじめたかのリンク

* Introduction、https://argoproj.github.io/argo-events/tutorials/01-introduction/
* https://github.com/argoproj/argo-events
* YouTube,TGI Kubernetes 111: CloudEvents and Argo Events, https://youtu.be/LQbBgQnUs_k?t=1151

以上