XenonStack Recommends

Deployment Automation

Infrastructure as Code Principles for Kubernetes Configuration Management

Gursimran Singh | 03 March 2023

What is Infrastructure as Code (IaC)?

Infrastructure as Code (IaC) is infrastructure management in a descriptive model, which means you can create your infra and manage it with your source code. Like the principle that the same source code generates the same binary, the same environment is generated by an IaC model every time it is applied.

What is Kubernetes?

Kubernetes is one of the most popular tools for the management of containers. The tech giant Google originally developed the open-source container orchestration tool. It makes it easier to deploy, scale and manage containerized microservices, and also, almost every cloud provider supports Kubernetes. You can provision Kubernetes clusters across multi-cloud, private cloud, and hybrid clouds. Manual provisioning of the Kubernetes cluster and its add-ons can be complicated; to simplify this, you can use IaC.

Kubernetes also follows infrastructure as code (IaC ) principles which mean all of our deployment is written in the form of code. This is a tremendous benefit in two ways: Our infrastructure can now be versioned and committed to any Git repository, and our infrastructure can easily be “deployed” elsewhere with the same configuration and with no human error.

Why  Infrastructure as Code in Kubernetes?

Now let’s take a quick to understand how powerful Kubernetes is by taking an example of a cluster which is spawned and managed by Kops, and the whole setup is running on AWS. If we make a deployment onto the cluster then in this process we never need to know which instance exactly has pod one or pod two because the Kubernetes manage that load. Moreover, when we add new deployments into our cluster, Kubernetes will handle the load across a cluster and decide where to put the new pods. We can kill one of the pods and our replica set in deployment manifest file then it will spawn a new one as a replacement. We can also try to kill one of the EC2 instances, and KOPS will re-spawn new instances. And surprisingly, we barely scratch the surface of Kubernetes and how powerful it can get. Bear in mind that this is only covered one application deployment. Now imagine if we write all the deployments and third party dependencies we need in this way, then we will have what we want: infrastructure written as code.

How to embrace  Infrastructure as Code principles with Kubernetes?

  1. Idempotency - Idempotency decreases the inconsistency in Kubernetes cluster provisioning through IaC. It simply means that the start state of IaC should always end up with the same end state. For example, you have provisioned a three-node cluster using IaC. When you rerun the same Code, it should not provision 3 more (i.e., six nodes) nodes in the cluster.
  2. Immutability - Immutable IaC means - new infrastructure should be provisioned instead of modifying the same infrastructure. This decreases the chances of configuration drift in the infrastructure. For example, suppose you have two node Kubernetes clusters when you run your IaC again. In that case, it should shut down the previous cluster and create a new Kubernetes cluster.

What are the Infrastructure as Code  Principles for Kubernetes?

There are four Kubernetes IaC Principles. 

  • Build Infrastructure Effortlessly
  • Reuse the System
  • Processes Are Repeatable
  • Improved Reliability 

Build Infrastructure Effortlessly

Using Infrastructure as code in kubernetes, we can rebuild effortlessly, and reliable infrastructure by creating different kubernetes manifest files.  To build an infrastructure run:  kubectl apply -f hello_world.yaml The hello_world.yaml is the kubernetes manifest file which contains all the configuration required to build infrastructure using kubernetes which means if we want to make any changes in future which can do it by making changes in its manifest file. The ability to build any element of infrastructure is powerful. It removes much of risk and fear when making any changes as there is very less probability of human error.

Reuse the System

One of the advantages of dynamic infrastructure is that the resources of infrastructure can be easily destroyed, created, replaced and moved. The application should continue running even when the server disappears and when they resized. If we want to build infrastructure, then we can make use of above kubernetes manifest file by updating its configurations according to our requirements and then apply the updated manifest file which results in a newly built infrastructure.

Processes Are Repeatable

Building on the reproductive principle, any action we will perform on our infrastructure should be repeatable. This is one of the benefits of using configuration management tools and scripts rather than making changes manually. Still, it can be hard to stick to doing things this way, especially for experienced system administrators.

Improved Reliability 

All infrastructure is handled through the kubernetes manifest files and tools (kubernetes) that are responsible for implementing adjustments in infrastructure, so less risk of human error is present.

What are the Benefits of using Infrastructure as Code with Kubernetes?

  1. Tracking and Auditability: IaC code can be stored in git repositories. Along with automation, it also acts as an infrastructure document. You can test the IaC code over the git repo and track who has made changes to the Code; if there is an issue, it can easily be tracked over git.
  2. Speed: Once all the required things are defined in the IaC, it allows you to provision Kubernetes clusters in both public and private clouds quickly, and also, you can deploy the containerized application on the provisioned Kubernetes cluster at lightning speed, which will increase quality and productivity of the application.
  3. Reusability: IaC code acts as a template; you can use it to provision Kubernetes clusters across various regions in the cloud. Along with this, you can deploy microservices on different Kubernetes clusters using the IaC.
  4. Consistency: No matter how hard you try, manual provisioning will still result in failure, but IaC will systemize the infrastructure provisioning and guarantee the same infrastructure over and over. Also, it will make sure that the microservice is deployed with the same configuration on the separate Kubernetes cluster.

Conclusion

As the Kubernetes is truly a "Production-Grade Container Orchestration". It makes it easy to manage our infrastructure by simply managing it from manifests files. When the infrastructure is written is as code, moving your entire infrastructure is as easy as pointing your kubectl to another cluster and running kubectl-f manifest file-apply . You can also commit it to a Git repository and understand clearly how your infrastructure is changing over time.

Read Next