Skip to content

Commit e60d0f2

Browse files
Terraform module for azure kubernetes cluster (#13)
* DEVOPS-292 data file * DEVOPS-301 added plan files to gitignore * DEVOPS-292 kubernetes terraform code * DEVOPS-300 output tf code * DEVOPS-300 providers and variables tf code * Update terraform tf files DEVOPS-301 DEVOPS-302 * remove role assignment resource block
1 parent 29020f2 commit e60d0f2

File tree

6 files changed

+529
-0
lines changed

6 files changed

+529
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,5 @@ terraform.rc
4848
# Un-ignore subdirectories and their contents within .github
4949
# !.github/**/
5050
# README./
51+
52+
*.out

kubernetes-cluster/data.tf

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# current user / service principal details
2+
data "azurerm_client_config" "current" {
3+
}
4+
5+
# get admin group details
6+
data "azuread_groups" "cluster_admin" {
7+
display_names = [for group in var.cluster_admin_group_names : group]
8+
}
9+
10+
# get sp app id from kv
11+
data "azuread_service_principal" "sp" {
12+
client_id = data.azurerm_key_vault_secret.appid.value
13+
}
14+
15+
# get subnet id for nodepool
16+
data "azurerm_subnet" "vnet_subnet_cidr" {
17+
name = var.subnet_name
18+
virtual_network_name = var.virtual_network_name
19+
resource_group_name = var.virtual_netwok_rg
20+
}
21+
22+
# get subscription id
23+
data "azurerm_subscription" "primary" {
24+
}
25+
26+
# get kv details
27+
data "azurerm_key_vault" "existing" {
28+
name = var.keyvault_name
29+
resource_group_name = var.keyvault_rg_name
30+
}
31+
32+
# get sp app id from kv
33+
data "azurerm_key_vault_secret" "secret" {
34+
name = "AKS-SP-PASSWORD"
35+
key_vault_id = data.azurerm_key_vault.existing.id
36+
}
37+
38+
# get sp app secret from kv
39+
data "azurerm_key_vault_secret" "appid" {
40+
name = "AKS-SP-APPID"
41+
key_vault_id = data.azurerm_key_vault.existing.id
42+
}

kubernetes-cluster/kubernetes.tf

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
# Create k8s service resource group
2+
resource "azurerm_resource_group" "rg" {
3+
name = upper(var.resource_group_name)
4+
location = var.location
5+
tags = {
6+
Environment = upper(var.environment)
7+
Orchestrator = "Terraform"
8+
DisplayName = upper(var.resource_group_name)
9+
ApplicationName = lower(var.application_name)
10+
Temporary = upper(var.temporary)
11+
}
12+
}
13+
14+
# Create AKS cluster, nodepools, loadbalancer etc
15+
resource "azurerm_kubernetes_cluster" "aks_cluster" {
16+
name = upper(var.aks_cluster_name)
17+
location = var.location
18+
resource_group_name = azurerm_resource_group.rg.name
19+
automatic_upgrade_channel = var.automatic_upgrade_channel
20+
kubernetes_version = var.kubernetes_version
21+
sku_tier = var.kubernetes_sku_tier
22+
node_resource_group = var.aks_node_resource_group_name
23+
24+
dns_prefix = var.aks_cluster_name
25+
26+
azure_active_directory_role_based_access_control {
27+
tenant_id = data.azurerm_client_config.current.tenant_id
28+
admin_group_object_ids = data.azuread_groups.cluster_admin.object_ids
29+
}
30+
31+
network_profile {
32+
network_plugin = var.network_plugin
33+
network_plugin_mode = var.network_plugin_mode
34+
network_policy = var.network_policy
35+
pod_cidr = var.pod_cidr_range
36+
service_cidr = var.service_cidr_subnet
37+
load_balancer_sku = var.load_balancer_sku
38+
dns_service_ip = cidrhost((var.service_cidr_subnet), 5) # 5th ip on service cidr subnet
39+
}
40+
41+
service_principal {
42+
client_id = data.azurerm_key_vault_secret.appid.value
43+
client_secret = data.azurerm_key_vault_secret.secret.value
44+
}
45+
46+
workload_identity_enabled = var.workload_identity_enabled
47+
oidc_issuer_enabled = var.workload_identity_enabled ? true : false
48+
49+
support_plan = var.support_plan
50+
51+
storage_profile {
52+
blob_driver_enabled = var.enable_blob_driver
53+
disk_driver_enabled = var.enable_disk_driver
54+
file_driver_enabled = var.enable_fileshare_driver
55+
}
56+
57+
default_node_pool {
58+
name = var.default_nodepool_name
59+
vm_size = var.default_nodepool_sku
60+
auto_scaling_enabled = var.default_nodepool_autoscaling
61+
type = "VirtualMachineScaleSets"
62+
node_public_ip_enabled = var.node_public_ip_enabled
63+
orchestrator_version = var.kubernetes_version
64+
max_pods = var.max_pods_per_node
65+
vnet_subnet_id = data.azurerm_subnet.vnet_subnet_cidr.id
66+
os_sku = var.os_sku
67+
max_count = var.default_nodepool_max_count
68+
min_count = var.default_nodepool_min_count
69+
tags = {
70+
Environment = upper(var.environment)
71+
DisplayName = upper(var.default_nodepool_name)
72+
ApplicationName = lower(var.application_name)
73+
Temporary = upper(var.temporary)
74+
}
75+
76+
}
77+
78+
depends_on = [ azurerm_resource_group.rg ]
79+
80+
key_vault_secrets_provider {
81+
secret_rotation_enabled = var.key_vault_secrets_provider
82+
secret_rotation_interval = var.secret_rotation_interval
83+
}
84+
85+
tags = {
86+
Environment = upper(var.environment)
87+
Orchestrator = "Terraform"
88+
DisplayName = upper(var.aks_cluster_name)
89+
ApplicationName = lower(var.application_name)
90+
Temporary = upper(var.temporary)
91+
}
92+
93+
}
94+
95+
# Create worker nodepool
96+
resource "azurerm_kubernetes_cluster_node_pool" "workernodes" {
97+
name = var.worker_nodepool_name
98+
kubernetes_cluster_id = azurerm_kubernetes_cluster.aks_cluster.id
99+
vm_size = var.worker_nodepool_sku
100+
auto_scaling_enabled = var.worker_nodepool_autoscaling
101+
node_public_ip_enabled = var.node_public_ip_enabled
102+
priority = var.worker_node_spot ? "Spot" : "Regular"
103+
scale_down_mode = var.worker_node_scaledown_mode
104+
vnet_subnet_id = data.azurerm_subnet.vnet_subnet_cidr.id
105+
min_count = var.worker_nodepool_min_count
106+
max_count = var.worker_nodepool_max_count
107+
eviction_policy = var.worker_nodepool_eviction_policy
108+
os_sku = var.os_sku
109+
os_disk_size_gb = var.os_disk_size_in_gb
110+
orchestrator_version = var.kubernetes_version
111+
max_pods = var.max_pods_per_node
112+
tags = {
113+
Environment = upper(var.environment)
114+
DisplayName = upper(var.worker_nodepool_name)
115+
ApplicationName = lower(var.application_name)
116+
Temporary = upper(var.temporary)
117+
}
118+
}

kubernetes-cluster/output.tf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
output "aks_cluster_name" {
2+
description = "Azure AKS name"
3+
value = azurerm_kubernetes_cluster.aks_cluster.name
4+
}
5+
6+
output "aks_cluster_control_plane_url" {
7+
description = "FQDN of the Azure Kubernetes Managed Cluster"
8+
value = azurerm_kubernetes_cluster.aks_cluster.fqdn
9+
}

kubernetes-cluster/providers.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
terraform {
2+
required_version = "~> 1.3"
3+
required_providers {
4+
azurerm = {
5+
source = "hashicorp/azurerm"
6+
version = "<= 4.14.0"
7+
}
8+
}
9+
}
10+
provider "azurerm" {
11+
features {}
12+
}

0 commit comments

Comments
 (0)