Skip to content

Commit 1a18d6b

Browse files
committed
feat: refactor module and add support for Kosmos
BREAKING CHANGE : should not produce any changes but switch to our particule provider waiting for scaleway to release a new version Signed-off-by: Kevin Lefevre <[email protected]>
1 parent 7e5f911 commit 1a18d6b

File tree

7 files changed

+132
-157
lines changed

7 files changed

+132
-157
lines changed

README.md

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ A terraform module to create a managed Kubernetes cluster on Scaleway Element.
1010

1111
| Name | Version |
1212
|------|---------|
13-
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.13 |
14-
| <a name="requirement_scaleway"></a> [scaleway](#requirement\_scaleway) | ~> 2.0 |
13+
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.14 |
14+
| <a name="requirement_scaleway"></a> [scaleway](#requirement\_scaleway) | 2.2.0-rc.0 |
1515

1616
## Providers
1717

1818
| Name | Version |
1919
|------|---------|
20-
| <a name="provider_scaleway"></a> [scaleway](#provider\_scaleway) | ~> 2.0 |
20+
| <a name="provider_scaleway"></a> [scaleway](#provider\_scaleway) | 2.2.0-rc.0 |
2121

2222
## Modules
2323

@@ -27,29 +27,30 @@ No modules.
2727

2828
| Name | Type |
2929
|------|------|
30-
| [scaleway_k8s_cluster.this](https://registry.terraform.io/providers/scaleway/scaleway/latest/docs/resources/k8s_cluster) | resource |
31-
| [scaleway_k8s_pool.this](https://registry.terraform.io/providers/scaleway/scaleway/latest/docs/resources/k8s_pool) | resource |
30+
| [scaleway_k8s_cluster.this](https://registry.terraform.io/providers/particuleio/scaleway/2.2.0-rc.0/docs/resources/k8s_cluster) | resource |
31+
| [scaleway_k8s_pool.this](https://registry.terraform.io/providers/particuleio/scaleway/2.2.0-rc.0/docs/resources/k8s_pool) | resource |
3232

3333
## Inputs
3434

3535
| Name | Description | Type | Default | Required |
3636
|------|-------------|------|---------|:--------:|
37-
| <a name="input_admission_plugins"></a> [admission\_plugins](#input\_admission\_plugins) | The list of admission plugins to enable on the cluster. | `list` | `[]` | no |
38-
| <a name="input_apiserver_cert_sans"></a> [apiserver\_cert\_sans](#input\_apiserver\_cert\_sans) | Additional Subject Alternative Names for the Kubernetes API server certificate | `any` | `null` | no |
39-
| <a name="input_auto_upgrade"></a> [auto\_upgrade](#input\_auto\_upgrade) | The auto upgrade configuration. | <pre>object({<br> enable = bool<br> maintenance_window_start_hour = number<br> maintenance_window_day = string<br> })</pre> | `null` | no |
40-
| <a name="input_autoscaler_config"></a> [autoscaler\_config](#input\_autoscaler\_config) | The configuration options for the Kubernetes cluster autoscaler. | <pre>object({<br> enabled = bool<br> disable_scale_down = bool<br> scale_down_delay_after_add = string<br> scale_down_unneeded_time = string<br> estimator = string<br> expander = string<br> ignore_daemonsets_utilization = bool<br> balance_similar_node_groups = bool<br> expendable_pods_priority_cutoff = number<br> scale_down_utilization_threshold = number<br> max_graceful_termination_sec = number<br> })</pre> | `null` | no |
41-
| <a name="input_cluster_description"></a> [cluster\_description](#input\_cluster\_description) | A description for the Kubernetes cluster. | `any` | n/a | yes |
42-
| <a name="input_cluster_name"></a> [cluster\_name](#input\_cluster\_name) | The name for the Kubernetes cluster. | `any` | n/a | yes |
43-
| <a name="input_cluster_tags"></a> [cluster\_tags](#input\_cluster\_tags) | The tags associated with the Kubernetes cluster. | `list` | `[]` | no |
44-
| <a name="input_cni_plugin"></a> [cni\_plugin](#input\_cni\_plugin) | The Container Network Interface (CNI) for the Kubernetes cluster. | `string` | `"cilium"` | no |
45-
| <a name="input_delete_additional_resources"></a> [delete\_additional\_resources](#input\_delete\_additional\_resources) | Delete additional resources like block volumes and loadbalancers that were created in Kubernetes on cluster deletion. | `bool` | `false` | no |
46-
| <a name="input_feature_gates"></a> [feature\_gates](#input\_feature\_gates) | The list of feature gates to enable on the cluster. | `list` | `[]` | no |
47-
| <a name="input_kubernetes_version"></a> [kubernetes\_version](#input\_kubernetes\_version) | The version of the Kubernetes cluster. | `string` | `"1.20.4"` | no |
48-
| <a name="input_node_pools"></a> [node\_pools](#input\_node\_pools) | Creates and manages Scaleway Kubernetes cluster pools. | `any` | `{}` | no |
49-
| <a name="input_node_pools_defaults"></a> [node\_pools\_defaults](#input\_node\_pools\_defaults) | Default configuration for Kubernetes cluster pools. | `map(any)` | `{}` | no |
50-
| <a name="input_open_id_connect_config"></a> [open\_id\_connect\_config](#input\_open\_id\_connect\_config) | The OpenID Connect configuration of the cluster | <pre>object({<br> enabled = bool<br> issuer_url = string<br> client_id = string<br> username_claim = string<br> username_prefix = string<br> groups_claim = list(string)<br> groups_prefix = string<br> required_claim = list(string)<br> })</pre> | `null` | no |
51-
| <a name="input_project_id"></a> [project\_id](#input\_project\_id) | (Defaults to provider project\_id) The ID of the project the cluster is associated with. | `any` | `null` | no |
52-
| <a name="input_region"></a> [region](#input\_region) | (Defaults to provider region) The region in which the cluster should be created. | `any` | `null` | no |
37+
| <a name="input_admission_plugins"></a> [admission\_plugins](#input\_admission\_plugins) | The list of admission plugins to enable on the cluster | `list` | `[]` | no |
38+
| <a name="input_apiserver_cert_sans"></a> [apiserver\_cert\_sans](#input\_apiserver\_cert\_sans) | Additional Subject Alternative Names for the Kubernetes API server certificate | `list(any)` | `[]` | no |
39+
| <a name="input_auto_upgrade"></a> [auto\_upgrade](#input\_auto\_upgrade) | The auto upgrade configuration | <pre>list(object({<br> enable = bool<br> maintenance_window_start_hour = number<br> maintenance_window_day = string<br> }))</pre> | `[]` | no |
40+
| <a name="input_autoscaler_config"></a> [autoscaler\_config](#input\_autoscaler\_config) | The configuration options for the Kubernetes cluster autoscaler | <pre>list(object({<br> disable_scale_down = optional(bool)<br> scale_down_delay_after_add = optional(string)<br> scale_down_unneeded_time = optional(string)<br> estimator = optional(string)<br> expander = optional(string)<br> ignore_daemonsets_utilization = optional(bool)<br> balance_similar_node_groups = optional(bool)<br> expendable_pods_priority_cutoff = optional(number)<br> scale_down_utilization_threshold = optional(number)<br> max_graceful_termination_sec = optional(number)<br> }))</pre> | `[]` | no |
41+
| <a name="input_cluster_description"></a> [cluster\_description](#input\_cluster\_description) | A description for the Kubernetes cluster | `any` | `null` | no |
42+
| <a name="input_cluster_name"></a> [cluster\_name](#input\_cluster\_name) | The name for the Kubernetes cluster | `any` | n/a | yes |
43+
| <a name="input_cluster_tags"></a> [cluster\_tags](#input\_cluster\_tags) | The tags associated with the Kubernetes cluster | `list` | `[]` | no |
44+
| <a name="input_cluster_type"></a> [cluster\_type](#input\_cluster\_type) | The type of cluster | `string` | `"kapsule"` | no |
45+
| <a name="input_cni_plugin"></a> [cni\_plugin](#input\_cni\_plugin) | The Container Network Interface (CNI) for the Kubernetes cluster | `string` | `"cilium"` | no |
46+
| <a name="input_delete_additional_resources"></a> [delete\_additional\_resources](#input\_delete\_additional\_resources) | Delete additional resources like block volumes and loadbalancers that were created in Kubernetes on cluster deletion | `bool` | `false` | no |
47+
| <a name="input_feature_gates"></a> [feature\_gates](#input\_feature\_gates) | The list of feature gates to enable on the cluster | `list` | `[]` | no |
48+
| <a name="input_kubernetes_version"></a> [kubernetes\_version](#input\_kubernetes\_version) | The version of the Kubernetes cluster | `string` | `"1.23.0"` | no |
49+
| <a name="input_node_pools"></a> [node\_pools](#input\_node\_pools) | Creates and manages Scaleway Kubernetes cluster pools | `any` | `{}` | no |
50+
| <a name="input_node_pools_defaults"></a> [node\_pools\_defaults](#input\_node\_pools\_defaults) | Default configuration for Kubernetes cluster pools | `map(any)` | `{}` | no |
51+
| <a name="input_open_id_connect_config"></a> [open\_id\_connect\_config](#input\_open\_id\_connect\_config) | The OpenID Connect configuration of the cluster | <pre>list(object({<br> issuer_url = string<br> client_id = string<br> username_claim = optional(string)<br> username_prefix = optional(string)<br> groups_claim = optional(list(string))<br> groups_prefix = optional(string)<br> required_claim = optional(list(string))<br> }))</pre> | `[]` | no |
52+
| <a name="input_project_id"></a> [project\_id](#input\_project\_id) | (Defaults to provider project\_id) The ID of the project the cluster is associated with | `any` | `null` | no |
53+
| <a name="input_region"></a> [region](#input\_region) | (Defaults to provider region) The region in which the cluster should be created | `any` | `null` | no |
5354
| <a name="input_tags"></a> [tags](#input\_tags) | Tags applied to all ressources. | `list` | `[]` | no |
5455

5556
## Outputs

cluster.tf

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,55 @@
11
resource "scaleway_k8s_cluster" "this" {
2-
name = local.cluster_name
3-
description = local.cluster_description
4-
project_id = local.project_id
5-
version = local.kubernetes_version
6-
cni = local.cni_plugin
7-
tags = distinct(compact(concat(local.cluster_tags, local.tags)))
8-
delete_additional_resources = local.delete_additional_resources
2+
type = var.cluster_type
3+
name = var.cluster_name
4+
description = var.cluster_description
5+
version = var.kubernetes_version
6+
cni = var.cluster_type == "multicloud" ? "kilo" : var.cni_plugin
7+
tags = distinct(compact(concat(var.cluster_tags, var.tags)))
98

109
dynamic "autoscaler_config" {
11-
for_each = local.autoscaler_config["enabled"] ? list("autoscaler_config") : []
10+
for_each = toset(var.autoscaler_config)
1211
content {
13-
disable_scale_down = local.autoscaler_config["disable_scale_down"]
14-
scale_down_delay_after_add = local.autoscaler_config["scale_down_delay_after_add"]
15-
scale_down_unneeded_time = local.autoscaler_config["scale_down_unneeded_time"]
16-
estimator = local.autoscaler_config["estimator"]
17-
expander = local.autoscaler_config["expander"]
18-
ignore_daemonsets_utilization = local.autoscaler_config["ignore_daemonsets_utilization"]
19-
balance_similar_node_groups = local.autoscaler_config["balance_similar_node_groups"]
20-
expendable_pods_priority_cutoff = local.autoscaler_config["expendable_pods_priority_cutoff"]
21-
scale_down_utilization_threshold = local.autoscaler_config["scale_down_utilization_threshold"]
22-
max_graceful_termination_sec = local.autoscaler_config["max_graceful_termination_sec"]
12+
disable_scale_down = lookup(autoscaler_config.value, "disable_scale_down", null)
13+
scale_down_delay_after_add = lookup(autoscaler_config.value, "scale_down_delay_after_add", null)
14+
scale_down_unneeded_time = lookup(autoscaler_config.value, "scale_down_unneeded_time", null)
15+
estimator = lookup(autoscaler_config.value, "estimator", null)
16+
expander = lookup(autoscaler_config.value, "expander", null)
17+
ignore_daemonsets_utilization = lookup(autoscaler_config.value, "ignore_daemonsets_utilization", null)
18+
balance_similar_node_groups = lookup(autoscaler_config.value, "balance_similar_node_groups", null)
19+
expendable_pods_priority_cutoff = lookup(autoscaler_config.value, "expendable_pods_priority_cutoff", null)
20+
scale_down_utilization_threshold = lookup(autoscaler_config.value, "scale_down_utilization_threshold", null)
21+
max_graceful_termination_sec = lookup(autoscaler_config.value, "max_graceful_termination_sec", null)
2322
}
2423
}
2524

2625
dynamic "auto_upgrade" {
27-
for_each = local.auto_upgrade["enable"] ? list("auto_upgrade") : []
26+
for_each = toset(var.auto_upgrade)
2827
content {
29-
enable = local.auto_upgrade["enable"]
30-
maintenance_window_start_hour = local.auto_upgrade["maintenance_window_start_hour"]
31-
maintenance_window_day = local.auto_upgrade["maintenance_window_day"]
28+
enable = lookup(auto_upgrade.value, "enable", null)
29+
maintenance_window_start_hour = lookup(auto_upgrade.value, "maintenance_window_start_hour", null)
30+
maintenance_window_day = lookup(auto_upgrade.value, "maintenance_window_day", null)
3231
}
3332
}
3433

34+
feature_gates = var.feature_gates
35+
admission_plugins = var.admission_plugins
36+
apiserver_cert_sans = var.apiserver_cert_sans
37+
3538
dynamic "open_id_connect_config" {
36-
for_each = local.open_id_connect_config["enabled"] ? list("open_id_connect_config") : []
39+
for_each = toset(var.open_id_connect_config)
3740
content {
38-
issuer_url = local.open_id_connect_config["issuer_url"]
39-
client_id = local.open_id_connect_config["client_id"]
40-
username_claim = local.open_id_connect_config["username_claim"]
41-
username_prefix = local.open_id_connect_config["username_prefix"]
42-
groups_claim = local.open_id_connect_config["groups_claim"]
43-
groups_prefix = local.open_id_connect_config["groups_prefix"]
44-
required_claim = local.open_id_connect_config["required_claim"]
41+
issuer_url = lookup(open_id_connect_config.value, "issuer_url", null)
42+
client_id = lookup(open_id_connect_config.value, "client_id", null)
43+
username_claim = lookup(open_id_connect_config.value, "username_claim", null)
44+
username_prefix = lookup(open_id_connect_config.value, "username_prefix", null)
45+
groups_claim = lookup(open_id_connect_config.value, "groups_claim", null)
46+
groups_prefix = lookup(open_id_connect_config.value, "groups_prefix", null)
47+
required_claim = lookup(open_id_connect_config.value, "required_claim", null)
4548
}
4649
}
4750

48-
apiserver_cert_sans = local.apiserver_cert_sans
49-
feature_gates = local.feature_gates
50-
admission_plugins = local.admission_plugins
51-
region = local.region
51+
region = var.region
52+
project_id = var.project_id
53+
delete_additional_resources = var.delete_additional_resources
54+
5255
}

examples/simple/versions.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
terraform {
2+
3+
experiments = [module_variable_optional_attrs]
4+
5+
required_providers {
6+
scaleway = {
7+
source = "particuleio/scaleway"
8+
version = "2.2.0-rc.0"
9+
}
10+
}
11+
required_version = ">= 0.14"
12+
}

locals.tf

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,5 @@
11
locals {
22

3-
cluster_name = var.cluster_name
4-
cluster_description = var.cluster_description
5-
kubernetes_version = var.kubernetes_version
6-
project_id = var.project_id
7-
cni_plugin = var.cni_plugin
8-
cluster_tags = var.cluster_tags
9-
tags = var.tags
10-
delete_additional_resources = var.delete_additional_resources
11-
12-
autoscaler_config_default = {
13-
enabled = false
14-
disable_scale_down = false
15-
scale_down_delay_after_add = "5m"
16-
scale_down_unneeded_time = "5m"
17-
estimator = "binpacking"
18-
expander = "random"
19-
ignore_daemonsets_utilization = true
20-
balance_similar_node_groups = true
21-
expendable_pods_priority_cutoff = -5
22-
scale_down_utilization_treshold = 0.5
23-
max_graceful_termination_sec = 600
24-
}
25-
26-
autoscaler_config = merge(
27-
local.autoscaler_config_default,
28-
var.autoscaler_config
29-
)
30-
31-
auto_upgrade_default = {
32-
enable = false
33-
maintenance_window_start_hour = 2
34-
maintenance_window_day = "sunday"
35-
}
36-
37-
auto_upgrade = merge(
38-
local.auto_upgrade_default,
39-
var.auto_upgrade
40-
)
41-
42-
open_id_connect_config_default = {
43-
enabled = false
44-
}
45-
46-
open_id_connect_config = merge(
47-
local.open_id_connect_config_default,
48-
var.open_id_connect_config
49-
)
50-
51-
apiserver_cert_sans = var.apiserver_cert_sans
52-
feature_gates = var.feature_gates
53-
admission_plugins = var.admission_plugins
54-
region = var.region
55-
563
node_pools_defaults_defaults = {
574
node_type = "GP1-XS"
585
size = 1

node-pools.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
resource "scaleway_k8s_pool" "this" {
22
for_each = local.node_pools
3-
region = local.region
3+
region = var.region
44
zone = lookup(each.value, "zone", local.node_pools_defaults["zone"])
55
cluster_id = scaleway_k8s_cluster.this.id
66
name = each.key
@@ -18,7 +18,7 @@ resource "scaleway_k8s_pool" "this" {
1818
max_unavailable = lookup(each.value["upgrade_policy"], "max_unavailable", local.node_pools_defaults["upgrade_policy"]["max_unavailable"])
1919
}
2020
wait_for_pool_ready = lookup(each.value, "wait_for_pool_ready", local.node_pools_defaults["wait_for_pool_ready"])
21-
tags = distinct(compact(concat(lookup(each.value, "tags", local.node_pools_defaults["tags"]), local.tags)))
21+
tags = distinct(compact(concat(lookup(each.value, "tags", local.node_pools_defaults["tags"]), var.tags)))
2222

2323
lifecycle {
2424
ignore_changes = [

0 commit comments

Comments
 (0)