A few years ago, I got to know Jsonnet and I loved it at first sight. I used a nice little tool called tanka to manage my Jsonnet manifests and I got them working together with ArgoCD, and finally I re-deployed my blog using this combo. Everything worked like a charm, until…
Recently I upgraded my ArgoCD to the latest(2.9.3 at this moment) and suddenly my blog is in unknown state. I almost panicked. After some searching and reading, so the good old ways ArgoCD handling plugins have been deprecated and finally removed since version 2.8. In the linked doc there’s also a path for upgrading, so here we go.
First, the tanka plugin will have its own plugin.yaml, which will be mounted to the plugin’s sidecar container via a ConfigMap. The init and generate parts look very familiar, only I need pay attention to the changed path – now plugin executables will be in /home/argocd/cmp-server/plugins directory.
apiVersion: argoproj.io/v1alpha1
kind: ConfigManagementPlugin
metadata:
name: tanka
namespace: argocd
spec:
version: v0.25.0
init:
command: [ "sh", "-c", "/home/argocd/cmp-server/plugins/jb install" ]
generate:
command: [ "sh", "-c", "/home/argocd/cmp-server/plugins/tk show environments/${ARGOCD_ENV_TK_ENV} --dangerous-allow-redirect" ]
discover:
fileName: "./environments/*/main.jsonnet"The next step is to create a sidecar container, which can install the needed jb and tk binaries at the /home/argocd/cmp-server/plugins location, then according to the specification it will run the argocd-cmp-server binary to integrate it into the argocd-repo-server. I use kustomize for my ArgoCD manifests so this will be a patch file for the extra container:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: argocd-repo-server
spec:
selector:
matchLabels:
app.kubernetes.io/name: argocd-repo-server
template:
metadata:
labels:
app.kubernetes.io/name: argocd-repo-server
spec:
containers:
# for tanka plugin
- name: cmp
image: curlimages/curl:latest
# install jb and tk then start the argocd-cmp-server
command:
- sh
- -c
- |
cd /home/argocd/cmp-server/plugins && \
curl -Lo jb "https://github.com/jsonnet-bundler/jsonnet-bundler/releases/download/v0.5.1/jb-linux-amd64" && \
curl -Lo tk "https://github.com/grafana/tanka/releases/download/v0.25.0/tk-linux-amd64" && \
chmod +x jb tk && \
/var/run/argocd/argocd-cmp-server
securityContext:
runAsNonRoot: true
runAsUser: 999
volumeMounts:
- mountPath: /var/run/argocd
name: var-files
- mountPath: /home/argocd/cmp-server/plugins
name: plugins
- mountPath: /home/argocd/cmp-server/config/plugin.yaml
subPath: plugin.yaml
name: cmp-tanka
volumes:
# configMap containing the plugin.yaml
- name: cmp-tanka
configMap:
name: cmp-tanka
# other customisations of argo can also be here Finally, let’s put things together in kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: argocd
# argocd manifest can be found at https://argo-cd.readthedocs.io/en/stable/getting_started/#1-install-argo-cd
resources:
- upstream.yaml
# a configMap containing the plugin.yaml file
configMapGenerator:
- name: cmp-tanka
files:
- plugin.yaml
patches:
- path: patch.yamlAfter I re-deployed ArgoCD with the above enhancements, sadly, my blog was still in unknown state. ArgoCD complains: plugin named tanka not found, which is not very helpful. I had a look at the official guide again and it’s just 1 thing I missed, in the argo application:
apiVersion: argoproj.io/v1alpha1
kind: Application
...
spec:
...
targetRevision: HEAD
plugin:
name: tanka # <--- this line is no longer needed
env:
- name: TK_ENV
value: raynix
It now works without that line 🙂
Ref.
– https://argo-cd.readthedocs.io/en/stable/operator-manual/config-management-plugins/
– https://hodovi.cc/blog/gitops-argocd-and-tanka/
