ArgoCDでHelmfileを使う
#cicd #kubernetesArgoCD上でHelmfileを使いたい。
概要
ArgoCDはmanifestの管理方法として下記ツールをサポートしている。
- Kustomize
- Helm
- Ksonnet
- Yaml/Json/Jsonnet
Helmfileなどその他ツールを利用したい場合、Config Management Pluginにより実現する。
Config Management Pluginとは、manifest生成のために任意のバイナリやスクリプトを実行する機能のこと。
設定方法は2ステップ。
Step1: argocd-repo-serverに該当ツールを配置する
manifest生成はargocd-repo-server上で行われるため、argocd-repo-serverのmanifestを変更する。
ツールの配置方法は2通り。
- Volume Mounts経由でツールを配置する
- 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
- helmfile support · Issue #2143 · argoproj/argo-cd
- Plugins - Argo CD - Declarative GitOps CD for Kubernetes
- Custom Tooling - Argo CD - Declarative GitOps CD for Kubernetes