Compare commits

..

12 Commits

9 changed files with 116 additions and 12 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}]
} }
] ]
+9 -6
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
} }
stringData = 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"
+12 -4
View File
@@ -6,13 +6,13 @@ apps = [
base.App { base.App {
name = "nginxxx" name = "nginxxx"
replicas = 2 replicas = 2
image = "nginx" image = "library/nginx"
port = 80 port = 80
} }
base.App { base.App {
name = "caddyy" name = "caddyy"
replicas = 2 replicas = 2
image = "caddy" image = "library/caddy"
port = 80 port = 80
} }
] ]
@@ -24,10 +24,18 @@ envs = base.Envs {
} }
} }
http = base.HTTPService {
service = "nginxxx"
domain = prefix + "nginxxx.ve.suyiiyii.top"
}
prefix = option("prefix") or "prefix"
deploys = sum([base.appRender(a) for a in apps], []) deploys = sum([base.appRender(a) for a in apps], [])
# print(yaml.encode(deploys))
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