Introduction
Managing Kubernetes clusters manually can lead to configuration drift, inconsistencies, and operational overhead. By using Terraform, we can define Kubernetes resources declaratively, ensuring a version-controlled, reproducible, and scalable infrastructure.
In this post, we’ll walk through setting up a Kubernetes deployment using Terraform with a real-world example.
Why Terraform for Kubernetes?
Declarative Approach – Define your infrastructure as code
Version Control – Track changes using Git
Reproducibility – Deploy identical environments
Automation – Reduce manual configurations
Step 1: Install Terraform
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install terraform
Verify the installation:
terraform -version
Step 2: Set Up Kubernetes Provider in Terraform
Now, let’s define our Terraform configuration for Kubernetes.
Create a new directory and files
mkdir terraform-k8s && cd terraform-k8s
touch main.tf
Terraform Configuration (main.tf)
provider "kubernetes" {
config_path = "~/.kube/config"
}
resource "kubernetes_deployment" "nginx" {
metadata {
name = "nginx-deployment"
labels = {
app = "nginx"
}
}
spec {
replicas = 2
selector {
match_labels = {
app = "nginx"
}
}
template {
metadata {
labels = {
app = "nginx"
}
}
spec {
container {
name = "nginx"
image = "nginx:latest"
}
}
}
}
}
resource "kubernetes_service" "nginx_service" {
metadata {
name = "nginx-service"
}
spec {
selector = {
app = "nginx"
}
port {
port = 80
target_port = 80
}
type = "NodePort"
}
}
Step 3: Initialize Terraform
Run the following command to initialize Terraform:
terraform init
This will download the necessary Kubernetes provider.
Step 4: Validate the Configuration
Ensure there are no syntax errors:
terraform validate
Expected output:
Success! The configuration is valid.
Step 5: Deploy Kubernetes Resources
Run:
terraform apply -auto-approve
Terraform will create:
- Deployment: Two replicas of an nginx pod
- Service: A NodePort service exposing the pods
Step 6: Verify the Deployment
Check if the deployment is running:
kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 1m
Check the service:
kubectl get svc
Access the service:
minikube service nginx-service --url
Step 7: Cleaning Up
To delete the deployment and service:
terraform destroy -auto-approve
Conclusion
Using Terraform to define Kubernetes resources brings consistency, automation, and version control to your infrastructure. By leveraging Infrastructure as Code (IaC), you eliminate manual errors and ensure smooth deployments across environments.
What’s your experience with Terraform for Kubernetes? Let’s discuss in the comments!![]()