The 12 principles
1- Go managed:
You should always consider first the managed service. Start with Google Kubernetes Engine (GKE), Azure Kubernetes Service (AKS), and Elastic Kubernetes Service (EKS).
2- Simplify:
Microservices architectures are the chosen approach for most modern apps. Organization’s primary concern and focus should remain the product not the infrastructure.
3- Everything as Code (XaC):
This is the default practice for modern infrastructure and DevOps teams. It is a recommended approach to use declarative infrastructure
as code (IaC) and configuration as code (CaC) tools and technologies over their imperative counterparts.
4- Immutable infrastructure:
Always create immutable components from images or a declarative code, where we can build, test, and validate these immutable systems and get the same predictable results every time.
Docker images and AWS EC2 AMI are examples of this concept.
5- Automation:
Kubernetes comes to automate the containers’ life cycle, and it also comes with advanced automation concepts, such as operators and GitOps, which are efficient and can literally automate the automations.
6- Standardization:
Set of standards helps to reduce teams’ struggle with aligning and working together, eases the scaling of the processes, improves the overall quality, and increases productivity.
7- Source of truth:
Having a single source of truth is a cornerstone and an enabler to modern infrastructure management and configuration. Source code control systems such as Git are the standard choice to store and version infrastructure code, where having a single and dedicated source code repository for infrastructure is a recommended practice.
8- Design for availability:
Infrastructure as a Service (IaaS) level by choosing multi-zone or region architecture, then going through the Kubernetes layer by designing a multi-master cluster, and finally, the application layer by deploying multiple replicas of each service.
9- Cloud-agnostic:
Being cloud-agnostic means that you can run your workloads on any cloud with a minimal vendor-lock.
This principle also goes further to include other technologies and tool selection (think Terraform versus CloudFormation).
10- Business continuity:
You need to make a scaling decision for the future to support business expansion and continuity. Questions such as whether to use a single large cluster versus smaller multiple clusters, how to manage the infrastructure cost, what the nodes’ right sizes are, and what the efficient resource utilization strategy is… all of these questions require specific answers and important decisions to be taken.
11- Plan for failures:
When designing a Kubernetes cluster, you have to design it to survive outages and failures by using high-availability principles. But you also have to intentionally plan for failures. You can achieve this through applying chaos engineering ideas, disaster recovery solutions, infrastructure testing, and infrastructure CI/CD.
12- Operational efficiency
Companies usually underestimate the effort required to operate containers in production.
We witnessed successful Kubernetes production rollouts, but eventually, things fell apart because of operations teams and the weak practices.
These 12 principles are proven to be a common pattern for successful large scale cloud infrastructure rollouts.
Book Reference: Kubernetes in production best practices