Skip to main content

CRD Reference

kindling defines two Custom Resource Definitions (CRDs) under the apps.example.com/v1alpha1 API group.


DevStagingEnvironment

Declares a complete application environment: a Deployment, Service, optional Ingress, and zero or more auto-provisioned backing services.

API version: apps.example.com/v1alpha1
Kind: DevStagingEnvironment
Scope: Namespaced
Short name: dse

Full spec

apiVersion: apps.example.com/v1alpha1
kind: DevStagingEnvironment
metadata:
name: my-app
spec:
deployment:
image: ""
port: 8080
replicas: 1
command: []
args: []
env:
- name: KEY
value: "value"
resources:
cpuRequest: "100m"
cpuLimit: "500m"
memoryRequest: "128Mi"
memoryLimit: "512Mi"
healthCheck:
path: "/healthz"
port: 8080
initialDelaySeconds: 5
periodSeconds: 10

service:
port: 8080
targetPort: 8080
type: "ClusterIP"

ingress:
enabled: true
host: "app.localhost"
path: "/"
pathType: "Prefix"
ingressClassName: "nginx"
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
tls:
secretName: "tls-secret"
hosts:
- "app.localhost"

dependencies:
- type: postgres
version: "16"
image: ""
port: 5432
envVarName: "DATABASE_URL"
storageSize: "1Gi"
env:
- name: POSTGRES_USER
value: "custom"
resources:
cpuRequest: "100m"
memoryLimit: "512Mi"

Spec fields

spec.deployment

FieldTypeRequiredDefaultDescription
imagestringContainer image reference
portint32Container port (1–65535)
replicas*int321Number of pod replicas
command[]stringOverride container entrypoint
args[]stringArguments passed to entrypoint
env[]EnvVarEnvironment variables
resources*ResourceRequirementsCPU/memory requests and limits
healthCheck*HealthCheckSpecLiveness and readiness probe config

spec.service

FieldTypeRequiredDefaultDescription
portint32Service port (1–65535)
targetPort*int32deployment portBackend target port
typestring"ClusterIP"ClusterIP, NodePort, or LoadBalancer

spec.ingress

FieldTypeRequiredDefaultDescription
enabledboolfalseWhether to create an Ingress
hoststringHostname for the Ingress rule
pathstring"/"URL path prefix
pathTypestring"Prefix"Prefix, Exact, ImplementationSpecific
ingressClassName*stringIngressClass name (e.g. "nginx")
annotationsmap[string]stringExtra Ingress annotations
tls*IngressTLSSpecTLS configuration

spec.dependencies[]

FieldTypeRequiredDefaultDescription
typeDependencyTypeSee supported types below
versionstringlatestImage tag
imagestringFull image override
port*int32type defaultOverride service port
envVarNamestringtype defaultOverride injected env var name
storageSize*Quantity"1Gi"PVC size for stateful deps
env[]EnvVarOverride dependency container env vars
resources*ResourceRequirementsCPU/memory for dependency container

Supported dependency types:

postgres · redis · mysql · mongodb · rabbitmq · minio · elasticsearch · kafka · nats · memcached · cassandra · consul · vault · influxdb · jaeger

Status fields

FieldTypeDescription
availableReplicasint32Number of ready pods
deploymentReadyboolDeployment has reached desired state
serviceReadyboolService has been created
ingressReadyboolIngress has been created (if enabled)
dependenciesReadyboolAll declared dependencies are running
urlstringExternally reachable URL
conditions[]ConditionStandard Kubernetes conditions

Examples

Minimal:

apiVersion: apps.example.com/v1alpha1
kind: DevStagingEnvironment
metadata:
name: simple-app
spec:
deployment:
image: nginx:1.25
port: 80
service:
port: 80

Full-featured:

apiVersion: apps.example.com/v1alpha1
kind: DevStagingEnvironment
metadata:
name: platform-api
spec:
deployment:
image: registry:5000/platform:v2
replicas: 2
port: 8080
env:
- name: LOG_LEVEL
value: debug
resources:
cpuRequest: "250m"
cpuLimit: "1"
memoryRequest: "256Mi"
memoryLimit: "1Gi"
healthCheck:
path: /healthz
service:
port: 8080
ingress:
enabled: true
host: platform.localhost
ingressClassName: nginx
dependencies:
- type: postgres
version: "16"
- type: redis
- type: elasticsearch
- type: kafka
- type: vault

GithubActionRunnerPool

Declares a pool of self-hosted GitHub Actions runners that register with a specific repository.

API version: apps.example.com/v1alpha1
Kind: GithubActionRunnerPool
Scope: Namespaced

Full spec

apiVersion: apps.example.com/v1alpha1
kind: GithubActionRunnerPool
metadata:
name: myuser-runner-pool
spec:
githubUsername: "myuser"
repository: "myorg/myrepo"
tokenSecretRef:
name: github-runner-token
key: github-token
githubURL: "https://github.com"
replicas: 1
runnerImage: "ghcr.io/actions/actions-runner:latest"
labels:
- linux

Spec fields

FieldTypeRequiredDefaultDescription
githubUsernamestringGitHub handle (added as runner label)
repositorystringFull repo slug (owner/repo)
tokenSecretRefSecretKeyRefReference to PAT Secret
githubURLstringhttps://github.comBase URL (for GHE)
replicas*int321Number of runner pods
runnerImagestringghcr.io/actions/actions-runner:latestRunner container image
labels[]stringExtra runner labels

Runner pod structure

Each runner pod created by the operator contains:

ContainerImagePurpose
runnerRunner imageRegisters with GitHub, executes workflow jobs
build-agentKaniko executorBuilds container images from signal files

Shared volume: emptyDir at /builds/ for signal-file communication.

Runner labels automatically include:

  • self-hosted
  • <githubUsername> (from spec)
  • Any extra labels from spec.labels

Workflows target a specific developer's runner with:

runs-on: [self-hosted, "<username>"]