From 86c11ff24199a5218ca0541ad67450fd671c04f4 Mon Sep 17 00:00:00 2001 From: Prathamesh Musale Date: Mon, 9 Mar 2026 09:22:28 +0000 Subject: [PATCH] k8s: add app.kubernetes.io/stack label to pods and jobs Co-Authored-By: Claude Opus 4.6 --- stack_orchestrator/deploy/k8s/cluster_info.py | 12 +++++++++--- stack_orchestrator/deploy/k8s/deploy_k8s.py | 2 ++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/stack_orchestrator/deploy/k8s/cluster_info.py b/stack_orchestrator/deploy/k8s/cluster_info.py index 8f1c4500..1e6f04e5 100644 --- a/stack_orchestrator/deploy/k8s/cluster_info.py +++ b/stack_orchestrator/deploy/k8s/cluster_info.py @@ -75,13 +75,14 @@ class ClusterInfo: parsed_job_yaml_map: Any image_set: Set[str] = set() app_name: str + stack_name: str environment_variables: DeployEnvVars spec: Spec def __init__(self) -> None: self.parsed_job_yaml_map = {} - def int(self, pod_files: List[str], compose_env_file, deployment_name, spec: Spec): + def int(self, pod_files: List[str], compose_env_file, deployment_name, spec: Spec, stack_name=""): self.parsed_pod_yaml_map = parsed_pod_files_map_from_file_names(pod_files) # Find the set of images in the pods self.image_set = images_for_deployment(pod_files) @@ -91,6 +92,7 @@ class ClusterInfo: } self.environment_variables = DeployEnvVars(env_vars) self.app_name = deployment_name + self.stack_name = stack_name self.spec = spec if opts.o.debug: print(f"Env vars: {self.environment_variables.map}") @@ -556,6 +558,8 @@ class ClusterInfo: annotations = None labels = {"app": self.app_name} + if self.stack_name: + labels["app.kubernetes.io/stack"] = self.stack_name affinity = None tolerations = None @@ -670,9 +674,10 @@ class ClusterInfo: elif job_name.endswith(".yaml"): job_name = job_name[: -len(".yaml")] + pod_labels = {"app": self.app_name, **({"app.kubernetes.io/stack": self.stack_name} if self.stack_name else {})} template = client.V1PodTemplateSpec( metadata=client.V1ObjectMeta( - labels={"app": self.app_name} + labels=pod_labels ), spec=client.V1PodSpec( containers=containers, @@ -685,12 +690,13 @@ class ClusterInfo: template=template, backoff_limit=0, ) + job_labels = {"app": self.app_name, **({"app.kubernetes.io/stack": self.stack_name} if self.stack_name else {})} job = client.V1Job( api_version="batch/v1", kind="Job", metadata=client.V1ObjectMeta( name=f"{self.app_name}-job-{job_name}", - labels={"app": self.app_name}, + labels=job_labels, ), spec=job_spec, ) diff --git a/stack_orchestrator/deploy/k8s/deploy_k8s.py b/stack_orchestrator/deploy/k8s/deploy_k8s.py index 55513d6e..1efdf177 100644 --- a/stack_orchestrator/deploy/k8s/deploy_k8s.py +++ b/stack_orchestrator/deploy/k8s/deploy_k8s.py @@ -126,11 +126,13 @@ class K8sDeployer(Deployer): # Use deployment-specific namespace for resource isolation and easy cleanup self.k8s_namespace = f"laconic-{compose_project_name}" self.cluster_info = ClusterInfo() + stack_name = deployment_context.stack.name if deployment_context else "" self.cluster_info.int( compose_files, compose_env_file, compose_project_name, deployment_context.spec, + stack_name=stack_name, ) # Initialize job compose files if provided if job_compose_files: