Skip to content

Commit 1b7d50c

Browse files
committed
Write Kubernetes Terraform module for Azure and AWS
- Written Terraform module for Azure Kubernetes Service (AKS) and supporting infra. - Updated Terraform module for Amazon EKS. - Tested Kubernetes Terraform module on both AWS and Azure
1 parent 83d1a62 commit 1b7d50c

File tree

10 files changed

+219
-17
lines changed

10 files changed

+219
-17
lines changed

main.tf

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
terraform {
22
required_version = "v1.0.1"
33
required_providers {
4-
aws = "5.42.0"
4+
aws = "5.84.0"
5+
azurerm = "4.16.0"
56
}
67
backend "local" {}
78
}
@@ -17,5 +18,10 @@ module "aws_kubernetes" {
1718
source = "./module/kubernetes/aws"
1819
environment = var.environment
1920
ssh_public_key = var.ssh_public_key
20-
ec2_ami_id = var.aws_ec2_ami_id
21+
}
22+
module "azure_kubernetes" {
23+
source = "./module/kubernetes/azure"
24+
environment = var.environment
25+
ssh_public_key = var.ssh_public_key
26+
subscription_id = var.azure_subscription_id
2127
}

module/kubernetes/aws/main.tf

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -293,10 +293,10 @@ resource "aws_subnet" "kubernetes_vpc_eks_cp_sn_1" {
293293
}
294294
resource "aws_route_table_association" "kubernetes_vpc_eks_cp_sn_1_rtt_ass" {
295295
depends_on = [
296-
aws_route_table.kubernetes_vpc_pvt_rtt,
296+
aws_route_table.kubernetes_vpc_pub_rtt,
297297
aws_subnet.kubernetes_vpc_eks_cp_sn_1
298298
]
299-
route_table_id = aws_route_table.kubernetes_vpc_pvt_rtt.id
299+
route_table_id = aws_route_table.kubernetes_vpc_pub_rtt.id
300300
subnet_id = aws_subnet.kubernetes_vpc_eks_cp_sn_1.id
301301
}
302302
resource "aws_subnet" "kubernetes_vpc_eks_cp_sn_2" {
@@ -314,10 +314,10 @@ resource "aws_subnet" "kubernetes_vpc_eks_cp_sn_2" {
314314
}
315315
resource "aws_route_table_association" "kubernetes_vpc_eks_cp_sn_2_rtt_ass" {
316316
depends_on = [
317-
aws_route_table.kubernetes_vpc_pvt_rtt,
317+
aws_route_table.kubernetes_vpc_pub_rtt,
318318
aws_subnet.kubernetes_vpc_eks_cp_sn_2
319319
]
320-
route_table_id = aws_route_table.kubernetes_vpc_pvt_rtt.id
320+
route_table_id = aws_route_table.kubernetes_vpc_pub_rtt.id
321321
subnet_id = aws_subnet.kubernetes_vpc_eks_cp_sn_2.id
322322
}
323323
resource "aws_subnet" "kubernetes_vpc_eks_nd_sn_1" {
@@ -463,7 +463,10 @@ resource "aws_security_group" "kubernetes_vpc_loadbalancer_sg" {
463463
}
464464
}
465465
resource "aws_security_group" "kubernetes_vpc_eks_sg" {
466-
depends_on = [aws_vpc.kubernetes_vpc_net]
466+
depends_on = [
467+
aws_vpc.kubernetes_vpc_net,
468+
aws_security_group.kubernetes_vpc_bastion_sg
469+
]
467470
name = "kubernetes-vpc-eks-sg"
468471
vpc_id = aws_vpc.kubernetes_vpc_net.id
469472
ingress {
@@ -560,7 +563,6 @@ resource "aws_ecr_repository" "kubernetes_ecr_nginx_repo" {
560563
resource "aws_eks_cluster" "kubernetes_eks_ct" {
561564
depends_on = [
562565
aws_iam_role.kubernetes_iam_eks_rl,
563-
aws_vpc.kubernetes_vpc_net,
564566
aws_subnet.kubernetes_vpc_eks_cp_sn_1,
565567
aws_subnet.kubernetes_vpc_eks_cp_sn_2,
566568
aws_subnet.kubernetes_vpc_eks_nd_sn_1,
@@ -580,17 +582,28 @@ resource "aws_eks_cluster" "kubernetes_eks_ct" {
580582
]
581583
security_group_ids = [aws_security_group.kubernetes_vpc_eks_sg.id]
582584
}
583-
version = "1.28"
585+
version = "1.29"
584586
access_config {
585587
authentication_mode = "API_AND_CONFIG_MAP"
586588
bootstrap_cluster_creator_admin_permissions = true
587589
}
588590
bootstrap_self_managed_addons = true
591+
kubernetes_network_config {
592+
elastic_load_balancing {
593+
enabled = false
594+
}
595+
ip_family = "ipv4"
596+
}
597+
storage_config {
598+
block_storage {
599+
enabled = false
600+
}
601+
}
589602
compute_config {
590603
enabled = false
591604
}
592-
kubernetes_network_config {
593-
ip_family = "ipv4"
605+
zonal_shift_config {
606+
enabled = false
594607
}
595608
tags = {
596609
Name = "kubernetes-eks-ct"
@@ -603,7 +616,6 @@ resource "aws_eks_cluster" "kubernetes_eks_ct" {
603616
resource "aws_eks_node_group" "kubernetes_eks_gnr_ng" {
604617
depends_on = [
605618
aws_iam_role.kubernetes_iam_ec2_rl,
606-
aws_vpc.kubernetes_vpc_net,
607619
aws_subnet.kubernetes_vpc_eks_nd_sn_1,
608620
aws_subnet.kubernetes_vpc_eks_nd_sn_2,
609621
aws_security_group.kubernetes_vpc_bastion_sg,
@@ -617,7 +629,7 @@ resource "aws_eks_node_group" "kubernetes_eks_gnr_ng" {
617629
aws_subnet.kubernetes_vpc_eks_nd_sn_1.id,
618630
aws_subnet.kubernetes_vpc_eks_nd_sn_2.id
619631
]
620-
version = "1.28"
632+
version = "1.29"
621633
ami_type = "AL2_x86_64"
622634
capacity_type = "ON_DEMAND"
623635
instance_types = ["t3a.small"]

module/kubernetes/aws/variables.tf

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,3 @@ variable "ssh_public_key" {
66
type = string
77
description = "SSH public key."
88
}
9-
variable "ec2_ami_id" {
10-
type = string
11-
description = "EC2 AMI identifier."
12-
}

module/kubernetes/azure/main.tf

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
provider "azurerm" {
2+
subscription_id = var.subscription_id
3+
resource_provider_registrations = "none"
4+
features {}
5+
}
6+
7+
resource "azurerm_resource_group" "kubernetes_rg" {
8+
name = "kubernetes-rg"
9+
location = "Central India"
10+
tags = {
11+
Name = "kubernetes-rg"
12+
Environment = var.environment
13+
Stack = "kubernetes"
14+
Region = "centralindia"
15+
Organization = "sloopstash"
16+
}
17+
}
18+
resource "azurerm_virtual_network" "kubernetes_vnet" {
19+
depends_on = [azurerm_resource_group.kubernetes_rg]
20+
name = "kubernetes-vnet"
21+
resource_group_name = azurerm_resource_group.kubernetes_rg.name
22+
location = azurerm_resource_group.kubernetes_rg.location
23+
address_space = [var.environment == "prd" ? "11.11.0.0/16" : "12.11.0.0/16"]
24+
encryption {
25+
enforcement = "AllowUnencrypted"
26+
}
27+
tags = {
28+
Name = "kubernetes-vnet"
29+
Environment = var.environment
30+
Stack = "kubernetes"
31+
Region = "centralindia"
32+
Organization = "sloopstash"
33+
}
34+
}
35+
resource "azurerm_subnet" "kubernetes_vnet_bastion_sn_1" {
36+
depends_on = [
37+
azurerm_resource_group.kubernetes_rg,
38+
azurerm_virtual_network.kubernetes_vnet
39+
]
40+
name = "kubernetes-vnet-bastion-sn-1"
41+
resource_group_name = azurerm_resource_group.kubernetes_rg.name
42+
virtual_network_name = azurerm_virtual_network.kubernetes_vnet.name
43+
address_prefixes = [var.environment == "prd" ? "11.11.1.0/24" : "12.11.1.0/24"]
44+
}
45+
resource "azurerm_subnet" "kubernetes_vnet_bastion_sn_2" {
46+
depends_on = [
47+
azurerm_resource_group.kubernetes_rg,
48+
azurerm_virtual_network.kubernetes_vnet
49+
]
50+
name = "kubernetes-vnet-bastion-sn-2"
51+
resource_group_name = azurerm_resource_group.kubernetes_rg.name
52+
virtual_network_name = azurerm_virtual_network.kubernetes_vnet.name
53+
address_prefixes = [var.environment == "prd" ? "11.11.2.0/24" : "12.11.2.0/24"]
54+
}
55+
resource "azurerm_subnet" "kubernetes_vnet_aks_nd_sn_1" {
56+
depends_on = [
57+
azurerm_resource_group.kubernetes_rg,
58+
azurerm_virtual_network.kubernetes_vnet
59+
]
60+
name = "kubernetes-vnet-aks-nd-sn-1"
61+
resource_group_name = azurerm_resource_group.kubernetes_rg.name
62+
virtual_network_name = azurerm_virtual_network.kubernetes_vnet.name
63+
address_prefixes = [var.environment == "prd" ? "11.11.9.0/24" : "12.11.9.0/24"]
64+
}
65+
resource "azurerm_subnet" "kubernetes_vnet_aks_nd_sn_2" {
66+
depends_on = [
67+
azurerm_resource_group.kubernetes_rg,
68+
azurerm_virtual_network.kubernetes_vnet
69+
]
70+
name = "kubernetes-vnet-aks-nd-sn-2"
71+
resource_group_name = azurerm_resource_group.kubernetes_rg.name
72+
virtual_network_name = azurerm_virtual_network.kubernetes_vnet.name
73+
address_prefixes = [var.environment == "prd" ? "11.11.10.0/24" : "12.11.10.0/24"]
74+
}
75+
resource "azurerm_network_security_group" "kubernetes_bastion_nsg" {
76+
depends_on = [azurerm_resource_group.kubernetes_rg]
77+
name = "kubernetes-bastion-nsg"
78+
resource_group_name = azurerm_resource_group.kubernetes_rg.name
79+
location = azurerm_resource_group.kubernetes_rg.location
80+
security_rule {
81+
name = "AllowAnySSHInbound"
82+
direction = "Inbound"
83+
access = "Allow"
84+
priority = 110
85+
protocol = "Tcp"
86+
source_address_prefix = "*"
87+
source_port_range = "*"
88+
destination_address_prefix = "*"
89+
destination_port_range = 22
90+
}
91+
tags = {
92+
Name = "kubernetes-bastion-nsg"
93+
Environment = var.environment
94+
Stack = "kubernetes"
95+
Region = "centralindia"
96+
Organization = "sloopstash"
97+
}
98+
}
99+
# resource "azurerm_kubernetes_cluster" "kubernetes_aks_ct" {
100+
# depends_on = [
101+
# azurerm_resource_group.kubernetes_rg,
102+
# azurerm_subnet.kubernetes_vnet_aks_nd_sn_1,
103+
# azurerm_subnet.kubernetes_vnet_aks_nd_sn_2
104+
# ]
105+
# name = "kubernetes-aks-ct"
106+
# resource_group_name = azurerm_resource_group.kubernetes_rg.name
107+
# location = azurerm_resource_group.kubernetes_rg.location
108+
# kubernetes_version = "1.28.15"
109+
# sku_tier = "Free"
110+
# identity {
111+
# type = "SystemAssigned"
112+
# }
113+
# open_service_mesh_enabled = false
114+
# private_cluster_enabled = false
115+
# dns_prefix = "kubernetes-aks-ct-api-endpoint"
116+
# api_server_access_profile {
117+
# authorized_ip_ranges = ["0.0.0.0/0"]
118+
# }
119+
# network_profile {
120+
# network_plugin = "kubenet"
121+
# network_policy = "calico"
122+
# ip_versions = ["IPv4"]
123+
# load_balancer_sku = "standard"
124+
# }
125+
# node_resource_group = "kubernetes-aks-ct-rg"
126+
# default_node_pool {
127+
# name = "nodepool1"
128+
# vm_size = "Standard_D2as_v4"
129+
# type = "VirtualMachineScaleSets"
130+
# os_sku = "AzureLinux"
131+
# vnet_subnet_id = azurerm_subnet.kubernetes_vnet_aks_nd_sn_1.id
132+
# node_public_ip_enabled = false
133+
# ultra_ssd_enabled = false
134+
# host_encryption_enabled = false
135+
# orchestrator_version = "1.28.15"
136+
# workload_runtime = "OCIContainer"
137+
# auto_scaling_enabled = true
138+
# max_count = 1
139+
# min_count = 1
140+
# node_count = 1
141+
# max_pods = 50
142+
# }
143+
# automatic_upgrade_channel = "patch"
144+
# node_os_upgrade_channel = "NodeImage"
145+
# maintenance_window {
146+
# allowed {
147+
# day = "Sunday"
148+
# hours = [1,2]
149+
# }
150+
# }
151+
# role_based_access_control_enabled = true
152+
# azure_policy_enabled = false
153+
# image_cleaner_enabled = false
154+
# oidc_issuer_enabled = false
155+
# run_command_enabled = true
156+
# tags = {
157+
# Name = "kubernetes-aks-ct"
158+
# Environment = var.environment
159+
# Stack = "kubernetes"
160+
# Region = "centralindia"
161+
# Organization = "sloopstash"
162+
# }
163+
# }

module/kubernetes/azure/outputs.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
output "kubernetes_eks_ct_fqdn" {
2+
depends_on = [azurerm_kubernetes_cluster.kubernetes_aks_ct]
3+
value = azurerm_kubernetes_cluster.kubernetes_aks_ct.fqdn
4+
}

module/kubernetes/azure/variables.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
variable "environment" {
2+
type = string
3+
description = "Environment."
4+
}
5+
variable "ssh_public_key" {
6+
type = string
7+
description = "SSH public key."
8+
}
9+
variable "subscription_id" {
10+
type = string
11+
description = "Subscription identifier."
12+
}

outputs.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@ output "aws_crm" {
44
output "aws_kubernetes" {
55
value = module.aws_kubernetes
66
}
7+
output "azure_kubernetes" {
8+
value = module.azure_kubernetes
9+
}

var/PRD.tfvars

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
environment = "prd"
22
aws_s3_bucket_prefix="<AMAZON_S3_BUCKET_PREFIX>"
33
aws_ec2_ami_id="<AMAZON_EC2_AMI_ID>"
4+
azure_subscription_id="<AZURE_SUBSCRIPTION_ID>"

var/STG.tfvars

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
environment = "prd"
22
aws_s3_bucket_prefix="<AMAZON_S3_BUCKET_PREFIX>"
33
aws_ec2_ami_id="<AMAZON_EC2_AMI_ID>"
4+
azure_subscription_id="<AZURE_SUBSCRIPTION_ID>"

variables.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,7 @@ variable "aws_ec2_ami_id" {
1414
type = string
1515
description = "Amazon EC2 AMI identifier."
1616
}
17+
variable "azure_subscription_id" {
18+
type = string
19+
description = "Azure subscription identifier."
20+
}

0 commit comments

Comments
 (0)