ArgoCDでHelmfileを使う

  #cicd #kubernetes

ArgoCD上でHelmfileを使いたい。

概要

ArgoCDはmanifestの管理方法として下記ツールをサポートしている。

Helmfileなどその他ツールを利用したい場合、Config Management Pluginにより実現する。
Config Management Pluginとは、manifest生成のために任意のバイナリやスクリプトを実行する機能のこと。
設定方法は2ステップ。

Step1: argocd-repo-serverに該当ツールを配置する
manifest生成はargocd-repo-server上で行われるため、argocd-repo-serverのmanifestを変更する。
ツールの配置方法は2通り。

  1. Volume Mounts経由でツールを配置する
  2. BYOI (Build Your Own Image) を作成する

Step2: pluginとして登録する
argocd-cmにプラグイン情報を追記する。

やってみる

Volume Mounts方式とBYOI方式両方やってみる。
サンプルリポジトリはこちら、node-exporterを仕込むだけ。
https://github.com/kobtea/manifests/tree/298ea914831eac84f2e82c08a75566921efab1d2/helmfile/node-exporter

Volume Mounts方式

pluginを公開している方がいるので感謝しながら使う。
https://github.com/travisghansen/argo-cd-helmfile
init containerでwrapper scriptとhelmfileをdownloadして、empty dir経由でargocd-repo-server podへ渡している。
manifestはREADMEをなぞるだけ。

diffは主要な箇所のみ記載する。

$ kubectl -n argocd diff -f argocd-repo-server.vm.yaml
diff -u -N /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/LIVE-097769223/apps.v1.Deployment.argocd.argocd-repo-server /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/MERGED-018972858/apps.v1.Deployment.argocd.argocd-repo-server
--- /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/LIVE-097769223/apps.v1.Deployment.argocd.argocd-repo-server	2021-05-08 08:44:57.000000000 +0900
+++ /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/MERGED-018972858/apps.v1.Deployment.argocd.argocd-repo-server	2021-05-08 08:44:57.000000000 +0900
# ...
@@ -302,7 +334,31 @@
           name: gpg-keyring
         - mountPath: /app/config/reposerver/tls
           name: argocd-repo-server-tls
+        - mountPath: /usr/local/bin/argo-cd-helmfile.sh
+          name: custom-tools
+          subPath: argo-cd-helmfile.sh
+        - mountPath: /usr/local/bin/helmfile
+          name: custom-tools
+          subPath: helmfile
       dnsPolicy: ClusterFirst
+      initContainers:
+      - args:
+        - wget -qO /custom-tools/argo-cd-helmfile.sh https://raw.githubusercontent.com/travisghansen/argo-cd-helmfile/master/src/argo-cd-helmfile.sh
+          && chmod +x /custom-tools/argo-cd-helmfile.sh && wget -qO /custom-tools/helmfile
+          https://github.com/roboll/helmfile/releases/download/v0.138.7/helmfile_linux_amd64
+          && chmod +x /custom-tools/helmfile
+        command:
+        - sh
+        - -c
+        image: alpine:3.8
+        imagePullPolicy: IfNotPresent
+        name: download-tools
+        resources: {}
+        terminationMessagePath: /dev/termination-log
+        terminationMessagePolicy: File
+        volumeMounts:
+        - mountPath: /custom-tools
+          name: custom-tools
       restartPolicy: Always
       schedulerName: default-scheduler
       securityContext: {}
@@ -334,6 +390,8 @@
             path: ca.crt
           optional: true
           secretName: argocd-repo-server-tls
+      - emptyDir: {}
+        name: custom-tools
 status:
   availableReplicas: 1
   conditions:


$ kubectl -n argocd diff -f argocd-cm.vm.yaml | pbcopy
diff -u -N /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/LIVE-351111144/v1.ConfigMap.argocd.argocd-cm /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/MERGED-911034919/v1.ConfigMap.argocd.argocd-cm
--- /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/LIVE-351111144/v1.ConfigMap.argocd.argocd-cm	2021-05-08 08:49:16.000000000 +0900
+++ /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/MERGED-911034919/v1.ConfigMap.argocd.argocd-cm	2021-05-08 08:49:17.000000000 +0900
@@ -1,4 +1,13 @@
 apiVersion: v1
+data:
+  configManagementPlugins: |
+    - name: helmfile
+      init:                          # Optional command to initialize application source directory
+        command: ["argo-cd-helmfile.sh"]
+        args: ["init"]
+      generate:                      # Command to generate manifests YAML
+        command: ["argo-cd-helmfile.sh"]
+        args: ["generate"]
 kind: ConfigMap
 metadata:
   annotations:
# ...

appを作成してみる。

$ argocd app create node-exporter \
--repo https://github.com/kobtea/manifests.git \
--path helmfile/node-exporter \
--dest-namespace default \
--dest-server https://kubernetes.default.svc \
--config-management-plugin helmfile
$ argocd app sync node-exporter
$ argocd app list
NAME           CLUSTER                         NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                                 PATH                    TARGET
guestbook      https://kubernetes.default.svc  default    default  Synced  Healthy  <none>      <none>      https://github.com/argoproj/argocd-example-apps.git  guestbook               HEAD
node-exporter  https://kubernetes.default.svc  default    default  Synced  Healthy  <none>      <none>      https://github.com/kobtea/manifests.git              helmfile/node-exporter

BYOI方式

ChatworkがまさにそれなDocker Imageを公開しているので感謝しながら使う。
https://hub.docker.com/r/chatwork/argocd-helmfile
こちらもREADMEをなぞるだけ。

$ kubectl -n argocd diff -f argocd-repo-server.byoi.yaml
diff -u -N /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/LIVE-612236984/apps.v1.Deployment.argocd.argocd-repo-server /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/MERGED-918040247/apps.v1.Deployment.argocd.argocd-repo-server
--- /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/LIVE-612236984/apps.v1.Deployment.argocd.argocd-repo-server	2021-05-08 09:10:24.000000000 +0900
+++ /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/MERGED-918040247/apps.v1.Deployment.argocd.argocd-repo-server	2021-05-08 09:10:24.000000000 +0900
# ...
@@ -255,7 +244,7 @@
         - argocd-repo-server
         - --redis
         - argocd-redis:6379
-        image: quay.io/argoproj/argocd:v2.0.0
+        image: chatwork/argocd-helmfile:2.0.0-0.138.7
         imagePullPolicy: Always
         livenessProbe:
           failureThreshold: 3


$ kubectl -n argocd diff -f argocd-cm.byoi.yaml
diff -u -N /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/LIVE-606675094/v1.ConfigMap.argocd.argocd-cm /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/MERGED-293576957/v1.ConfigMap.argocd.argocd-cm
--- /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/LIVE-606675094/v1.ConfigMap.argocd.argocd-cm	2021-05-08 09:12:08.000000000 +0900
+++ /var/folders/1x/4_hvvl5564v0rlnmdq1w4jcw0000gn/T/MERGED-293576957/v1.ConfigMap.argocd.argocd-cm	2021-05-08 09:12:08.000000000 +0900
@@ -1,4 +1,10 @@
 apiVersion: v1
+data:
+  configManagementPlugins: |
+    - name: helmfile
+      generate:
+        command: ["/bin/sh", "-c"]
+        args: ["helmfile --namespace $ARGOCD_APP_NAMESPACE template | sed -e '1,/---/d' | sed -e 's|apiregistration.k8s.io/v1beta1|apiregistration.k8s.io/v1|g'"]
 kind: ConfigMap
 metadata:
   annotations:
# ...

appの作成方法は同じなので省略。

どちらの方式が良いか

どちらの方式もOSSで公開されていて、お手軽に導入できるのでどちらでも良い。
ArgoCD自体をHelmで管理するにしても、Valuesはどちらのケースも想定されている。
https://github.com/argoproj/argo-helm/blob/master/charts/argo-cd/values.yaml

BYOI方式使いつつ、他のツールも仕込みたくなったらVolume Mounts方式にすればいいんじゃないかな。

Refs