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