Argo Workflowをローカル環境で使ってみる
Argo について
Argoはコンテナベースのワークフローエンジンで,ワークフローの各ステップをコンテナとして実装することを可能にします.
つまり,各ステップはdockerのイメージを使用して実行されます.
また,ワークフローはCustom Resource Definitionで定義します.
そのため,kubenetesのマニフェスト管理と同様にhelmなどを用いてワークフロー自体を管理することができます.
GoogleやGithub,PFNなど世界でも有数の企業がArgoを使用しています.
Argo公式ブログがより詳しいです.
Introducing Argo — A Container-Native Workflow Engine for Kubernetes
Argoのインストール
Argoを導入するための下準備
ここではminikubeを使って,kubenetesのクラスタをローカルに構築します.
minikubeを使うことでGoogle Kubenetes Engineなどを使うことなく無料でkubenetesクラスタを構築できます.
手元で試したいときに非常に便利ですね.
minikubeのインストールはHomebrewで一発完了です.
brew cask install minikube minikube version
minikubeを起動してみましょう.
minikube start
初めての起動が正常にいけば以下のような表示がえられるでしょう.
次にkubectlでコンテキストを確認してkubectlがminikubeに向いていることを確認できたらminikubeの導入は完了です.
kubectl config current-context
Argoのインストール
これでArgoをインストールする準備は整いました.
まず,はじめにArgo CLIをインストールします.
brew install argoproj/tap/argo argo version
次に,Namespaceを作り,argoのmanifestを反映します.
kubectl create ns argo kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo/v2.2.1/manifests/install.yaml
次に default
サービスアカウントに権限を付与します.
これをしないと,Argo Workflowの一部の機能(ファイル出力,secretへのアクセスなど)が使えません.
kubectl create rolebinding default-admin --clusterrole=admin --serviceaccount=default:default
ここまでくれば導入完了も同然です. port forwardをしてargo UIにアクセスしてみましょう.
kubectl -n argo port-forward deployment/argo-ui 8001:8001
http://localhost:8001/workflows
では,実際にworkflowを実行してみましょう.
argo submit --watch https://raw.githubusercontent.com/argoproj/argo/master/examples/hello-world.yaml
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: hello-world- spec: entrypoint: whalesay templates: - name: whalesay container: image: docker/whalesay:latest command: [cowsay] args: ["hello world"]
このworkflowでは dockerのwhalesayイメージを指定し,cowsayコマンドを実行します.
watchオプションをつけることで実行状況をterminal上で監視できます.
workflowは一つのpodとして実行されるので argo list
または kubectl get po
で一覧を取得することができます.
実行したworkflowはもちろんargo UIからも確認できます.
workflowをクリックすることで詳細を確認できます.
YAML
からsubmitしたworkflow,logからworkflowからの標準出力を確認することができます.
次は別のworkflowの例です.
argo submit --watch https://raw.githubusercontent.com/argoproj/argo/master/examples/coinflip-recursive.yaml
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: coinflip-recursive- spec: entrypoint: coinflip templates: - name: coinflip steps: - - name: flip-coin template: flip-coin - - name: heads template: heads when: "{{steps.flip-coin.outputs.result}} == heads" - name: tails template: coinflip when: "{{steps.flip-coin.outputs.result}} == tails" - name: flip-coin script: image: python:alpine3.6 command: [python] source: | import random result = "heads" if random.randint(0,1) == 0 else "tails" print(result) - name: heads container: image: alpine:3.6 command: [sh, -c] args: ["echo \"it was heads\""]
このworkflowでは,前回ステップの結果をもとに次のステップを変更しています.
また,templateを定義し,再利用することができます.
初めのステップでpythonのdockerイメージからrandintを実行します.
その結果を次のステップの when
で受け取り,条件によってはもう一度同じテンプレートからステップを実行します.
これによって再帰的にステップを実行することも可能です.
今回はローカルにインストールしたminukubeにArgoをインストールし,2つの例を実行しました.
Argoでできることはここで紹介したことにとどまりません.
次回以降,豊富なworkflow例と共にcookbookを作成・紹介していきたいと思っているので引き続きよろしくお願いします.