Follow this guide to build the initial cluster https://github.com/jaypyles/k3s-kvm

Github Actions pipeline deploys Docker images to Dockerhub and Helm charts to https://github.com/jaypyles/helm-charts

Creating an NFS mount for a K3S/KVM Cluster

Secrets management using Doppler:

https://docs.doppler.com/docs/kubernetes-operator

Continuous Deployment using ArgoCD:

helm repo add argo-cd <https://argoproj.github.io/argo-helm>
helm dep update charts/argo-cd/

helm install argo-cd charts/argo-cd/
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
kubectl get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
name@server:~$ kubectl get svc -n argocd

NAME                                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
argocd-applicationset-controller          ClusterIP   10.43.175.49    <none>        7000/TCP,8080/TCP            2d12h
argocd-dex-server                         ClusterIP   10.43.247.40    <none>        5556/TCP,5557/TCP,5558/TCP   2d12h
argocd-metrics                            ClusterIP   10.43.140.14    <none>        8082/TCP                     2d12h
argocd-notifications-controller-metrics   ClusterIP   10.43.89.8      <none>        9001/TCP                     2d12h
argocd-redis                              ClusterIP   10.43.201.107   <none>        6379/TCP                     2d12h
argocd-repo-server                        ClusterIP   10.43.94.16     <none>        8081/TCP,8084/TCP            2d12h
argocd-server                             NodePort    10.43.53.113    <none>        80:31706/TCP,443:30123/TCP   2d12h
argocd-server-metrics                     ClusterIP   10.43.232.109   <none>        8083/TCP                     2d12h

Applying the Application