Skip to content

feat: central/shared kubernetes platform landing zone and optional namespace creation in app landing zone#39

Open
lweberru wants to merge 3 commits into
mainfrom
feat/lz-namespace-service-observability-demo
Open

feat: central/shared kubernetes platform landing zone and optional namespace creation in app landing zone#39
lweberru wants to merge 3 commits into
mainfrom
feat/lz-namespace-service-observability-demo

Conversation

@lweberru

@lweberru lweberru commented Jun 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

This PR adds a complete Landing Zone namespace service demo flow with real observability integration and Grafana dashboard provisioning.

Included

  • Adds platform-kubernetes module wiring and outputs
  • Adds namespace service demo resources and dashboard definition/import workflow
  • Adds observability outputs and credentials wiring for Grafana/metrics push
  • Adds required provider updates (null) and root/module variable/output wiring

Validation

  • tofu validate (success, with deprecation warnings from provider attributes)

Issue References

Closes #35
Closes #36

Out of Scope

@lweberru lweberru changed the title feat: landing-zone namespace service demo with observability feat: central/shared kubernetes platform landing zone and optional namespace creation in app landing zone Jun 12, 2026
effective_dns_zones = var.dns.create_zones ? sort([
for zone in values(stackit_dns_zone.ske_extension) : zone.dns_name
]) : local.dns_extension_zones
default_node_pools = [

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the default_node_pools should go into the var.cluster variable as default
also allow_system_components is not set, I would split it up in "system" and "application" node pool

volume_type = optional(string, "storage_premium_perf1")
os_name = optional(string, "flatcar")
labels = optional(map(string), {})
})), [])

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

, []) -> here the default node pools instead of the default_node_pools local can be defined

Comment thread src/variables.tf
volume_type = optional(string, "storage_premium_perf1")
os_name = optional(string, "flatcar")
labels = optional(map(string), {})
})), [])

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

here the default node pools also can be defined

Comment thread src/namespace-service.tf
cleanup_on_fail = true
}

resource "helm_release" "demo_ingress_nginx" {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ingress nginx is deprecated due to security reasons --> gateway controller

Comment thread src/namespace-service.tf
@@ -0,0 +1,1371 @@
#############################

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would not include the setup of the kubernetes demo in the landing zone Terraform since not every customer wants to use Kubernetes and for production setups this demo needs to be removed afterwards manually

Comment thread src/outputs.tf
}
}
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

everything after here doesnt make sense

Comment thread src/providers.tf

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this doesnt make sense to me

Comment thread src/providers.tf
locals {
platform_kubernetes_cluster_key = try(one([
for key, value in module.platform_kubernetes : key
if value.ske_cluster_region == var.region

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why checking the region here?

Comment thread src/variables.tf
acl = optional(list(string), [])
name = optional(string, null)
}), {})
namespace_service = optional(object({

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should not be in here

Comment thread src/variables.tf
error_message = "If namespace_service.dns_subdomain is set, it must be a valid DNS label (<=63 chars, lowercase alphanumeric and '-', must start/end with alphanumeric)."
}

validation {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this validation is not neccessary since the namespace_service.enabled boolean is not needed. If namespace_service is not null, it is true anyway. I think it doesnt make sense to define namespace_service and leave namespace_service.enabled on false

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants