mojaie.github.io

Argoの環境構築(MacOS)

Last modified: June 09, 2020

Dockerのインストール

Docker desktopをインストールしてデーモンを起動しておきます。

Minikubeのインストール

(2020.06.05追記) Docker desktopにkubernetesが含まれるので、minikubeをインストールしなくても、Docker desktopのPreferences->Kubernetes->Enable Kubernetesにチェックを入れるとkubernetesが使えます。その場合、以下スキップして「Argoのインストール」に進みます。

下記を参考にMinikubeをインストールします。HomeBrewを使うと楽です。
https://minikube.sigs.k8s.io/docs/start/
https://kubernetes.io/ja/docs/tasks/tools/install-minikube/

$ brew update
$ brew install minikube

minikube startするとhyperkit(Docker desktopに含まれる)のドライバとkubectlが自動的にインストールされます。

$ minikube start
😄  Darwin 10.15.4 上の minikube v1.10.1
✨  Automatically selected the hyperkit driver
💾  docker-machine-driver-hyperkit ドライバをダウンロードしています:
    > docker-machine-driver-hyperkit.sha256: 65 B / 65 B [---] 100.00% ? p/s 0s
    > docker-machine-driver-hyperkit: 10.90 MiB / 10.90 MiB  100.00% 29.23 KiB 
🔑  The 'hyperkit' driver requires elevated permissions. The following commands will be executed:

    $ sudo chown root:wheel /Users/username/.minikube/bin/docker-machine-driver-hyperkit 
    $ sudo chmod u+s /Users/username/.minikube/bin/docker-machine-driver-hyperkit 

Password:

sudoコマンドのパスワードを入力します。

💿  VM ブートイメージをダウンロードしています...
    > minikube-v1.10.0.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
    > minikube-v1.10.0.iso: 174.99 MiB / 174.99 MiB [] 100.00% 8.27 MiB p/s 21s
👍  Starting control plane node minikube in cluster minikube
💾  Kubernetes v1.18.2 のダウンロードの準備をしています
    > preloaded-images-k8s-v3-v1.18.2-docker-overlay2-amd64.tar.lz4: 525.43 MiB
🔥  Creating hyperkit VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
🐳  Docker 19.03.8 で Kubernetes v1.18.2 を準備しています...
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube"

仮想環境を終了するときはminikube stop

$ minikube stop

minikubeのdocker環境を確認します。

$ minikube -p minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.64.2:2376"
export DOCKER_CERT_PATH="/Users/username/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

# To point your shell to minikube's docker-daemon, run:
# eval $(minikube -p minikube docker-env)

minikubeのDockerデーモンを再利用してローカルのDockerイメージを使えるようにします。 一旦設定すればDocker desktop.Appを起動しなくてもminikube startで自動的にminikubeのDockerデーモンをターミナルから使えるようになります。

$ eval $(minikube -p minikube docker-env)

ダッシュボードを起動

$ minikube dashboard

Argoのインストール

getting started
https://argoproj.github.io/docs/argo/getting-started.html

これもHomeBrewで入れます。

$ brew install argoproj/tap/argo

Argoの名前空間を作成します。

$ kubectl create namespace argo
namespace/argo created

Argoをインストールします。

$ kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo/stable/manifests/install.yaml
customresourcedefinition.apiextensions.k8s.io/clusterworkflowtemplates.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/cronworkflows.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/workflows.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/workflowtemplates.argoproj.io created
serviceaccount/argo created
serviceaccount/argo-server created
role.rbac.authorization.k8s.io/argo-role created
clusterrole.rbac.authorization.k8s.io/argo-aggregate-to-admin created
clusterrole.rbac.authorization.k8s.io/argo-aggregate-to-edit created
clusterrole.rbac.authorization.k8s.io/argo-aggregate-to-view created
clusterrole.rbac.authorization.k8s.io/argo-cluster-role created
clusterrole.rbac.authorization.k8s.io/argo-server-cluster-role created
rolebinding.rbac.authorization.k8s.io/argo-binding created
clusterrolebinding.rbac.authorization.k8s.io/argo-binding created
clusterrolebinding.rbac.authorization.k8s.io/argo-server-binding created
configmap/workflow-controller-configmap created
service/argo-server created
service/workflow-controller-metrics created
deployment.apps/argo-server created
deployment.apps/workflow-controller created

defaultネームスペースでadminを設定します。

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

ArgoのexampleのページにあるworkflowのYAMLファイル例(hello-world.yaml)をカレントフォルダに置きます。

apiVersion: argoproj.io/v1alpha1
kind: Workflow                  # new type of k8s spec
metadata:
  generateName: hello-world-    # name of the workflow spec
spec:
  entrypoint: whalesay          # invoke the whalesay template
  templates:
  - name: whalesay              # name of the template
    container:
      image: docker/whalesay
      command: [cowsay]
      args: ["hello world"]
      resources:                # limit the resources
        limits:
          memory: 32Mi
          cpu: 100m

ワークフローをサブミット

$ argo submit -n argo hello-world.yaml

あるいはWeb上のリソースから直接submitできます。

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

実施中のジョブ一覧を確認

$ argo list -n argo
NAME                STATUS      AGE   DURATION   PRIORITY
hello-world-wzvfd   Succeeded   38s   8s         0

実施中のジョブの状態を確認

$ argo get -n argo hello-world-wzvfd
Name:                hello-world-wzvfd
Namespace:           default
ServiceAccount:      default
Status:              Succeeded
Conditions:          
 Completed           True
Created:             Sun May 24 23:38:07 +0900 (20 seconds ago)
Started:             Sun May 24 23:38:07 +0900 (20 seconds ago)
Finished:            Sun May 24 23:38:15 +0900 (12 seconds ago)
Duration:            8 seconds

STEP                  TEMPLATE  PODNAME            DURATION  MESSAGE
 ✔ hello-world-wzvfd  whalesay  hello-world-wzvfd  6s   

結果を確認

$ argo logs -n argo hello-world-wzvfd 
hello-world-wzvfd:  _____________ 
hello-world-wzvfd: < hello world >
hello-world-wzvfd:  ------------- 
hello-world-wzvfd:     \
hello-world-wzvfd:      \
hello-world-wzvfd:       \     
hello-world-wzvfd:                     ##        .            
hello-world-wzvfd:               ## ## ##       ==            
hello-world-wzvfd:            ## ## ## ##      ===            
hello-world-wzvfd:        /""""""""""""""""___/ ===        
hello-world-wzvfd:   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
hello-world-wzvfd:        \______ o          __/            
hello-world-wzvfd:         \    \        __/             
hello-world-wzvfd:           \____\______/   

ジョブの削除

$ argo delete -n argo hello-world-wzvfd
Workflow 'hello-world-wzvfd' deleted

Webで管理

$ argo -n argo server

Minioのインストール

(2020.06.09時点)公式チュートリアルの最新版がまだサイトに反映されていません。以下PR参照
https://github.com/argoproj/argo/pull/3099/files

ワークフローの各ステップの結果を一時的に保存するために、S3互換のオブジェクトストレージが必要です。マニュアルに従ってhelmからMinioをインストールします。

$ brew install helm
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
$ helm repo update
$ helm install argo-artifacts stable/minio \
  -n argo \
  --set service.type=LoadBalancer \
  --set defaultBucket.enabled=true \
  --set defaultBucket.name=my-bucket \
  --set persistence.enabled=false \
  --set fullnameOverride=argo-artifacts \

  NAME: argo-artifacts
  LAST DEPLOYED: Tue Jun  9 11:58:41 2020
  NAMESPACE: argo
  STATUS: deployed
  REVISION: 1
  TEST SUITE: None
  NOTES:
  Minio can be accessed via port 9000 on an external IP address. Get the service external IP address by:
  kubectl get svc --namespace argo -l app=argo-artifacts

  Note that the public IP may take a couple of minutes to be available.

  You can now access Minio server on http://<External-IP>:9000. Follow the below steps to connect to Minio server with mc client:

    1. Download the Minio mc client - https://docs.minio.io/docs/minio-client-quickstart-guide

    2. mc config host add argo-artifacts-local http://<External-IP>:9000 AKIAIOSFODNN7EXAMPLE wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY S3v4

    3. mc ls argo-artifacts-local

  Alternately, you can use your browser or the Minio SDK to access the server - https://docs.minio.io/categories/17

argo-artifactのサービスのIPとPORTを確認します。

$ kubectl get service argo-artifacts -o wide -n argo
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
argo-artifacts   LoadBalancer   10.105.220.48   localhost     9000:32283/TCP   94s

minioのWebインターフェースにアクセスすると、デフォルトバケット(my-bucket)が作成されています。

argo/workflow-controller-configmapを編集します。公式チュートリアルの記述に従い、configmapに以下を追記します。

data:
  artifactRepository: |
    s3:
      bucket: my-bucket
      endpoint: argo-artifacts:9000
      insecure: true
      # accessKeySecret and secretKeySecret are secret selectors.
      # It references the k8s secret named 'argo-artifacts'
      # which was created during the minio helm install. The keys,
      # 'accesskey' and 'secretkey', inside that secret are where the
      # actual minio credentials are stored.
      accessKeySecret:
        name: argo-artifacts
        key: accesskey
      secretKeySecret:
        name: argo-artifacts
        key: secretkey

あるいは、上記を追記したconfigmapのyamlファイルを作っておいてapplyします。その場合、元のconfigmapに記載されているオブジェクト固有情報のフィールド(creationTimestamp, resourceVersion, uid)は消しておきます。

kubectl apply -n argo -f workflow-controller-configmap.yaml

チュートリアルのartifact-passing.yamlを実行します。

$ argo submit -n argo https://raw.githubusercontent.com/argoproj/argo/master/examples/artifact-passing.yaml

Name:                artifact-passing-58v85
Namespace:           argo
ServiceAccount:      default
Status:              Pending
Created:             Tue Jun 09 20:37:56 +0900 (now)

$ argo get -n argo artifact-passing-58v85
Name:                artifact-passing-58v85
Namespace:           argo
ServiceAccount:      default
Status:              Succeeded
Conditions:          
 Completed           True
Created:             Tue Jun 09 20:37:56 +0900 (23 seconds ago)
Started:             Tue Jun 09 20:37:56 +0900 (23 seconds ago)
Finished:            Tue Jun 09 20:38:14 +0900 (5 seconds ago)
Duration:            18 seconds

STEP                       TEMPLATE          PODNAME                            DURATION  MESSAGE
 ✔ artifact-passing-58v85  artifact-example                                                 
 ├---✔ generate-artifact   whalesay          artifact-passing-58v85-1826744750  7s          
 └---✔ consume-artifact    print-message     artifact-passing-58v85-2028663838  8s   

Author: Seiji Matsuoka