Let’s build out the infra for a company for fun . . . : Part 1
A New Project
I feel like recently I’ve fallen a bit behind on being up to date on the latest tech. I’ve been on baby bonding leave for a few weeks now and am slowly starting to get into a rhythm. In my brief amount of downtime I’ve decided to fill in my gaps in knowledge by creating a synthetic project. I think it might be something other folks are interested in, so feel free to follow along.
My plan is to build out a set of self-hosted software infrastructure tools for a pretend small/medium sized software company. This “company” wants to enable its employees to do software engineering — building a website with a microservice backend with industry best practices.
At a very high level an engineer should be able to write code using the tools of their choice (in my case Go), check them in to a self-hosted git repository. Have a build system build and deploy it. The engineer should be able to then promote those builds from dev → stage → prod. The system will be built on top of Kubernetes and use Istio as a service mesh. There should be support for databases, security, metrics, logging, tracing, alerting.
I see tons of articles about k8s and infrastructure tooling, but what I don’t see is something along the lines of “we build a real business and these are the tools we went with and why”. The closest I get is “we chose this tool and why”.
At the end of this project it should provide concrete examples of how all of these things are wired up, along with articles about how it’s done. Scripts will be written that will setup the various stages and be made available on Github. If someone likes what I’ve done they should be able to clone and build out their own infrastructure.
I don’t think I’ve seen a project of this breadth of scale attempted and documented before. Most businesses don’t have time to do this, and tend to grow organically with market pressures making many choices for them. It’s kind of not really the sexy thing that most engineers want to write articles about. But it’s the meat and potato’s of building out a software businesses infrastructure and I figure it will be good for my soul to explore it.
This can quickly turn into a quagmire of a jumping down rabbit holes with no end. I will be quick to explore ideas and equally quick to not implement them or delay them for a later time. If I’m not having fun, I’ll probably skip it and move on to something else more interesting. I don’t have any business pressure requiring anything.
Big picture architecture wise my thought was to have 3 main clusters: Dev, Stage, and Prod. There will also most likely be some other environments like an Infra and Tooling clusters. My thoughts on tools and features so far include:
- Kubernetes
- Istio
- Image registry
- Git
- PostgreSQL database
- Grafana
- Prometheus
- Zipkin
- log collection and searching
- alerts
- backups
- Promoting builds between multiple environments
My goals for this include learning about tools I haven’t gotten to use much before, get practical experience without much pressure, do more writing, have fun, and maybe see gaps in tooling that I might want to make into future projects.
So if you have any thoughts, tool suggestions, or simply think I’m crazy, please comment!
The next article in this series can be found here.
Because Medium doesn’t do series well, here are the various parts of this series: