ArgoCD
It is possible to make your OpenAPI schema the real source of truth for your K8s configurations with Kusk - by using it as an ArgoCD's custom tool!
GitOps approach will allow you to use ArgoCD to automatically generate configurations in a determinative way based off your OpenAPI schema that you can store in Git to easily version, review and rollback your APIs. ArgoCD will take care of automatically syncing your configurations, while Kusk will happily generate it for you every time you make a change.
This guide will help you setup Kusk in ArgoCD.
Table of Contents
- Prerequisites
- Install Kusk as a custom tool
- Use Kusk in ArgoCD UI
- Use Kusk in ArgoCD CLI
- Use Kusk in ArgoCD App manifest
Prerequisites
- Have a working ArgoCD installation - ArgoCD quick start.
- Have a repository with OpenAPI schema configured within ArgoCD - for this example we will use Kusk's example folder.
Install Kusk as a custom tool
To install a custom tool in ArgoCD, we will follow the official guide.
We will add an initContainer
to argocd-repo-server
and a volume to download Kusk's binary to:
--- a/argocd-repo-server.yaml
+++ b/argocd-repo-server.yaml
@@ -31,6 +31,16 @@ spec:
topologyKey: kubernetes.io/hostname
weight: 5
automountServiceAccountToken: false
+ initContainers:
+ - name: download-kusk-gen
+ image: alpine:3.8
+ command: [ sh, -c ]
+ args:
+ - wget -qO- https://github.com/kubeshop/kusk-gen/releases/latest/download/kusk-gen_Linux_arm64.tar.gz | tar -xvzf - &&
+ mv kusk /custom-tools/
+ volumeMounts:
+ - mountPath: /custom-tools
+ name: kusk-gen
containers:
- command:
- uid_entrypoint.sh
@@ -72,7 +82,12 @@ spec:
name: gpg-keyring
- mountPath: /app/config/reposerver/tls
name: argocd-repo-server-tls
+ - mountPath: /usr/local/bin/kusk-gen
+ name: kusk-gen
+ subPath: kusk-gen
volumes:
+ - name: kusk-gen
+ emptyDir: {}
- configMap:
name: argocd-ssh-known-hosts-cm
name: ssh-known-hosts
When installed, Kusk binary will be available during ArgoCD sync. To use that, we'll register a configuration management plugin:
--- a/argocd-cm.yaml
+++ b/argocd-cm.yaml
@@ -5,3 +5,9 @@ metadata:
app.kubernetes.io/name: argocd-cm
app.kubernetes.io/part-of: argocd
name: argocd-cm
+data:
+ configManagementPlugins: |
+ - name: kusk-gen
+ generate:
+ command: ["/bin/sh", "-c"]
+ args: ["kusk-gen $KUSK_GENERATOR -i $KUSK_INPUT $KUSK_ARGS"]
Once these changes are applied to your ArgoCD installation, you can begin to use Kusk!
Use kusk-gen in ArgoCD UI
When you are creating an App via UI, scroll down and select "Plugin" as a configuration management tool:
After that, select kusk-gen as a plugin and fill the environment variables to specify the generator you want to invoke and the input file with your OpenAPI schema:
ArgoCD will sync your app and you will be able to see resources generated and applied to your cluster automatically 🪄:
Use kusk-gen in ArgoCD CLI
It is also possible to create an App via CLI with Kusk - just specify --config-management-plugin kusk
option:
argocd app create petstore-kusk \
--config-management-plugin kusk \
--plugin-env KUSK_GENERATOR=ambassador \
--plugin-env KUSK_INPUT=petstore_extension.yaml \
--repo https://github.com/kubeshop/kusk-gen \
--path examples/petstore \
--dest-server https://kubernetes.default.svc \
--dest-namespace default
Use kusk-gen in ArgoCD App manifest
In ArgoCD it is possible to manage applications using App manifest and apply them using kubectl
: documentation.
To use Kusk in this setup, add Kusk in a plugin
node:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: petstore-kusk
spec:
destination:
namespace: default
server: 'https://kubernetes.default.svc'
source:
path: examples/petstore
repoURL: 'https://github.com/kubeshop/kusk-gen'
targetRevision: main
plugin:
name: kusk
env:
- name: KUSK_INPUT
value: petstore_extension.yaml
- name: KUSK_GENERATOR
value: ambassador
project: default
syncPolicy:
automated:
prune: true
selfHeal: true