This guide shows you how to automate EKS cluster deployment using Terraform and GitHub Actions. You'll learn to create a production-ready Kubernetes environment with networking, security, and scaling capabilities.
VPC and Network Architecture
Create a dedicated VPC for the cluster.
resource "aws_vpc" "eks_vpc" { cidr_block = "10.0.0.0/16" enable_dns_hostnames = true enable_dns_support = true tags = { Name = "eks-vpc" } } resource "aws_subnet" "private" { count = 2 vpc_id = aws_vpc.eks_vpc.id cidr_block = "10.0.${count.index + 1}.0/24" availability_zone = data.aws_availability_zones.available.names[count.index] tags = { Name = "eks-private-${count.index + 1}" "kubernetes.io/role/internal-elb" = "1" } }
Private subnets host the worker nodes while public subnets handle incoming traffic through load balancers. The subnet tags enable automatic discovery by Kubernetes for internal load balancer placement.
EKS Cluster and Node Groups
The EKS cluster consists of a control plane for managing Kubernetes components and worker nodes for running workloads:
resource "aws_eks_cluster" "main" { name = "eks-cluster" role_arn = aws_iam_role.eks_cluster.arn version = "1.27" vpc_config { subnet_ids = aws_subnet.private[*].id endpoint_private_access = true endpoint_public_access = true } depends_on = [ aws_iam_role_policy_attachment.eks_cluster_policy ] } resource "aws_eks_node_group" "main" { cluster_name = aws_eks_cluster.main.name node_group_name = "eks-node-group" node_role_arn = aws_iam_role.eks_nodes.arn subnet_ids = aws_subnet.private[*].id scaling_config { desired_size = 2 max_size = 4 min_size = 1 } instance_types = ["t3.medium"] }
The EKS Blueprints for Terraform provide production-ready modules to accelerate cluster deployment. Breaking the configuration into modules improves maintainability:
module "vpc" { source = "./modules/vpc" # VPC configuration parameters } module "eks" { source = "./modules/eks" # EKS configuration parameters vpc_id = module.vpc.vpc_id subnet_ids = module.vpc.private_subnet_ids }
Automating Deployments with GitHub Actions
Workflow File
Create a workflow file in .github/workflows
to define the deployment process:
name: Terraform AWS Workflow on: pull_request: branches: [ main ] push: branches: [ main ] jobs: terraform: runs-on: ubuntu-latest permissions: id-token: write contents: read steps: - uses: actions/checkout@v3 - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v2 with: role-to-assume: arn:aws:iam::123456789012:role/github-actions aws-region: us-west-2 - name: Setup Terraform uses: hashicorp/setup-terraform@v3 - name: Terraform Init run: terraform init - name: Terraform Plan if: github.event_name == 'pull_request' run: terraform plan -no-color - name: Terraform Apply if: github.ref == 'refs/heads/main' && github.event_name == 'push' run: terraform apply -auto-approve
State Management
Store Terraform state in S3.
terraform { backend "s3" { bucket = "terraform-state-bucket" key = "eks/terraform.tfstate" region = "us-west-2" dynamodb_table = "terraform-state-lock" encrypt = true use_lockfile = true } }
Managing Production
GitOps and Add-on Management
Deploy ArgoCD using the EKS Blueprints framework:
module "kubernetes_addons" { source = "github.com/aws-ia/terraform-aws-eks-blueprints//modules/kubernetes-addons" eks_cluster_id = module.eks_blueprints.eks_cluster_id enable_argocd = true enable_metrics_server = true enable_cluster_autoscaler = true enable_aws_load_balancer_controller = true argocd_helm_config = { values = [templatefile("${path.module}/values.yaml", {})] } }
Monitoring and Scaling
Implement automatic scaling based on resource utilization:
resource "aws_autoscaling_policy" "cluster_autoscaling" { name = "eks-cluster-autoscaling" policy_type = "TargetTrackingScaling" target_tracking_configuration { target_value = 75.0 predefined_metric_specification { predefined_metric_type = "ASGAverageCPUUtilization" } } autoscaling_group_name = aws_eks_node_group.main.resources[0].autoscaling_groups[0].name }
Next Steps
Automating EKS with GitHub Actions is a reliable way to manage your new cluster. For teams looking to improve their infrastructure workflows, check out Terrateam (OSS) which provides a GitOps-first approach to managing Terraform in GitHub.
Top comments (0)