Compare commits

...

14 Commits

Author SHA1 Message Date
suyiiyii a79eff18c6 Remove debug print statement from certInjector and update cert-manager dependency version 2025-03-21 11:01:05 +08:00
suyiiyii 4465018c15 Refactor prefix option handling in main.k for improved default value assignment 2025-03-15 10:40:16 +08:00
suyiiyii 3892da3ced Inject cert-manager annotations and TLS configuration into Ingress resources 2025-03-15 09:56:32 +08:00
suyiiyii 5dc4290337 Add cert-manager annotations to Ingress for Let's Encrypt issuer 2025-03-15 09:43:29 +08:00
suyiiyii 86f5523abb Add cert-manager issuer configuration and update dependencies 2025-03-15 09:42:35 +08:00
suyiiyii bb4c99d9b7 Add HTTPService configuration and include ingresses in manifest output 2025-03-14 21:51:08 +08:00
suyiiyii dec20a87bd Refactor env.k to use a consistent secret name for environment variables 2025-03-14 21:44:48 +08:00
suyiiyii 298e82bcb8 Fix image reference formatting in appRender for correct Docker image path 2025-03-14 21:41:11 +08:00
suyiiyii c62e160288 Fix envInjector to correctly assign input when not a Deployment 2025-03-14 21:36:02 +08:00
suyiiyii f3e247460a Fix envInjector to correctly handle non-Deployment inputs 2025-03-14 21:33:16 +08:00
suyiiyii 98e324c586 Add HTTPService rendering for Ingress configuration 2025-03-14 19:59:36 +08:00
suyiiyii 6edd214baf Update image references for nginx and caddy, and enhance environment injection for deployments 2025-03-14 18:15:11 +08:00
suyiiyii a890a979e9 Fix envSecretRender to use stringData instead of data for environment secrets 2025-03-14 17:19:56 +08:00
suyiiyii 69c336d9e9 Update application definitions to use new app names and images for nginx and caddy 2025-03-14 17:16:29 +08:00
9 changed files with 129 additions and 24 deletions
+1
View File
@@ -0,0 +1 @@
tmp/build-errors.log
+1 -1
View File
@@ -24,7 +24,7 @@ appRender = lambda a: App {
template.spec.containers = [ template.spec.containers = [
{ {
name = a.name name = a.name
image = a.image image = "cr.suyiiyii.top/docker.io/" + a.image
ports = [{containerPort = a.port}] ports = [{containerPort = a.port}]
} }
] ]
+10 -7
View File
@@ -5,29 +5,32 @@ schema Envs:
"""Env schema""" """Env schema"""
envs: {str:str} envs: {str:str}
secret_name = "app-env"
envSecretRender = lambda e: Envs { envSecretRender = lambda e: Envs {
secret = corev1.Secret { secret = corev1.Secret {
apiVersion = "v1" apiVersion = "v1"
kind = "Secret" kind = "Secret"
metadata = { metadata = {
name = "app-sevret" name = secret_name
} }
data = e.envs stringData = e.envs
} }
[secret] [secret]
} }
envInjector = lambda envs: Envs, deploy { envInjector = lambda envs: Envs, input: appsv1.Deployment | any {
"""Inject envs to Deployment""" """Inject envs to Deployment"""
_result = {} _result: any = {}
if deploy.kind != "Deployment": if input.kind != "Deployment":
_result = deploy _result = input
else: else:
deploy: appsv1.Deployment = input as appsv1.Deployment
secretEnv: [corev1.EnvVar] = [{ secretEnv: [corev1.EnvVar] = [{
name = k name = k
valueFrom = { valueFrom = {
secretKeyRef = { secretKeyRef = {
name = "app-secret" name = secret_name
key = k key = k
} }
} }
+59
View File
@@ -0,0 +1,59 @@
import k8s.api.networking.v1 as networkingv1
schema HTTPService:
"""http service"""
service: str
domain: str
httpServiceRender = lambda h: HTTPService {
"""Render http service to Ingress"""
ingress = networkingv1.Ingress {
apiVersion = "networking.k8s.io/v1"
kind = "Ingress"
metadata = {
name = h.service
}
spec = {
rules = [{
host = h.domain
http = {
paths = [{
path = "/"
pathType = "Prefix"
backend = {
service = {
name = h.service
port = {
number = 80
}
}
}
}]
}
}]
}
}
[ingress]
}
certInjector = lambda input: networkingv1.Ingress | any {
"""Inject cert to Ingress"""
_result: any = {}
if input.kind != "Ingress":
_result = input
else:
ingress: networkingv1.Ingress = input as networkingv1.Ingress
ingress.metadata.annotations = {"cert-manager.io/issuer" = "letsencrypt"}
ingress.spec.tls = [{
hosts = [r.host for r in ingress.spec.rules]
secretName = "tls-" + ingress.metadata.name
}]
_result = ingress
_result
}
httpServiceRefine = lambda h: HTTPService {
ingress = httpServiceRender(h)
ingress2 = certInjector(ingress[0])
ingress2
}
+25
View File
@@ -0,0 +1,25 @@
import cert_manager.v1
issuer = v1.Issuer {
apiVersion = "cert-manager.io/v1"
kind = "Issuer"
metadata = {
name = "letsencrypt"
}
spec = {
acme = {
email = "suyiiyii@gmail.com"
server = "https://acme-v02.api.letsencrypt.org/directory"
privateKeySecretRef = {
name = "letsencrypt"
}
solvers = [{
http01 = {
ingress = {
class = "traefik"
}
}
}]
}
}
}
+1
View File
@@ -4,4 +4,5 @@ edition = "v0.11.1"
version = "0.0.1" version = "0.0.1"
[dependencies] [dependencies]
cert-manager = "0.3.0"
k8s = "1.31.2" k8s = "1.31.2"
+8
View File
@@ -1,4 +1,12 @@
[dependencies] [dependencies]
[dependencies.cert-manager]
name = "cert-manager"
full_name = "cert-manager_0.3.0"
version = "0.3.0"
sum = "yyuUXsyOsHOGUK3e9P6GzM5A0hcSpW1XBd5O6TLhyvE="
reg = "ghcr.io"
repo = "kcl-lang/cert-manager"
oci_tag = "0.3.0"
[dependencies.k8s] [dependencies.k8s]
name = "k8s" name = "k8s"
full_name = "k8s_1.31.2" full_name = "k8s_1.31.2"
+18 -9
View File
@@ -2,18 +2,20 @@ import base
import yaml import yaml
import manifests import manifests
apps = [
base.App { base.App {
name = "myapp" name = "nginxxx"
replicas = 2 replicas = 2
image = "myimage" image = "library/nginx"
port = 8080 port = 80
} }
base.App { base.App {
name = "myapp122" name = "caddyy"
replicas = 2 replicas = 2
image = "myimage" image = "library/caddy"
port = 8080 port = 80
} }
]
envs = base.Envs { envs = base.Envs {
envs = { envs = {
@@ -22,11 +24,18 @@ envs = base.Envs {
} }
} }
deploys = sum([base.appRender(a) for a in base.App.instances()], []) http = base.HTTPService {
# print(yaml.encode(deploys)) service = "nginxxx"
domain = prefix + "nginxxx.ve.suyiiyii.top"
}
prefix = option("prefix") or "prefix"
deploys = sum([base.appRender(a) for a in apps], [])
apps_manifests = [base.envInjector(envs, deploy) for deploy in deploys] apps_manifests = [base.envInjector(envs, deploy) for deploy in deploys]
ingresses = [base.httpServiceRefine(http)]
env_manifests = [base.envSecretRender(a) for a in base.Envs.instances()] env_manifests = [base.envSecretRender(a) for a in base.Envs.instances()]
# base.appRender(a) # base.appRender(a)
manifests.yaml_stream([apps_manifests, env_manifests]) manifests.yaml_stream([apps_manifests, env_manifests, ingresses, base.issuer])
-1
View File
@@ -1 +0,0 @@
exit status 1exit status 2exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1