🐙

Argo Workflows を Argo CD で管理しよ

2024/01/07に公開

はじめに

https://argoproj.github.io/workflows/

Argo Workflows ってどうやって導入していますか?
Argo Workflows って導入したあとどうやって管理していますか?

Argo プロジェクトには Argo CD という便利なツールがあるので Argo Workflows と組み合わせて使ってみよう!をやってみた記事となります。

Argo Workflows や Argo CD の詳細については本記事では記載しないのでご了承ください

今回 Argo Workflows を使うにあたって @makocchi さんのスライドを大いに参考しております。

https://speakerdeck.com/makocchi/how-to-use-argo-workflows

まだまだ Argo Workflows は詳しくないので今後も活用していきます。

準備

kindargo コマンドを利用します。

どちらも brew にてインストールしています。

# https://formulae.brew.sh/formula/kind
brew install kind
# https://formulae.brew.sh/formula/argo
brew install argo

kind にてローカルマシンに Kubernetes 環境を構築します。

kind create cluster

以下のコマンドにて Argo CD 環境を構築します。

kubectl create namespace argocd

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

導入

Argo Workflows を導入する方法はいくつかあります。

  • kubectl
  • helm
  • kustomize

今回は helm × Argo CD で導入します。

マニフェストは以下のようになります。

argo-workflows.yaml

---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argo-workflows
  namespace: argocd
  labels:
    environment: sample
spec:
  project: default
  source:
    path: charts/argo-workflows
    repoURL: https://github.com/argoproj/argo-helm.git
    targetRevision: argo-workflows-0.40.4
    helm:
      valuesObject:
        workflow:
          serviceAccount:
            create: true
            name: argo-workflow
          rbac:
            create: true
          controller:
            workflowNamespaces:
            - default
  syncPolicy:
    automated: {}
    syncOptions:
    - CreateNamespace=true
  destination:
    namespace: argo
    server: https://kubernetes.default.svc

kubectl にて上記マニフェストを apply すると下記のように argo-workflows がアプリケーションとして構築されます。

Argo Workflows のために namespace を helm にて同時に作成するように設定します。

  syncPolicy:
    automated: {}
    syncOptions:
    - CreateNamespace=true
  destination:
    namespace: argo
    server: https://kubernetes.default.svc

参考:https://argo-cd.readthedocs.io/en/stable/user-guide/sync-options/#create-namespace

また、ワークフローを実行するための ServiceAccount も同時に作成するように設定します。

    helm:
      valuesObject:
        workflow:
          serviceAccount:
            create: true
            name: argo-workflow
          rbac:
            create: true
          controller:
            workflowNamespaces:
            - default

参考:https://artifacthub.io/packages/helm/argo/argo-workflows#serviceaccount-for-workflow-spec

ワークフロー

examples にサンプルがたくさんあるので参考にします。
その際、以下のようにサービスアカウントを指定する必要があります。

spec:
  serviceAccountName: argo-workflow

argo submit コマンドや kubectl create コマンドにてワークフローを実行します。

下記のスクリプトにて Argo Workflows にログインします。

GUI ログインスクリプト
pod=$(kubectl --context ${CONTEXT} get pod -n argo --output json | jq -c '.items[]' | jq '.metadata.name' | grep 'server' | tr -d '"')

password=$(kubectl --context ${CONTEXT} exec -it -n argo "${pod}" -- argo auth token)
 
echo "${password}" | pbcopy

open http://localhost:2746

kubectl --context ${CONTEXT} port-forward -n argo service/argo-workflows-server 2746:2746

おわりに

ワークフローも Argo CD で管理しようかなって思いましたが
単発で実行するようなものだと思うので不要ですかね。
CronWorflows はしてもいいかもしれませんが。

あと、せっかく Argo CD で管理できたのでバージョン管理もよしなにしたいです。
stable がなさそうなのでどうしたらいいのかといった感じです。

今回実装したコードは以下に置いておきます。

https://github.com/otakakot/sample-argocd-argoworkflows

Discussion