最近業務でEKSに構成されたArgo Workflowsを使ったので実態を理解するために軽くローカル上で動かしてみました。
Kubernetesも初心者なので少しでも理解に繋がればと思ったのがきっかけです。
Argo Workflowsとは
Argo Workflowsは、Kubernetes上で並列ジョブをオーケストレーションするためのワークフローエンジンです。Argo WorkflowsはKubernetesのCRDとして実装されていてKubernetes上で動きます。バッチ実行などに向いているそう。
1.Kubernetes環境構築
ローカルにKubernetes環境を構築します。
気軽に試したいのでkind
を使用してKuberneteクラスタを作成
https://kubernetes.io/ja/docs/tasks/tools/#kind
$ kind create cluster
$ kubectl cluster-info --context kind-kind
Kubernetes control plane is running at https://127.0.0.1:49927
CoreDNS is running at https://127.0.0.1:49927/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
クラスタが構築されたか確認します。
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kind-control-plane Ready control-plane 32m v1.32.0 172.18.0.2 <none> Debian GNU/Linux 12 (bookworm) 5.15.49-linuxkit-pr containerd://1.7.24
出来てますね。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e42e9341dafc kindest/node:v1.32.0 "/usr/local/bin/entr…" 35 minutes ago Up 35 minutes 127.0.0.1:49927->6443/tcp kind-control-plane
Kubernetesのノードが、dockerのコンテナで動いてます。
kindはDockerコンテナを「ノード」として使用して、ローカル Kubernetesクラスタを実行するみたい。
2.Argo Workflowsのインストール
Argo Workflows CLIもインストールしておきます。
次にKubernetesクラスタにArgo Workflowsをインストールし、マニフェストを適用します。
$ kubectl create ns argo
namespace/argo created
$ kubectl apply -n argo -f https://github.com/argoproj/argo-workflows/releases/download/v3.6.2/install.yaml
customresourcedefinition.apiextensions.k8s.io/clusterworkflowtemplates.argoproj.io created
.
.
.
3.argoジョブの実行
これでArgo Workflowsが動く準備は整ったはずなので、早速ジョブを実行してみます。
$ argo submit -n argo --watch https://raw.githubusercontent.com/argoproj/argo-workflows/main/examples/hello-world.yaml
結果表示
Name: hello-world-vsmc4
Namespace: argo
ServiceAccount: unset (will run with the default ServiceAccount)
Status: Error
Message: Error (exit code 64): workflowtaskresults.argoproj.io is forbidden: User "system:serviceaccount:argo:default" cannot create resource "workflowtaskresults" in API group "argoproj.io" in the namespace "argo"
Conditions:
PodRunning False
Completed True
Created: Tue Dec 24 19:12:03 +0900 (10 seconds ago)
Started: Tue Dec 24 19:12:03 +0900 (10 seconds ago)
Finished: Tue Dec 24 19:12:13 +0900 (now)
Duration: 10 seconds
Progress: 0/1
ResourcesDuration: 0s*(1 cpu),4s*(100Mi memory)
STEP TEMPLATE PODNAME DURATION MESSAGE
⚠ hello-world-vsmc4 hello-world hello-world-vsmc4 4s Error (exit code 64): workflowtaskresults.argoproj.io is forbidden: User "system:serviceaccount:argo:default" cannot create resource "workflowtaskresults" in API group "argoproj.io" in the namespace "argo"
失敗しました。
Argo WorkflowsにはArgo UI
というものがあり、ブラウザからも実行が可能です。
一旦Argo UIにアクセスしてそちらから実行してみます。
$ kubectl -n argo port-forward service/argo-server 2746:2746
https://localhost:2746 にアクセス
Argo UIにもアクセスできません。どうやら認証が足りていないようです。
今回は動かすだけなので、認証を不要に設定します。
$ kubectl edit deployment argo-server -n argo
上記を実行するとvimが開くのでspec.containners.agrgs.sever
の下に以下を追加
--auth-mode=server #(認証無し)
Argo UIからジョブ実行
先ほどCLIから失敗したジョブをArgo UIからも実行してみます。(submitで実行できます)
やはり失敗します。
Argo Workflowsはエラー原因もしっかり表示してくれるので安心。
submit時にServiceAccountの指定を省略した場合にはKubernetesが提供しているdefault
のServiceAccountが使用されるらしく、default
には十分な権限が無いのが原因のようですね。
権限設定の方法はいくつかあるみたいですが、今回は以下でdefault
に管理者権限を付与する方向で進めさせていただきました。
$ kubectl create rolebinding default-admin --clusterrole=admin --serviceaccount=argo:default -n argo
4.結果
無事成功し、CLI・UIどちらからもジョブ実行できること確認できました!
Name: hello-world-7g66f
Namespace: argo
ServiceAccount: unset (will run with the default ServiceAccount)
Status: Succeeded
Conditions:
PodRunning False
Completed True
Created: Tue Dec 24 21:27:53 +0900 (11 seconds ago)
Started: Tue Dec 24 21:27:54 +0900 (10 seconds ago)
Finished: Tue Dec 24 21:28:04 +0900 (now)
Duration: 10 seconds
Progress: 1/1
ResourcesDuration: 0s*(1 cpu),4s*(100Mi memory)
STEP TEMPLATE PODNAME DURATION MESSAGE
✔ hello-world-7g66f hello-world hello-world-7g66f 4s
まとめ
- すごい軽いお試し実行だけどやはり動くと嬉しい
- 権限周りで結構ハマった。RBAC機能からRoleBindingして新たなServiceAccountの作成もできるみたい
- Argo CDというCDツールを使って自動でマニフェスト生成しクラスタに同期することもできるようで、EKSも含めまた使ってみたい