Skip to content

Commit 7628b2d

Browse files
committed
Swap
1 parent e529166 commit 7628b2d

File tree

12 files changed

+579
-15
lines changed

12 files changed

+579
-15
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ No providers.
188188
| <a name="module_networking"></a> [networking](#module\_networking) | ./modules/networking | n/a |
189189
| <a name="module_operator"></a> [operator](#module\_operator) | github.com/MaterializeInc/terraform-helm-materialize | v0.1.31 |
190190
| <a name="module_storage"></a> [storage](#module\_storage) | ./modules/storage | n/a |
191+
| <a name="module_swap_nodepool"></a> [swap\_nodepool](#module\_swap\_nodepool) | ./modules/nodepool | n/a |
191192

192193
## Resources
193194

@@ -202,8 +203,8 @@ No resources.
202203
| <a name="input_cert_manager_install_timeout"></a> [cert\_manager\_install\_timeout](#input\_cert\_manager\_install\_timeout) | Timeout for installing the cert-manager helm chart, in seconds. | `number` | `300` | no |
203204
| <a name="input_cert_manager_namespace"></a> [cert\_manager\_namespace](#input\_cert\_manager\_namespace) | The name of the namespace in which cert-manager is or will be installed. | `string` | `"cert-manager"` | no |
204205
| <a name="input_database_config"></a> [database\_config](#input\_database\_config) | Azure Database for PostgreSQL configuration | <pre>object({<br/> sku_name = optional(string, "GP_Standard_D2s_v3")<br/> postgres_version = optional(string, "15")<br/> password = string<br/> username = optional(string, "materialize")<br/> db_name = optional(string, "materialize")<br/> })</pre> | n/a | yes |
205-
| <a name="input_disk_setup_image"></a> [disk\_setup\_image](#input\_disk\_setup\_image) | Docker image for the disk setup script | `string` | `"materialize/ephemeral-storage-setup-image:v0.3.4"` | no |
206-
| <a name="input_disk_support_config"></a> [disk\_support\_config](#input\_disk\_support\_config) | Advanced configuration for disk support (only used when enable\_disk\_support = true) | <pre>object({<br/> install_openebs = optional(bool, true)<br/> run_disk_setup_script = optional(bool, true)<br/> create_storage_class = optional(bool, true)<br/> openebs_version = optional(string, "4.2.0")<br/> openebs_namespace = optional(string, "openebs")<br/> storage_class_name = optional(string, "openebs-lvm-instance-store-ext4")<br/> })</pre> | `{}` | no |
206+
| <a name="input_disk_setup_image"></a> [disk\_setup\_image](#input\_disk\_setup\_image) | Docker image for the disk setup script | `string` | `"materialize/ephemeral-storage-setup-image:v0.4.0"` | no |
207+
| <a name="input_disk_support_config"></a> [disk\_support\_config](#input\_disk\_support\_config) | Advanced configuration for disk support (only used when enable\_disk\_support = true) | <pre>object({<br/> install_openebs = optional(bool, true)<br/> run_disk_setup_script = optional(bool, true)<br/> create_storage_class = optional(bool, true)<br/> openebs_version = optional(string, "4.3.3")<br/> openebs_namespace = optional(string, "openebs")<br/> storage_class_name = optional(string, "openebs-lvm-instance-store-ext4")<br/> })</pre> | `{}` | no |
207208
| <a name="input_enable_disk_support"></a> [enable\_disk\_support](#input\_enable\_disk\_support) | Enable disk support for Materialize using OpenEBS and local SSDs. When enabled, this configures OpenEBS, runs the disk setup script, and creates appropriate storage classes. | `bool` | `true` | no |
208209
| <a name="input_helm_chart"></a> [helm\_chart](#input\_helm\_chart) | Chart name from repository or local path to chart. For local charts, set the path to the chart directory. | `string` | `"materialize-operator"` | no |
209210
| <a name="input_helm_values"></a> [helm\_values](#input\_helm\_values) | Additional Helm values to merge with defaults | `any` | `{}` | no |
@@ -218,6 +219,7 @@ No resources.
218219
| <a name="input_orchestratord_version"></a> [orchestratord\_version](#input\_orchestratord\_version) | Version of the Materialize orchestrator to install | `string` | `null` | no |
219220
| <a name="input_prefix"></a> [prefix](#input\_prefix) | Prefix to be used for resource names | `string` | `"materialize"` | no |
220221
| <a name="input_resource_group_name"></a> [resource\_group\_name](#input\_resource\_group\_name) | The name of an existing resource group to use | `string` | n/a | yes |
222+
| <a name="input_swap_enabled"></a> [swap\_enabled](#input\_swap\_enabled) | Enable swap for Materialize. When enabled, this configures swap on a new nodepool, and adds it to the clusterd node selectors. | `bool` | `false` | no |
221223
| <a name="input_tags"></a> [tags](#input\_tags) | Tags to apply to all resources | `map(string)` | `{}` | no |
222224
| <a name="input_use_local_chart"></a> [use\_local\_chart](#input\_use\_local\_chart) | Whether to use a local chart instead of one from a repository | `bool` | `false` | no |
223225
| <a name="input_use_self_signed_cluster_issuer"></a> [use\_self\_signed\_cluster\_issuer](#input\_use\_self\_signed\_cluster\_issuer) | Whether to install and use a self-signed ClusterIssuer for TLS. To work around limitations in Terraform, this will be treated as `false` if no materialize instances are defined. | `bool` | `true` | no |

examples/simple/main.tf

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ module "materialize" {
9191

9292
materialize_instances = var.materialize_instances
9393

94+
swap_enabled = var.swap_enabled
95+
9496
database_config = {
9597
sku_name = "GP_Standard_D2s_v3"
9698
version = "15"
@@ -188,6 +190,12 @@ variable "use_self_signed_cluster_issuer" {
188190
default = true
189191
}
190192

193+
variable "swap_enabled" {
194+
description = "Enable swap for Materialize. When enabled, this configures swap on a new nodepool, and adds it to the clusterd node selectors."
195+
type = bool
196+
default = false
197+
}
198+
191199
# Output the Materialize instance details
192200
output "aks_cluster" {
193201
description = "AKS cluster details"

main.tf

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,31 @@ module "aks" {
6262
tags = local.common_labels
6363
}
6464

65+
module "swap_nodepool" {
66+
count = var.swap_enabled ? 1 : 0
67+
source = "./modules/nodepool"
68+
depends_on = [module.aks]
69+
70+
prefix = "${var.prefix}-mz-swap"
71+
cluster_id = module.aks.cluster_id
72+
subnet_id = module.networking.aks_subnet_id
73+
74+
vm_size = var.aks_config.vm_size
75+
disk_size_gb = var.aks_config.disk_size_gb
76+
77+
autoscaling_config = {
78+
enabled = true
79+
min_nodes = var.aks_config.min_nodes
80+
max_nodes = var.aks_config.max_nodes
81+
}
82+
83+
swap_enabled = true
84+
disk_setup_image = var.disk_setup_image
85+
86+
labels = local.common_labels
87+
tags = local.common_labels
88+
}
89+
6590
module "database" {
6691
source = "./modules/database"
6792

@@ -123,7 +148,7 @@ locals {
123148
region = var.location
124149
}
125150
clusters = {
126-
swap_enabled = false
151+
swap_enabled = var.swap_enabled
127152
}
128153
}
129154
observability = {
@@ -227,6 +252,7 @@ module "operator" {
227252

228253
depends_on = [
229254
module.aks,
255+
module.swap_nodepool,
230256
module.database,
231257
module.storage,
232258
module.certificates,

modules/aks/main.tf

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
locals {
2-
nodepool_name = substr(replace(var.prefix, "-", ""), 0, 12)
2+
nodepool_name = substr(replace(var.prefix, "-", ""), 0, 12)
3+
disk_setup_name = "disk-setup-scratchfs"
34
}
45

56
resource "azurerm_user_assigned_identity" "aks_identity" {
@@ -84,6 +85,12 @@ resource "azurerm_kubernetes_cluster_node_pool" "materialize" {
8485
"materialize.cloud/disk-config-required" = var.enable_disk_setup ? "true" : "false"
8586
}
8687

88+
upgrade_settings {
89+
max_surge = "10%"
90+
drain_timeout_in_minutes = 0
91+
node_soak_duration_in_minutes = 0
92+
}
93+
8794
# Taints can not be removed: https://github.com/Azure/AKS/issues/2934
8895
# node_taints = var.enable_disk_setup ? ["materialize.cloud/disk-unconfigured=true:NoSchedule"] : []
8996

@@ -182,7 +189,7 @@ resource "kubernetes_namespace" "disk_setup" {
182189
count = var.enable_disk_setup ? 1 : 0
183190

184191
metadata {
185-
name = "disk-setup"
192+
name = local.disk_setup_name
186193
labels = {
187194
"app.kubernetes.io/managed-by" = "terraform"
188195
"app.kubernetes.io/part-of" = "materialize"
@@ -198,26 +205,26 @@ resource "kubernetes_daemonset" "disk_setup" {
198205
count = var.enable_disk_setup ? 1 : 0
199206

200207
metadata {
201-
name = "disk-setup"
208+
name = local.disk_setup_name
202209
namespace = kubernetes_namespace.disk_setup[0].metadata[0].name
203210
labels = {
204211
"app.kubernetes.io/managed-by" = "terraform"
205212
"app.kubernetes.io/part-of" = "materialize"
206-
"app" = "disk-setup"
213+
"app" = local.disk_setup_name
207214
}
208215
}
209216

210217
spec {
211218
selector {
212219
match_labels = {
213-
app = "disk-setup"
220+
app = local.disk_setup_name
214221
}
215222
}
216223

217224
template {
218225
metadata {
219226
labels = {
220-
app = "disk-setup"
227+
app = local.disk_setup_name
221228
}
222229
}
223230

@@ -236,7 +243,7 @@ resource "kubernetes_daemonset" "disk_setup" {
236243
required_during_scheduling_ignored_during_execution {
237244
node_selector_term {
238245
match_expressions {
239-
key = "materialize.cloud/disk"
246+
key = "materialize.cloud/scratch-fs"
240247
operator = "In"
241248
values = ["true"]
242249
}
@@ -346,15 +353,15 @@ resource "kubernetes_daemonset" "disk_setup" {
346353
resource "kubernetes_service_account" "disk_setup" {
347354
count = var.enable_disk_setup ? 1 : 0
348355
metadata {
349-
name = "disk-setup"
356+
name = local.disk_setup_name
350357
namespace = kubernetes_namespace.disk_setup[0].metadata[0].name
351358
}
352359
}
353360

354361
resource "kubernetes_cluster_role" "disk_setup" {
355362
count = var.enable_disk_setup ? 1 : 0
356363
metadata {
357-
name = "disk-setup"
364+
name = local.disk_setup_name
358365
}
359366
rule {
360367
api_groups = [""]
@@ -366,7 +373,7 @@ resource "kubernetes_cluster_role" "disk_setup" {
366373
resource "kubernetes_cluster_role_binding" "disk_setup" {
367374
count = var.enable_disk_setup ? 1 : 0
368375
metadata {
369-
name = "disk-setup"
376+
name = local.disk_setup_name
370377
}
371378
role_ref {
372379
api_group = "rbac.authorization.k8s.io"

modules/aks/outputs.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ output "cluster_name" {
33
value = azurerm_kubernetes_cluster.aks.name
44
}
55

6+
output "cluster_id" {
7+
description = "The ID of the AKS cluster"
8+
value = azurerm_kubernetes_cluster.aks.id
9+
}
10+
611
output "cluster_endpoint" {
712
description = "The endpoint of the AKS cluster"
813
value = azurerm_kubernetes_cluster.aks.kube_config[0].host

modules/aks/variables.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,5 +88,5 @@ variable "openebs_version" {
8888
variable "disk_setup_image" {
8989
description = "Docker image for the disk setup script"
9090
type = string
91-
default = "materialize/ephemeral-storage-setup-image:v0.1.2"
91+
default = "materialize/ephemeral-storage-setup-image:v0.4.0"
9292
}

modules/nodepool/README.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
## Requirements
2+
3+
| Name | Version |
4+
|------|---------|
5+
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
6+
| <a name="requirement_azurerm"></a> [azurerm](#requirement\_azurerm) | ~> 4.0 |
7+
| <a name="requirement_kubernetes"></a> [kubernetes](#requirement\_kubernetes) | >= 2.10.0 |
8+
9+
## Providers
10+
11+
| Name | Version |
12+
|------|---------|
13+
| <a name="provider_azurerm"></a> [azurerm](#provider\_azurerm) | ~> 4.0 |
14+
| <a name="provider_kubernetes"></a> [kubernetes](#provider\_kubernetes) | >= 2.10.0 |
15+
16+
## Modules
17+
18+
No modules.
19+
20+
## Resources
21+
22+
| Name | Type |
23+
|------|------|
24+
| [azurerm_kubernetes_cluster_node_pool.primary_nodes](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/kubernetes_cluster_node_pool) | resource |
25+
| [kubernetes_cluster_role.disk_setup](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/cluster_role) | resource |
26+
| [kubernetes_cluster_role_binding.disk_setup](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/cluster_role_binding) | resource |
27+
| [kubernetes_daemonset.disk_setup](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/daemonset) | resource |
28+
| [kubernetes_namespace.disk_setup](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/namespace) | resource |
29+
| [kubernetes_service_account.disk_setup](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/service_account) | resource |
30+
31+
## Inputs
32+
33+
| Name | Description | Type | Default | Required |
34+
|------|-------------|------|---------|:--------:|
35+
| <a name="input_autoscaling_config"></a> [autoscaling\_config](#input\_autoscaling\_config) | Auto-scaling configuration for the node pool | <pre>object({<br/> enabled = bool<br/> min_nodes = optional(number)<br/> max_nodes = optional(number)<br/> node_count = optional(number)<br/> })</pre> | <pre>{<br/> "enabled": true,<br/> "max_nodes": 10,<br/> "min_nodes": 1,<br/> "node_count": null<br/>}</pre> | no |
36+
| <a name="input_cluster_id"></a> [cluster\_id](#input\_cluster\_id) | The ID of the AKS cluster | `string` | n/a | yes |
37+
| <a name="input_disk_setup_container_resource_config"></a> [disk\_setup\_container\_resource\_config](#input\_disk\_setup\_container\_resource\_config) | Resource configuration for disk setup init container | <pre>object({<br/> memory_limit = string<br/> memory_request = string<br/> cpu_request = string<br/> })</pre> | <pre>{<br/> "cpu_request": "50m",<br/> "memory_limit": "128Mi",<br/> "memory_request": "128Mi"<br/>}</pre> | no |
38+
| <a name="input_disk_setup_image"></a> [disk\_setup\_image](#input\_disk\_setup\_image) | Docker image for the disk setup script | `string` | `"materialize/ephemeral-storage-setup-image:v0.4.0"` | no |
39+
| <a name="input_disk_size_gb"></a> [disk\_size\_gb](#input\_disk\_size\_gb) | Size of the disk attached to each node | `number` | n/a | yes |
40+
| <a name="input_labels"></a> [labels](#input\_labels) | Additional labels to apply to Kubernetes resources | `map(string)` | `{}` | no |
41+
| <a name="input_node_taints"></a> [node\_taints](#input\_node\_taints) | Taints to apply to the node pool. Note: Once applied via Terraform, these taints cannot be manually removed by users due to AKS webhook restrictions. | <pre>list(object({<br/> key = string<br/> value = string<br/> effect = string<br/> }))</pre> | `[]` | no |
42+
| <a name="input_pause_container_resource_config"></a> [pause\_container\_resource\_config](#input\_pause\_container\_resource\_config) | Resource configuration for pause container | <pre>object({<br/> memory_limit = string<br/> memory_request = string<br/> cpu_request = string<br/> })</pre> | <pre>{<br/> "cpu_request": "1m",<br/> "memory_limit": "8Mi",<br/> "memory_request": "8Mi"<br/>}</pre> | no |
43+
| <a name="input_prefix"></a> [prefix](#input\_prefix) | Prefix to be used for resource names | `string` | n/a | yes |
44+
| <a name="input_subnet_id"></a> [subnet\_id](#input\_subnet\_id) | The ID of the subnet | `string` | n/a | yes |
45+
| <a name="input_swap_enabled"></a> [swap\_enabled](#input\_swap\_enabled) | Whether to enable swap on the local NVMe disks. | `bool` | `false` | no |
46+
| <a name="input_tags"></a> [tags](#input\_tags) | Tags to apply to resources | `map(string)` | `{}` | no |
47+
| <a name="input_vm_size"></a> [vm\_size](#input\_vm\_size) | VM size for AKS nodes | `string` | n/a | yes |
48+
49+
## Outputs
50+
51+
| Name | Description |
52+
|------|-------------|
53+
| <a name="output_nodepool_id"></a> [nodepool\_id](#output\_nodepool\_id) | The ID of the node pool |
54+
| <a name="output_nodepool_max_count"></a> [nodepool\_max\_count](#output\_nodepool\_max\_count) | The maximum count of nodes in the node pool |
55+
| <a name="output_nodepool_min_count"></a> [nodepool\_min\_count](#output\_nodepool\_min\_count) | The minimum count of nodes in the node pool |
56+
| <a name="output_nodepool_name"></a> [nodepool\_name](#output\_nodepool\_name) | The name of the node pool |
57+
| <a name="output_nodepool_vm_size"></a> [nodepool\_vm\_size](#output\_nodepool\_vm\_size) | The VM size of the node pool |

0 commit comments

Comments
 (0)