Add cluster reuse for multi-stack k8s-kind deployments
When deploying a second stack to k8s-kind, automatically reuse an existing kind cluster instead of trying to create a new one (which would fail due to port 80/443 conflicts). Changes: - helpers.py: create_cluster() now checks for existing cluster first - deploy_k8s.py: up() captures returned cluster name and updates self This enables deploying multiple stacks (e.g., gorbagana-rpc + trashscan-explorer) to the same kind cluster. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>fix-down-cleanup-by-label
parent
4408725b08
commit
2d3721efa4
|
|
@ -289,11 +289,14 @@ class K8sDeployer(Deployer):
|
||||||
self.skip_cluster_management = skip_cluster_management
|
self.skip_cluster_management = skip_cluster_management
|
||||||
if not opts.o.dry_run:
|
if not opts.o.dry_run:
|
||||||
if self.is_kind() and not self.skip_cluster_management:
|
if self.is_kind() and not self.skip_cluster_management:
|
||||||
# Create the kind cluster
|
# Create the kind cluster (or reuse existing one)
|
||||||
create_cluster(
|
kind_config = str(
|
||||||
self.kind_cluster_name,
|
self.deployment_dir.joinpath(constants.kind_config_filename)
|
||||||
str(self.deployment_dir.joinpath(constants.kind_config_filename)),
|
|
||||||
)
|
)
|
||||||
|
actual_cluster = create_cluster(self.kind_cluster_name, kind_config)
|
||||||
|
if actual_cluster != self.kind_cluster_name:
|
||||||
|
# An existing cluster was found, use it instead
|
||||||
|
self.kind_cluster_name = actual_cluster
|
||||||
# Ensure the referenced containers are copied into kind
|
# Ensure the referenced containers are copied into kind
|
||||||
load_images_into_kind(
|
load_images_into_kind(
|
||||||
self.kind_cluster_name, self.cluster_info.image_set
|
self.kind_cluster_name, self.cluster_info.image_set
|
||||||
|
|
|
||||||
|
|
@ -262,14 +262,34 @@ def _clean_etcd_keeping_certs(etcd_path: str) -> bool:
|
||||||
|
|
||||||
|
|
||||||
def create_cluster(name: str, config_file: str):
|
def create_cluster(name: str, config_file: str):
|
||||||
|
"""Create a kind cluster, or reuse an existing one.
|
||||||
|
|
||||||
|
Checks if any kind cluster already exists. If so, uses that cluster
|
||||||
|
instead of creating a new one. This allows multiple deployments to
|
||||||
|
share the same kind cluster.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: The desired cluster name (used only if creating new)
|
||||||
|
config_file: Path to kind config file (used only if creating new)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The name of the cluster being used (either existing or newly created)
|
||||||
|
"""
|
||||||
|
existing = get_kind_cluster()
|
||||||
|
if existing:
|
||||||
|
print(f"Using existing cluster: {existing}")
|
||||||
|
return existing
|
||||||
|
|
||||||
# Clean persisted etcd, keeping only TLS certificates
|
# Clean persisted etcd, keeping only TLS certificates
|
||||||
etcd_path = _get_etcd_host_path_from_kind_config(config_file)
|
etcd_path = _get_etcd_host_path_from_kind_config(config_file)
|
||||||
if etcd_path:
|
if etcd_path:
|
||||||
_clean_etcd_keeping_certs(etcd_path)
|
_clean_etcd_keeping_certs(etcd_path)
|
||||||
|
|
||||||
|
print(f"Creating new cluster: {name}")
|
||||||
result = _run_command(f"kind create cluster --name {name} --config {config_file}")
|
result = _run_command(f"kind create cluster --name {name} --config {config_file}")
|
||||||
if result.returncode != 0:
|
if result.returncode != 0:
|
||||||
raise DeployerException(f"kind create cluster failed: {result}")
|
raise DeployerException(f"kind create cluster failed: {result}")
|
||||||
|
return name
|
||||||
|
|
||||||
|
|
||||||
def destroy_cluster(name: str):
|
def destroy_cluster(name: str):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue