Skip to content

CRD Reference

All CRDs use apiVersion: lattice.dev/v1alpha1.


Kind: LatticeService Introduced: Chapter 1 (Section 1.4), detailed in Chapter 2 (Section 2.2), designed in Chapter 4 (Section 4.8) Audience: Application developers Purpose: Declares a long-running service. The platform derives Deployment, Service, CiliumNetworkPolicy, AuthorizationPolicy, ExternalSecret, PDB, VMServiceScrape, and KEDA ScaledObject from this single spec.

apiVersion: lattice.dev/v1alpha1
kind: LatticeService
metadata:
name: checkout
namespace: commerce
spec:
replicas: 3
autoscaling: # optional; Chapter 10
minReplicas: 2
maxReplicas: 10
metrics:
- type: cpu
target: 70
workload:
containers:
api:
image: registry.example.com/checkout@sha256:a3f2b7c91e4d0856f3a29b8c74d5e1609fa2c83b47e6d1095a8f23bc4de76801
command: ["/app/server"] # optional
args: ["--port=8080"] # optional
variables:
LOG_LEVEL: info
DATABASE_URL: "postgres://app:${resources.orders-db.password}@db:5432/orders"
files: # optional; Chapter 9
/etc/app/config.yaml:
content: |
database:
host: db.internal
password: "${resources.orders-db.password}"
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 500m
memory: 512Mi
livenessProbe: # optional; platform defaults to HTTP GET /healthz
httpGet:
path: /healthz
port: 8080
readinessProbe: # optional; platform defaults to HTTP GET /readyz
httpGet:
path: /readyz
port: 8080
service: # optional
ports:
http:
port: 8080
protocol: TCP
resources:
payments:
type: service
direction: outbound
orders-db:
type: secret
params:
keys: [password]
stripe:
type: secret
params:
keys: [api-key]
s3-endpoint: # external-service example; Chapter 13
type: external-service
direction: outbound
params:
endpoints:
s3: https://s3.us-east-1.amazonaws.com
shared-data: # volume example; Chapter 4 prose
type: volume
params:
size: 10Gi
accessMode: ReadWriteOnce
observability: # optional; Chapter 19 prose
scrapeInterval: 30s
ingress: {} # optional; Chapter 4 prose (Section 4.9)
deploy: {} # optional; deployment strategy; Chapter 4 prose (Section 4.9)
status:
phase: Ready # Pending | Compiling | Ready | Failed | Deleting
observedGeneration: 3
conditions:
- type: ImageVerified
status: "True"
reason: CosignVerified
message: "Image signed by key production-signing-key"
- type: PolicyAuthorized
status: "True"
- type: SecretsResolved
status: "True"
- type: Compiled
status: "True"
message: "8 resources compiled"
compiledResources:
count: 8
types:
Deployment: 1
Service: 1
CiliumNetworkPolicy: 2
AuthorizationPolicy: 2
ExternalSecret: 1
VMServiceScrape: 1
FieldTypeRequiredDescriptionDefault
replicasintegerYesNumber of pod replicas. Min 1, max 100.None (required)
autoscalingobjectNoAutoscaling configuration. When present, the pipeline derives a KEDA ScaledObject. Mutual interaction with replicas (used as initial count).None
autoscaling.minReplicasintegerYes (within block)Minimum replica count for autoscaler.None
autoscaling.maxReplicasintegerYes (within block)Maximum replica count for autoscaler. Must be >= replicas.None
autoscaling.metricslistYes (within block)Scaling triggers. Each entry has type (cpu, memory, or custom metric name) and target (numeric threshold).None
workloadobjectYesContainer definitions, service ports, and resource dependencies.None
observabilityobjectNoOverride default observability settings (e.g., scrape interval). Described in Chapter 19 prose.Platform defaults (30s scrape interval)
ingressobjectNoIngress configuration. Mentioned in Chapter 4 (Section 4.9) as a LatticeService-specific field.None
deployobjectNoDeployment strategy configuration. Mentioned in Chapter 4 (Section 4.9) as a LatticeService-specific field.None
FieldTypeRequiredDescriptionDefault
imagestringYesContainer image reference. Must be a digest (@sha256:...), not a tag. Validated by admission webhook.None (required)
commandlist of stringsNoOverride the image’s default entrypoint. Fewer than 5% of services use this.Image default
argslist of stringsNoArguments to the entrypoint.Image default
variablesmap (string -> string)NoEnvironment variables. Supports ${resources.<name>.<key>} interpolation for secret references.None
filesmap (path -> object)NoFile mounts. Each key is a mount path; value has content (string with ${resources.*} interpolation). Secrets consumed via files do not cause pod restarts on rotation.None
resources.requests.cpustringYesCPU request in Kubernetes quantity format.None (required)
resources.requests.memorystringYesMemory request in Kubernetes quantity format.None (required)
resources.limits.cpustringYesCPU limit. Convention: set equal to requests for Guaranteed QoS.None (required)
resources.limits.memorystringYesMemory limit. Convention: set equal to requests for Guaranteed QoS.None (required)
livenessProbeobjectNoKubernetes-format liveness probe.HTTP GET /healthz on primary port
readinessProbeobjectNoKubernetes-format readiness probe.HTTP GET /readyz on primary port
FieldTypeRequiredDescriptionDefault
portsmap (name -> object)NoNamed service ports. Each entry has port (integer) and protocol (enum: HTTP, GRPC, TCP). Port name carries semantic meaning for mesh routing.Inferred from container or defaults to 8080
FieldTypeRequiredDescriptionDefault
typeenumYesResource type: service, secret, volume, external-service, gpu.None (required)
directionenumConditionalRequired for service and external-service types: inbound, outbound, or both.None
paramsobjectConditionalType-specific parameters. See below.None
params.keyslist of stringsFor secretWhich secret keys to sync. Omit for bulk extraction (all keys).None
params.endpointsmap (name -> URL)For external-serviceNamed external endpoints. Cedar AccessExternalEndpoint authorizes each.None
params.sizestringFor volumeVolume size in Kubernetes quantity format.None
params.accessModestringFor volumeVolume access mode (e.g., ReadWriteOnce).None
params.secretTypestringFor secretOverride Kubernetes Secret type (e.g., kubernetes.io/dockerconfigjson for image pull secrets).Opaque
params.countintegerFor gpuNumber of GPUs requested.None
params.memorystringFor gpuMinimum GPU memory; used as node selector hint (e.g., A100-80GB vs A100-40GB).None

Kind: LatticeCluster Introduced: Chapter 5 (Section 5.2) Audience: Platform operators Purpose: Declares a Kubernetes cluster. The platform derives CAPI resources (Cluster, MachineDeployment, KubeadmControlPlane, etc.) and bootstraps all platform prerequisites (CNI, mesh, cert-manager, ESO, platform operator).

apiVersion: lattice.dev/v1alpha1
kind: LatticeCluster
metadata:
name: backend
labels:
lattice.dev/environment: homelab
lattice.dev/role: backend
spec:
latticeImage: "ghcr.io/evan-hines-js/lattice:latest"
providerRef: proxmox
provider:
kubernetes:
version: "1.32.0"
bootstrap: kubeadm
config:
proxmox:
sourceNode: "poweredge-lg"
templateId: 9000
controlPlaneEndpoint: "10.0.1.110"
bridge: "vmbr1"
ipv4Pool:
range: "10.0.1.111-120/24"
gateway: "10.0.1.1"
nodes:
controlPlane:
replicas: 1
instanceType:
cores: 4
memoryGib: 16
diskGib: 50
workerPools:
default:
replicas: 3
instanceType:
cores: 12
memoryGib: 64
diskGib: 250
services: true
monitoring:
enabled: false
backups:
enabled: false
parentConfig: # optional; for clusters that accept child connections
grpcPort: 50051
bootstrapPort: 8443
service:
type: LoadBalancer

Pending -> Provisioning -> Bootstrapping -> Ready

Also: Scaling, Upgrading, Deleting

Conditions during bootstrapping report each component: CNI, CertManager, Mesh, SecretSync, Metrics, PlatformOperator.

FieldTypeRequiredDescriptionDefault
latticeImagestringYesContainer image for the Lattice platform operator.None (required)
providerRefstringYesName of an InfraProvider CRD holding provider credentials.None (required)
provider.kubernetes.versionstringYesKubernetes version (e.g., "1.32.0").None (required)
provider.kubernetes.bootstrapstringYesBootstrap method (e.g., kubeadm).None (required)
provider.configobjectYesProvider-specific infrastructure configuration. Key is provider name (proxmox, docker, aws). Contents vary by provider.None (required)
servicesbooleanNoEnable the platform operator for workload CRDs on this cluster.false
monitoring.enabledbooleanNoInstall monitoring stack (VMAgent/Prometheus agent).false
backups.enabledbooleanNoEnable backup infrastructure.false
FieldTypeRequiredDescriptionDefault
controlPlane.replicasintegerYesNumber of control plane nodes. Typically 1 (dev) or 3 (production).None (required)
controlPlane.instanceType.coresintegerYesCPU cores per control plane node.None (required)
controlPlane.instanceType.memoryGibintegerYesMemory in GiB per control plane node.None (required)
controlPlane.instanceType.diskGibintegerYesDisk in GiB per control plane node.None (required)
workerPools.<name>.replicasintegerYesNumber of worker nodes in this pool.None (required)
workerPools.<name>.instanceType.coresintegerYesCPU cores per worker node.None (required)
workerPools.<name>.instanceType.memoryGibintegerYesMemory in GiB per worker node.None (required)
workerPools.<name>.instanceType.diskGibintegerYesDisk in GiB per worker node.None (required)
FieldTypeRequiredDescriptionDefault
grpcPortintegerYes (within block)Port for the gRPC cell endpoint that child clusters connect to.None
bootstrapPortintegerYes (within block)Port for the bootstrap webhook.None
service.typestringYes (within block)Kubernetes Service type for exposing the endpoint (e.g., LoadBalancer).None

The example above uses Proxmox, but provider.config accepts any supported provider key (proxmox, docker, aws). Docker and AWS provider configurations follow the same structural pattern — a provider-keyed object under provider.config — but the fields within each are provider-specific and vary. See the respective provider guides for field-level details.

FieldTypeRequiredDescriptionDefault
sourceNodestringYesProxmox node to clone VMs from.None
templateIdintegerYesVM template ID for cloning.None
controlPlaneEndpointstringYesStatic IP for the Kubernetes API server.None
bridgestringYesProxmox network bridge name.None
ipv4Pool.rangestringYesIP range with CIDR for worker nodes.None
ipv4Pool.gatewaystringYesDefault gateway IP.None

Kind: LatticeJob Introduced: Chapter 16 (Section 16.3), GPU examples in Chapter 17 (Section 17.4) Audience: Application developers, ML engineers Purpose: Declares a batch workload with gang scheduling support. The platform derives Volcano VCJob, PodGroup, ExternalSecrets, LatticeMeshMember for network policies, and TracingPolicyNamespaced for Tetragon enforcement.

apiVersion: lattice.dev/v1alpha1
kind: LatticeJob
metadata:
name: training-run-42
namespace: ml
spec:
queue: ml-training
minAvailable: 8
schedule: "0 2 * * *" # optional; cron schedule (Chapter 16, Section 16.5)
concurrencyPolicy: Forbid # optional; for cron jobs
successfulJobsHistoryLimit: 3 # optional; for cron jobs
failedJobsHistoryLimit: 1 # optional; for cron jobs
tasks:
workers:
replicas: 8
workload:
containers:
trainer:
image: registry.example.com/trainer@sha256:def456
variables:
S3_BUCKET: "${resources.training-data.bucket}"
WANDB_KEY: "${resources.wandb.api-key}"
resources:
requests:
cpu: "4"
memory: 32Gi
nvidia.com/gpu: "1"
limits:
cpu: "4"
memory: 32Gi
nvidia.com/gpu: "1"
security: # optional; requires OverrideSecurity Cedar gate
runAsUser: 65534
apparmorProfile: Unconfined
resources:
training-data:
type: secret
params:
keys: [bucket, access-key, secret-key]
wandb:
type: secret
params:
keys: [api-key]
s3-endpoint:
type: external-service
direction: outbound
params:
endpoints:
s3: https://s3.us-east-1.amazonaws.com
restartPolicy: OnFailure
defaults:
entryRuntime:
imagePullSecrets:
- default
FieldTypeRequiredDescriptionDefault
queuestringYesVolcano queue name for fair-share scheduling. Pipeline validates namespace is authorized for the queue.None (required)
minAvailableintegerYesMinimum number of pods that must be placed simultaneously (gang scheduling constraint). Maps to Volcano minMember.None (required)
schedulestringNoCron expression for scheduled execution. When present, the pipeline derives a CronJob wrapping the VCJob.None (one-shot)
concurrencyPolicyenumNoFor cron jobs: Allow, Forbid, Replace. Prevents overlapping runs.Allow
successfulJobsHistoryLimitintegerNoFor cron jobs: how many completed job records to retain.Kubernetes default
failedJobsHistoryLimitintegerNoFor cron jobs: how many failed job records to retain.Kubernetes default
tasksmap (name -> object)YesNamed task groups. Each group has its own replica count, workload spec, and restart policy.None (required)
defaultsobjectNoShared defaults applied across all tasks.None
defaults.entryRuntime.imagePullSecretslist of stringsNoImage pull secret names injected into all task pods.None
resourcesmapNoResource dependencies shared across all tasks. Same format as LatticeService workload.resources. Can also be specified per-task inside tasks.<name>.workload.resources.None
FieldTypeRequiredDescriptionDefault
replicasintegerYesNumber of pods in this task group.None (required)
workloadobjectYesContainer definitions and resource dependencies. Shares the same WorkloadSpec as LatticeService.None (required)
restartPolicyenumNoPod restart policy: OnFailure or Never.OnFailure

Container security fields (requires OverrideSecurity Cedar gate)

Section titled “Container security fields (requires OverrideSecurity Cedar gate)”
FieldTypeRequiredDescriptionDefault
runAsUserintegerNoUID to run the container as.Platform-managed
apparmorProfilestringNoAppArmor profile name or Unconfined.Platform-managed

Kind: LatticeModel Introduced: Chapter 18 (Section 18.2) Audience: ML engineers Purpose: Declares an inference endpoint with model lifecycle management. The platform derives multiple Deployments (one per role), model download init containers, role-specific KEDA ScaledObjects with GPU metrics, and inference routing configuration.

apiVersion: lattice.dev/v1alpha1
kind: LatticeModel
metadata:
name: qwen-8b
namespace: serving
spec:
modelSource:
uri: "hf://Qwen/Qwen3-8B"
cacheSize: "50Gi"
defaults:
entryWorkload:
containers:
main:
image: registry.example.com/vllm@sha256:abc123
variables:
MODEL_NAME: "Qwen/Qwen3-8B"
resources:
requests:
cpu: "4"
memory: 16Gi
nvidia.com/gpu: "1"
roles:
prefill:
replicas: 2
decode:
replicas: 4
autoscaling:
max: 16
metrics:
- metric: gpu_kv_cache_usage
target: 0.8
behavior:
scaleDown:
stabilizationWindow: "10m"
routing:
inferenceEngine: vLLM
model: "Qwen/Qwen3-8B"
FieldTypeRequiredDescriptionDefault
modelSource.uristringYesModel artifact location. Supports hf:// (HuggingFace), s3://, gs:// (GCS). Pipeline generates an init container to download.None (required)
modelSource.cacheSizestringYesSize of the cache volume for model weights.None (required)
defaultsobjectNoShared container and workload defaults applied to all roles.None
defaults.entryWorkloadobjectNoDefault workload spec (containers, resources) inherited by each role unless overridden.None
rolesmap (name -> object)YesNamed inference roles (e.g., prefill, decode). Each role gets its own Deployment.None (required)
routingobjectYesInference-specific request routing configuration.None (required)
routing.inferenceEnginestringYesInference engine (vLLM, SGLang). Determines API protocol.None (required)
routing.modelstringYesModel identifier for the routing layer.None (required)
FieldTypeRequiredDescriptionDefault
replicasintegerYesBase replica count for this role.None (required)
autoscalingobjectNoRole-specific autoscaling.None
autoscaling.maxintegerYes (within block)Maximum replicas.None
autoscaling.metricslistYes (within block)Scaling triggers. metric is a custom metric name (e.g., gpu_kv_cache_usage); target is a numeric threshold.None
autoscaling.behavior.scaleDown.stabilizationWindowduration stringNoHow long demand must stay low before scaling down. Inference endpoints use 10-15 minutes due to expensive cold starts."10m"

Kind: LatticePackage Introduced: Chapter 11 (Section 11.3) Audience: Platform operators, team leads Status: Not yet implemented in the reference implementation. See the Implementation Roadmap. Purpose: Orchestrates Helm chart installation with platform secret resolution and Cedar authorization. The primary escape hatch for third-party software (Redis, Prometheus, NGINX) that does not fit the derivation pipeline.

apiVersion: lattice.dev/v1alpha1
kind: LatticePackage
metadata:
name: redis
namespace: data
spec:
chart:
repo: oci://registry.example.com/charts
name: redis
version: 18.4.0
values:
replicas: 3
auth:
enabled: true
password: "${resources.redis.auth-token}"
resources:
redis:
type: secret
params:
keys: [auth-token]
FieldTypeRequiredDescriptionDefault
chart.repostringYesChart repository URL. Must use HTTPS or OCI protocol. Validated by admission webhook against repository allowlist.None (required)
chart.namestringYesHelm chart name.None (required)
chart.versionstringYesExact chart version. Ranges and latest are rejected.None (required)
valuesobjectNoHelm values to pass to the chart. Supports ${resources.<name>.<key>} interpolation for secrets.None
resourcesmapNoResource dependencies. Same format as LatticeService workload.resources. Secrets are resolved through the platform’s routing paths and authorized by Cedar AccessSecret.None
  • Chart repository must use HTTPS or OCI protocol.
  • Target namespace must not be a system namespace (kube-system, istio-system, lattice-system).
  • Chart version must be pinned (exact version, not a range).
  • Repository must be on the approved allowlist.
  • Compile-time authorization for the chart’s internal resources.
  • Automatic observability wiring (depends on chart including ServiceMonitor).
  • Image verification for images the chart pulls.
  • Bilateral network agreements (requires a separate LatticeMeshMember).

Kind: LatticeMeshMember Introduced: Chapter 11 (Section 11.4), bilateral model detailed in Chapter 13 (Section 13.2) Audience: Platform operators, team leads Purpose: Brings non-derived workloads (Helm-installed packages, legacy systems) into the bilateral network agreement model. The mesh-member controller generates CiliumNetworkPolicies and AuthorizationPolicies based on declared ports and callers.

apiVersion: lattice.dev/v1alpha1
kind: LatticeMeshMember
metadata:
name: redis
namespace: data
spec:
target:
selector:
app: redis
ports:
- port: 6379
name: redis
peerAuth: Strict
allowedCallers:
- name: checkout
namespace: commerce
- name: inventory
namespace: commerce
dependencies: []
FieldTypeRequiredDescriptionDefault
target.selectormap (string -> string)YesLabel selector matching the pods this MeshMember describes.None (required)
portslist of objectsYesPorts exposed by the workload.None (required)
ports[].portintegerYesPort number.None (required)
ports[].namestringYesPort name (semantic meaning for mesh routing).None (required)
ports[].peerAuthenumNomTLS mode: Strict (require mTLS) or Permissive.Strict
allowedCallerslist of objectsNoServices permitted to call this workload (inbound side of bilateral agreement).[] (no callers)
allowedCallers[].namestringYesName of the calling service.None (required)
allowedCallers[].namespacestringYesNamespace of the calling service.None (required)
dependencieslistNoOutbound dependencies of this workload. Participates in bilateral agreements with other services/MeshMembers.[]
  • MeshMembers are manually maintained. When the Helm chart version bumps and adds ports, the MeshMember must be updated.
  • The compliance controller (Chapter 14) can detect pods with open ports that no MeshMember declares.
  • A package deployed without a MeshMember is safe (default-deny blocks traffic) but fails silently — services that try to reach it get timeouts.

Kind: LatticeComplianceProfile Introduced: Chapter 14 (Section 14.4) Audience: Platform team, security team Purpose: Declares which compliance frameworks to evaluate continuously. The compliance controller runs probes for each framework’s controls at the configured interval and reports pass/fail with evidence in the status.

apiVersion: lattice.dev/v1alpha1
kind: LatticeComplianceProfile
metadata:
name: production
spec:
frameworks:
- nist-800-53-moderate
- cis-kubernetes
- soc-2
scanInterval: 1h
status:
lastScanTime: "2026-04-06T02:00:20Z"
frameworks:
nist-800-53-moderate:
passed: 29
failed: 0
total: 29
cis-kubernetes:
passed: 4
failed: 0
total: 4
soc-2:
passed: 5
failed: 0
total: 5
FieldTypeRequiredDescriptionDefault
frameworkslist of stringsYesCompliance frameworks to evaluate. Values include nist-800-53-moderate, cis-kubernetes, soc-2.None (required)
scanIntervalduration stringYesHow often to run compliance probes (e.g., 1h, 30m).None (required)
  • Cedar authorization probes: Submit known-bad requests and verify denial.
  • Resource existence probes: Verify expected resources exist and are healthy (e.g., default-deny CiliumClusterwideNetworkPolicy).
  • Configuration probes: Verify cluster-level settings (API server audit logging, etcd encryption).
  • Deployment readiness probes: Verify security infrastructure health (Cilium agents, Istio control plane, cert-manager).

Kind: CedarPolicy Introduced: Chapter 13 (Section 13.1), referenced in Chapter 4 (Section 4.9), Chapter 8 Audience: Platform team, team leads Purpose: Defines Cedar authorization rules evaluated at derivation time. Policies are validated by admission webhook and distributed to workload clusters via gRPC stream. Evaluation uses forbid-overrides-permit semantics with default-deny.

No YAML spec example is shown in the book. CedarPolicy CRDs contain Cedar language policy text. They are:

  • Validated by an admission webhook (CedarPolicyValidator) for syntax correctness before admission (Chapter 8 answer key).
  • Distributed to workload clusters through the SyncDistributedResourcesCommand gRPC stream (Chapter 7).
  • Evaluated locally on each workload cluster — no callback to the parent.
  • Deletable for fast rollback: delete the CRD and every cluster re-syncs within 60 seconds (Chapter 13).
GateFires WhenDescription
DeployImageAlwaysCan this service deploy this image? Evaluates image signing status.
AllowTagReferenceImage uses a tag instead of digestCan this service use a tag? Defaults to deny.
AccessSecretSpec references a secretCan this service access this secret?
OverrideSecuritySpec requests capabilities, privilege, or AppArmor overridesCan this service use privileged capabilities?
AccessExternalEndpointSpec has type: external-service resourcesCan this service call this external host?
AccessVolumeSpec has type: volume resourcesCan this service mount this shared volume?
// Team lead permits commerce services to access team secrets
permit(
principal in Namespace::"commerce",
action == Action::"AccessSecret",
resource in SecretStore::"commerce"
);
// Security team forbids all access to the root CA key
forbid(
principal,
action == Action::"AccessSecret",
resource == Secret::"pki/root-ca-key"
);

Kind: SecretProvider Introduced: Chapter 9 (Section 9.3) Audience: Platform team Purpose: Configures a secret backend. One per backend per environment. The derivation pipeline resolves ${resources.<name>.<key>} references against the configured ClusterSecretStore. Backend migrations are transparent to developers.

apiVersion: lattice.dev/v1alpha1
kind: SecretProvider
metadata:
name: vault-production
spec:
backend: vault
config:
server: https://vault.internal:8200
path: secret/data
authMethod: kubernetes
FieldTypeRequiredDescriptionDefault
backendstringYesSecret backend type (e.g., vault, aws-secrets-manager).None (required)
config.serverstringConditionalBackend server URL. Required for Vault.None
config.pathstringConditionalBase path for secret lookups. Required for Vault.None
config.authMethodstringConditionalAuthentication method (e.g., kubernetes for Vault’s Kubernetes auth).None
  • The platform team must ensure key name compatibility during backend migrations. If Vault uses password and AWS uses db-password, developer ${resources.orders-db.password} references break (Chapter 9, Section 9.3).
  • A key mapping layer in the SecretProvider can handle name differences during migration.

Kind: TrustPolicy Introduced: Chapter 14 (Section 14.2) Audience: Platform team, security team Status: Image signing and verification is not yet implemented in the reference implementation. This section describes the intended behavior. See the Implementation Roadmap for current status. Purpose: Maps cosign signing keys to container registries. At derivation time, the pipeline verifies each container image’s signature against the applicable TrustPolicy before producing any Kubernetes resources.

apiVersion: lattice.dev/v1alpha1
kind: TrustPolicy
metadata:
name: internal-registry
spec:
registry: registry.example.com
cosign:
publicKey:
secretRef: signing-keys/cosign-public
FieldTypeRequiredDescriptionDefault
registrystringYesContainer registry hostname to match against image references.None (required)
cosign.publicKey.secretRefstringYesReference to a Kubernetes Secret containing the cosign public key (namespace/name format).None (required)
  • Caching: Verified results cached for 5 minutes; failed verifications cached for 60 seconds. Concurrent verifications of the same image are coalesced.
  • Cache invalidation gap: After key revocation (TrustPolicy update), cached “verified” results persist for up to 5 minutes. Event-driven cache invalidation reduces this to seconds but is not implemented in the reference implementation (Chapter 14, Section 14.9).
  • Keyless signing: Cosign supports keyless signing via OIDC/Fulcio/Rekor. The reference implementation uses key-based signing to avoid the Rekor dependency.

The following types are shared across LatticeService, LatticeJob, and LatticeModel (Chapter 4, Section 4.9):

ComponentShared FieldsDescription
Container specimage, command, args, variables, files, resources (CPU/memory/GPU), livenessProbe, readinessProbeContainer definition format is identical across all workload CRDs.
Resource declarationstype, direction, paramsDependency declaration format (service, secret, volume, external-service, gpu) is identical.
Secret reference syntax${resources.<name>.<key>}Interpolation syntax for variables and files is identical. Resolved through the same five routing paths (Chapter 9).
Security gatesDeployImage, AccessSecret, OverrideSecurity, AccessExternalEndpoint, AccessVolume, AllowTagReferenceAll workload CRDs pass through the same Cedar authorization gates.
CRDUnique Top-Level FieldsDerived Output Differences
LatticeServicereplicas, autoscaling, ingress, deploy, workload.service.ports, observabilityDeployment, Service, PDB, KEDA ScaledObject, VMServiceScrape
LatticeJobtasks, queue, minAvailable, schedule, concurrencyPolicy, defaults.entryRuntimeVolcano VCJob, PodGroup, CronJob (if scheduled). No PDB, no ScaledObject.
LatticeModelmodelSource, roles, routing, defaults.entryWorkloadMultiple Deployments (per role), model download init container, role-specific KEDA ScaledObjects with GPU metrics, inference routing resources.