suzuki-shunsuke / issue

MIT License
4 stars 0 forks source link

Argo Workflow 検証 #34

Closed suzuki-shunsuke closed 4 years ago

suzuki-shunsuke commented 4 years ago

Getting Started

https://argoproj.github.io/docs/argo/demo.html

ローカルでサンプルを動かす。

kind だと動かない

k8s クラスタが必要だが、 kind だと動かないので minikube を使う。

https://github.com/kubernetes-sigs/kind/issues/1002#issuecomment-545498176

kind だと dockerd を起動していないので、 docker socket をマウントできない。

Argo 自体は起動するのだが、 workflow を submit したところ、起動に失敗していた。 workflow の起動に失敗した場合、 $ kubectl describe pod で原因が分かったりする。

  Warning  FailedMount  17s (x8 over 80s)  kubelet, argo-control-plane  MountVolume.SetUp failed for volume "docker-lib" : hostPath type check failed: /var/lib/docker is not a directory
  Warning  FailedMount  17s (x8 over 80s)  kubelet, argo-control-plane  MountVolume.SetUp failed for volume "docker-sock" : hostPath type check failed: /var/run/docker.sock is not a socket file

Minikube のインストール

https://minikube.sigs.k8s.io/docs/start/macos/

$ brew install minikube
$ minikube config set vm-driver hyperkit
$ minikube start

Mac で Docker 使ってたら hyperkit はあるはず。 Hyperkit については https://www.publickey1.jp/blog/16/docker_hyperkit.html

Argo Install

$ brew install argoproj/tap/argo
$ kubectl create ns argo
$ kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo/v2.2.1/manifests/install.yaml

サンプルがそのままだと動かない場合は manifest をダウンロードして修正して apply 自分の場合、 manifest の API バージョンが k8s cluster がサポートしていなかった。 "apps/v1beta2" を apps/v1 に修正した。

https://github.com/kubernetes/kubernetes/issues/55894#issuecomment-379497517

サービスアカウントに権限を付与する

$ kubectl create rolebinding default-admin --clusterrole=admin --serviceaccount=default:default

Argo UI をブラウザで見れるようにする

$ kubectl -n argo port-forward deployment/argo-ui 8001:8001

サンプルを実行する。 --watch をつけるとターミナルに延々と出力されて鬱陶しいのでつけない。

$ argo submit https://raw.githubusercontent.com/argoproj/argo/master/examples/hello-world.yaml

Argo UI で結果が確認できる。 Argo UI には認証がない。また、UIは read only といった感じで workflow のキャンセルや再実行ということは出来なそう。 Argo CLI を使えばキャンセルはできる。

Install an Artifact Repository

ファイルを共有するには Artifact を外部ストレージに保存する必要がある。 S3 などに対応しているが、サンプルでは MinIO を使っている。 Helm でインストールする

Helm のインストール

$ brew install helm

MinIO のインストール

https://github.com/helm/charts/tree/master/stable/minio

Chart repository の追加

https://helm.sh/docs/intro/quickstart/

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/

helm install コマンドも修正が必要だった。 --name がなくなり、 name が必須の引数になったらしい。

https://stackoverflow.com/questions/57961162/helm-install-unknown-flag-name

$ helm install argo-artifacts stable/minio \
  --set service.type=LoadBalancer \
  --set defaultBucket.enabled=true \
  --set defaultBucket.name=my-bucket \
  --set persistence.enabled=false

Reconfigure the workflow controller to use the Minio artifact repository

Argo の Workflow Controller が MinIO を使えるように設定を kubectl edit で変更する。 ここも公式ドキュメントの修正が必要だった。

secret 名や service 名が argo-artifacts ではなく argo-artifacts-minio だった。

スクリーンショット

実行履歴

image

image

image

Workflow の manifest も確認できる

image

Workflow のログ

image

suzuki-shunsuke commented 4 years ago

検討すべきワークロード

CI

suzuki-shunsuke commented 4 years ago

ジョブの実行ログの永続化

できそうだけど、ドキュメントはないかも。


suzuki-shunsuke commented 4 years ago
$ minikube start
$ kubectl create namespace argo
$ kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo/release-2.5/manifests/quick-start-postgres.yaml
$ kubectl port-forward -n argo service/argo-server 2746:2746
$ kubectl port-forward -n argo service/minio 9000:9000
$ kubectl -n argo exec -ti deployment/postgres -- psql -U postgres -d postgres