diff --git a/google_gke/README.md b/google_gke/README.md index 06304ac9..1eb2e75c 100644 --- a/google_gke/README.md +++ b/google_gke/README.md @@ -415,6 +415,7 @@ module "gke" { | [node\_pools\_guest\_accelerator](#input\_node\_pools\_guest\_accelerator) | Map containing node pools guest accelerator. Each node pool's name is the key. See locals.tf for defaults. | `map(map(string))` |
{
"tf-default-node-pool": {}
} | no |
| [node\_pools\_labels](#input\_node\_pools\_labels) | Map containing node pools non-default labels (as a map of strings). Each key is used as node pool's name prefix. See locals.tf for defaults. | `map(map(string))` | {
"tf-default-node-pool": {}
} | no |
| [node\_pools\_oauth\_scopes](#input\_node\_pools\_oauth\_scopes) | Map containing node pools non-default OAuth scopes (as an list). Each node pool's name is the key. See locals.tf for defaults. | `map(list(string))` | {
"tf-default-node-pool": []
} | no |
+| [node\_pools\_shielded\_instance\_config](#input\_node\_pools\_shielded\_instance\_config) | Per-node-pool shielded instance config. Keyed by node pool name. Pools not present in this map fall back to GKE provider defaults (integrity monitoring on, secure boot off). Changing shielded\_instance\_config on an existing pool forces recreation, so opt in per pool. | map(object({
enable_secure_boot = optional(bool, true)
enable_integrity_monitoring = optional(bool, true)
})) | `{}` | no |
| [node\_pools\_spot\_enabled](#input\_node\_pools\_spot\_enabled) | Map containing node pools spot enabled. Each node pool's name is the key. See locals.tf for defaults. | `map(bool)` | {
"tf-default-node-pool": false
} | no |
| [node\_pools\_sysctls](#input\_node\_pools\_sysctls) | Map containing node pools non-default linux node config sysctls (as a map of maps). Each node pool's name is the key. | `map(map(any))` | {
"tf-default-node-pool": {}
} | no |
| [node\_pools\_tags](#input\_node\_pools\_tags) | Map containing node pools non-default tags (as an list). Each node pool's name is the key. See locals.tf for defaults. | `map(list(string))` | {
"tf-default-node-pool": []
} | no |
diff --git a/google_gke/cluster.tf b/google_gke/cluster.tf
index accb638b..8089c9bc 100644
--- a/google_gke/cluster.tf
+++ b/google_gke/cluster.tf
@@ -4,7 +4,6 @@
# * cluster telemetry (some kinda new monitoring / logging / metrics aggregation & dashboard for gke clusters; in beta)
# * enable_binary_authorization (all container images validated by Google Binary Authorization; needs further impact investigation)
# * enable_l4_ilb_subsetting (needs further impact investigation)
-# * shielded_instance_config.enable_secure_boot & shielded_instance_config.enable_integrity_monitoring (needs further impact investigation)
# * database_encryption to be added with CloudKMS key (postponed for adding CloudKMS keys structure to Terraform or secrets management)
#
@@ -311,6 +310,15 @@ resource "google_container_node_pool" "pools" {
spot = local.node_pools_spot_enabled[each.key]
+ dynamic "shielded_instance_config" {
+ for_each = local.node_pools_shielded_instance_config[each.key] != null ? [local.node_pools_shielded_instance_config[each.key]] : []
+
+ content {
+ enable_secure_boot = shielded_instance_config.value.enable_secure_boot
+ enable_integrity_monitoring = shielded_instance_config.value.enable_integrity_monitoring
+ }
+ }
+
machine_type = each.value.machine_type
oauth_scopes = local.node_pools_oauth_scopes[each.key]
service_account = google_service_account.cluster_service_account.email
diff --git a/google_gke/locals.tf b/google_gke/locals.tf
index a87ea67d..38bf139a 100644
--- a/google_gke/locals.tf
+++ b/google_gke/locals.tf
@@ -55,6 +55,8 @@ locals {
node_pools_taints = { for node_pool in var.node_pools : node_pool.name => lookup(var.node_pools_taints, node_pool.name, []) }
node_pools_spot_enabled = { for node_pool in var.node_pools : node_pool.name => lookup(var.node_pools_spot_enabled, node_pool.name, false) }
+ node_pools_shielded_instance_config = { for node_pool in var.node_pools : node_pool.name => lookup(var.node_pools_shielded_instance_config, node_pool.name, null) }
+
# Google Group for RBAC
cluster_authenticator_security_group = var.google_group_name == null ? [] : [{
security_group = var.google_group_name
diff --git a/google_gke/variables.tf b/google_gke/variables.tf
index 034bc7fc..8c6d50e1 100644
--- a/google_gke/variables.tf
+++ b/google_gke/variables.tf
@@ -249,6 +249,15 @@ variable "node_pools_sysctls" {
}
}
+variable "node_pools_shielded_instance_config" {
+ description = "Per-node-pool shielded instance config. Keyed by node pool name. Pools not present in this map fall back to GKE provider defaults (integrity monitoring on, secure boot off). Changing shielded_instance_config on an existing pool forces recreation, so opt in per pool."
+ type = map(object({
+ enable_secure_boot = optional(bool, true)
+ enable_integrity_monitoring = optional(bool, true)
+ }))
+ default = {}
+}
+
variable "node_pools_tags" {
description = "Map containing node pools non-default tags (as an list). Each node pool's name is the key. See locals.tf for defaults."
type = map(list(string))