feat(k8s): support acme-email config for Caddy ingress

Adds support for configuring ACME email for Let's Encrypt certificates
in kind deployments. The email can be specified in the spec under
network.acme-email and will be used to configure the Caddy ingress
controller ConfigMap.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
A. F. Dudley 2026-01-25 17:35:53 -05:00
parent ee59918082
commit 5bc6c978ac
3 changed files with 19 additions and 1 deletions

View File

@ -316,7 +316,7 @@ class K8sDeployer(Deployer):
self.connect_api() self.connect_api()
if self.is_kind() and not self.skip_cluster_management: if self.is_kind() and not self.skip_cluster_management:
# Configure ingress controller (not installed by default in kind) # Configure ingress controller (not installed by default in kind)
# Skip if already running # Skip if already running (idempotent for shared cluster)
if not is_ingress_running(): if not is_ingress_running():
install_ingress_for_kind(self.cluster_info.spec.get_acme_email()) install_ingress_for_kind(self.cluster_info.spec.get_acme_email())
# Wait for ingress to start # Wait for ingress to start

View File

@ -368,6 +368,21 @@ def install_ingress_for_kind(acme_email: str = ""):
yaml_objects = list(yaml.safe_load_all(yaml_content)) yaml_objects = list(yaml.safe_load_all(yaml_content))
utils.create_from_yaml(api_client, yaml_objects=yaml_objects) utils.create_from_yaml(api_client, yaml_objects=yaml_objects)
# Patch ConfigMap with ACME email if provided
if acme_email:
if opts.o.debug:
print(f"Configuring ACME email: {acme_email}")
core_api = client.CoreV1Api()
configmap = core_api.read_namespaced_config_map(
name="caddy-ingress-controller-configmap", namespace="caddy-system"
)
configmap.data["email"] = acme_email
core_api.patch_namespaced_config_map(
name="caddy-ingress-controller-configmap",
namespace="caddy-system",
body=configmap,
)
def load_images_into_kind(kind_cluster_name: str, image_set: Set[str]): def load_images_into_kind(kind_cluster_name: str, image_set: Set[str]):
for image in image_set: for image in image_set:

View File

@ -128,6 +128,9 @@ class Spec:
def get_http_proxy(self): def get_http_proxy(self):
return self.obj.get(constants.network_key, {}).get(constants.http_proxy_key, []) return self.obj.get(constants.network_key, {}).get(constants.http_proxy_key, [])
def get_acme_email(self):
return self.obj.get(constants.network_key, {}).get("acme-email", "")
def get_annotations(self): def get_annotations(self):
return self.obj.get(constants.annotations_key, {}) return self.obj.get(constants.annotations_key, {})