Contents

ArgoCD with Kind

This post will document how to run an ArgoCD instance locally, using Kind to create the Kubernetes cluster. In addition, I will use cert-manager to create a self-signed certificate to serve it with HTTPS.

Argo CD

Creating the cluster with kind

First of all, is to have a Kubernetes cluster. You will require to have kind available in your path (maybe downloading to your ~/bin or ~/.local/bin makes the trick). This is the configuration file I used:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# kind.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"    
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP

So, to create the cluster just type:

1
$ kind create cluster --config=kind.yaml

Wait until full process ends and… you got it!

Add ingress to your cluster

In order to add ingress to the kind cluster, it’s required to add an ingress controller.

Here you have what I did to install the nginx controller:

1
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml

It requires a couple of minutes to download images and… Done!

Cert manager

Well… let’s do things almost in the right way by using self-signed certificates. This will be easier than it seems to be :)

To install cert-manager, just run:

1
$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.0.2/cert-manager.yaml

Now it will require a issuer. I needed to create this file:

1
2
3
4
5
6
7
# cert-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: test-selfsigned
spec:
  selfSigned: {}

And run next command:

1
$ kubectl apply -f cert-issuer.yaml

That’s it.

ArgoCD

Now it’s time to install ArgoCD:

1
2
$ kubectl create namespace argocd
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

I will serve it at argocd.local. So I need to modify my /etc/hosts to have this line:

1
127.0.0.1       localhost argocd.local

Ingress

Once we have the URL, it’s required to have an ingress. So I needed the file:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: test-selfsigned
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: argocd-server
          servicePort: https
    host: argocd.local
  tls:
  - secretName: https-cert
    hosts:
    - argocd.local

And run it:

1
$ kubectl apply -f ingress.yaml

And it will be ready!

Access

Just open https://argocd.local to enter. The username is admin and the password is the name of the argo server docker, which can be obtained with:

1
$ kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2