カシミアのニット

カシミヤのニット

日々のメモです

Argo Workflowをローカル環境で使ってみる

Argo について

github.com

Argoはコンテナベースのワークフローエンジンで,ワークフローの各ステップをコンテナとして実装することを可能にします.

つまり,各ステップはdockerのイメージを使用して実行されます.

また,ワークフローはCustom Resource Definitionで定義します.

そのため,kubenetesのマニフェスト管理と同様にhelmなどを用いてワークフロー自体を管理することができます.

GoogleGithub,PFNなど世界でも有数の企業がArgoを使用しています.

f:id:lapis_zero09:20190303011345p:plain
https://github.com/argoproj/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

初めての起動が正常にいけば以下のような表示がえられるでしょう.

f:id:lapis_zero09:20190228163904p:plain
minikube start

次にkubectlでコンテキストを確認してkubectlがminikubeに向いていることを確認できたらminikubeの導入は完了です.

kubectl config current-context

f:id:lapis_zero09:20190228164041p:plain
kubectl config current-context の結果

Argoのインストール

これでArgoをインストールする準備は整いました.

まず,はじめにArgo CLIをインストールします.

brew install argoproj/tap/argo
argo version

f:id:lapis_zero09:20190228165031p:plain
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

f:id:lapis_zero09:20190302235212p:plain
argoのmanifestを反映したところ

次に 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

f:id:lapis_zero09:20190303001148p:plain
argo UI

では,実際に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上で監視できます.

f:id:lapis_zero09:20190303002039p:plain
argo submit watchの表示

workflowは一つのpodとして実行されるので argo list または kubectl get po で一覧を取得することができます.

f:id:lapis_zero09:20190303002652p:plain
submitしたworkflow一覧

実行したworkflowはもちろんargo UIからも確認できます.

f:id:lapis_zero09:20190303002237p:plain
argo UIでworkflowの確認

workflowをクリックすることで詳細を確認できます.

f:id:lapis_zero09:20190303002801p:plain
workflow詳細

YAML からsubmitしたworkflow,logからworkflowからの標準出力を確認することができます.

f:id:lapis_zero09:20190303003057p:plain
workflowのlog

次は別の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 で受け取り,条件によってはもう一度同じテンプレートからステップを実行します.

これによって再帰的にステップを実行することも可能です.

f:id:lapis_zero09:20190303005447p:plain
再帰workflow

今回はローカルにインストールしたminukubeにArgoをインストールし,2つの例を実行しました.

Argoでできることはここで紹介したことにとどまりません.

次回以降,豊富なworkflow例と共にcookbookを作成・紹介していきたいと思っているので引き続きよろしくお願いします.

参考