Terraform Configuration for Kubernetes Deployment

Terraform Configuration Overview

Required Providers

terraform {
  required_providers {
    kubernetes = {
      source = "hashicorp/kubernetes"
      version = "~> 2.0"
    }
  }
}

Kubernetes Provider Configuration

provider "kubernetes" {
  config_path = "~/.kube/config"
}

Local Variables

locals {
  applications = jsondecode(file("${path.module}/apps.json")).applications
}

Resource Definitions

Kubernetes Deployment Resource

resource "kubernetes_deployment_v1" "apps" {
  for_each = { for app in local.applications : app.name => app }

  metadata {
    name = "${each.value.name}-deployment"
    labels = {
      app = each.value.name
    }
  }

  spec {
    replicas = each.value.replicas

    selector {
      match_labels = {
        app = each.value.name
      }
    }

    template {
      metadata {
        labels = {
          app = each.value.name
        }
      }

      spec {
        container {
          image = each.value.image
          name  = each.value.name

          args = ["-listen=:${each.value.port}", "-text=\\"I am ${each.value.name}\\""]

          port {
            container_port = each.value.port
          }
        }
      }
    }
  }
}

Kubernetes Service Resource

resource "kubernetes_service_v1" "apps" {
  for_each = { for app in local.applications : app.name => app }

  metadata {
    name = "${each.value.name}-service"
  }

  spec {
    selector = {
      app = each.value.name
    }

    port {
      port        = each.value.port
      target_port = each.value.port
    }

    type = "ClusterIP"
  }
}