From 7481ae8d8b34f417983e8bf852b3e7641e528c6e Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Thu, 8 Aug 2024 20:10:21 +0000 Subject: [PATCH] Multiple NodePorts and add replicas spec option --- stack_orchestrator/constants.py | 1 + stack_orchestrator/deploy/k8s/cluster_info.py | 49 ++++++++++++------- stack_orchestrator/deploy/k8s/deploy_k8s.py | 10 ++-- stack_orchestrator/deploy/spec.py | 3 ++ 4 files changed, 40 insertions(+), 23 deletions(-) diff --git a/stack_orchestrator/constants.py b/stack_orchestrator/constants.py index bb809404..aee36ad8 100644 --- a/stack_orchestrator/constants.py +++ b/stack_orchestrator/constants.py @@ -34,5 +34,6 @@ volumes_key = "volumes" security_key = "security" annotations_key = "annotations" labels_key = "labels" +replicas_key = "replicas" kind_config_filename = "kind-config.yml" kube_config_filename = "kubeconfig.yml" diff --git a/stack_orchestrator/deploy/k8s/cluster_info.py b/stack_orchestrator/deploy/k8s/cluster_info.py index 7c696691..1e17d5cc 100644 --- a/stack_orchestrator/deploy/k8s/cluster_info.py +++ b/stack_orchestrator/deploy/k8s/cluster_info.py @@ -78,28 +78,38 @@ class ClusterInfo: if (opts.o.debug): print(f"Env vars: {self.environment_variables.map}") - def get_nodeport(self): + def get_nodeports(self): + nodeports = [] for pod_name in self.parsed_pod_yaml_map: pod = self.parsed_pod_yaml_map[pod_name] services = pod["services"] for service_name in services: service_info = services[service_name] if "ports" in service_info: - port = int(service_info["ports"][0]) - if opts.o.debug: - print(f"service port: {port}") - service = client.V1Service( - metadata=client.V1ObjectMeta(name=f"{self.app_name}-nodeport"), - spec=client.V1ServiceSpec( - type="NodePort", - ports=[client.V1ServicePort( - port=port, - target_port=port - )], - selector={"app": self.app_name} - ) - ) - return service + for raw_port in service_info["ports"]: + if opts.o.debug: + print(f"service port: {raw_port}") + if ":" in raw_port: + parts = raw_port.split(":", 2) + node_port = int(parts[0]) + pod_port = int(parts[1]) + else: + node_port = None + pod_port = int(raw_port) + service = client.V1Service( + metadata=client.V1ObjectMeta(name=f"{self.app_name}-nodeport-{pod_port}"), + spec=client.V1ServiceSpec( + type="NodePort", + ports=[client.V1ServicePort( + port=pod_port, + target_port=pod_port, + node_port=node_port + )], + selector={"app": self.app_name} + ) + ) + nodeports.append(service) + return nodeports def get_ingress(self, use_tls=False, certificate=None, cluster_issuer="letsencrypt-prod"): # No ingress for a deployment that has no http-proxy defined, for now @@ -373,9 +383,12 @@ class ClusterInfo: spec=client.V1PodSpec(containers=containers, image_pull_secrets=image_pull_secrets, volumes=volumes), ) spec = client.V1DeploymentSpec( - replicas=1, template=template, selector={ + replicas=self.spec.get_replicas(), + template=template, selector={ "matchLabels": - {"app": self.app_name}}) + {"app": self.app_name} + } + ) deployment = client.V1Deployment( api_version="apps/v1", diff --git a/stack_orchestrator/deploy/k8s/deploy_k8s.py b/stack_orchestrator/deploy/k8s/deploy_k8s.py index 5781cd26..7e6ec152 100644 --- a/stack_orchestrator/deploy/k8s/deploy_k8s.py +++ b/stack_orchestrator/deploy/k8s/deploy_k8s.py @@ -246,8 +246,8 @@ class K8sDeployer(Deployer): if opts.o.debug: print("No ingress configured") - nodeport: client.V1Service = self.cluster_info.get_nodeport() - if nodeport: + nodeports: List[client.V1Service] = self.cluster_info.get_nodeports() + for nodeport in nodeports: if opts.o.debug: print(f"Sending this nodeport: {nodeport}") if not opts.o.dry_run: @@ -342,10 +342,10 @@ class K8sDeployer(Deployer): if opts.o.debug: print("No ingress to delete") - nodeport: client.V1Service = self.cluster_info.get_nodeport() - if nodeport: + nodeports: List[client.V1Service] = self.cluster_info.get_nodeports() + for nodeport in nodeports: if opts.o.debug: - print(f"Deleting this nodeport: {ingress}") + print(f"Deleting this nodeport: {nodeport}") try: self.core_api.delete_namespaced_service( namespace=self.k8s_namespace, diff --git a/stack_orchestrator/deploy/spec.py b/stack_orchestrator/deploy/spec.py index cbec8ae5..e8d293e3 100644 --- a/stack_orchestrator/deploy/spec.py +++ b/stack_orchestrator/deploy/spec.py @@ -117,6 +117,9 @@ class Spec: def get_annotations(self): return self.obj.get(constants.annotations_key, {}) + def get_replicas(self): + return self.obj.get(constants.replicas_key, 1) + def get_labels(self): return self.obj.get(constants.labels_key, {})