I've been using terraform for a while and I really like it. I also set up Atlantis so that my team could have a "GitOps" flow. This is my current process:
- Add or remove resources from Terraform files
- Push changes to GitHub and create a pull request
- Atlantis picks up changes and creates a terraform plan
- When the PR is approved, Atlantis applies the changes
I recently found myself needing to set up a few managed Kubernetes clusters using Amazon EKS. While Terraform is capable of creating most of the basic infrastructure, it falls short when setting up some of the k8s resources (no support for gateways or ingress, no support for alpha/beta features, etc). So instead I've been relying on a manual approach using kubectl:
- Add the resource to an existing file or create a new file
- Add a line to a makefile that runs the appropriate command (kubectl apply or create) on the new file
- If I'm using a helm chart, add a line with
helm template
and thenkubectl apply
(I didn't really like using tiller, and helm3 is getting rid of it anyway) - If I want to delete a resource, I do it manually with
kubectl delete
This process feels nowhere near as clean as what we're doing in Terraform. There are several key problems:
- There's no real dry-run. Using
kubectl --dry-run
orkubectl diff
doesn't really work, it's only a client-side diff. Server-side diff functions are currently in alpha - There's no state file. If I delete stuff from the manifests, I have to remember to also delete it from the cluster manually.
- No clear way to achieve gitops. I've looked at Weaveworks Flux but that seems to be geared more towards deploying applications.
- The makefile is getting more and more complicated. It doesn't feel like this is scaleable.
I should acknowledge that I'm fairly new to Kubernetes, so might be overlooking something obvious.
Is there a way for me to achieve a process similar to what I have in Terraform, within the Kubernetes universe?