KubeVela
Application delivery platform implementing the Open Application Model on Kubernetes.
KubeVela is a CNCF project that implements the Open Application Model (OAM), providing a higher-level abstraction layer over raw Kubernetes resources. It lets platform teams define reusable ComponentDefinition and TraitDefinition building blocks, and lets app teams deploy via Application CRDs without dealing with raw Deployments, Services, or Ingresses. The controller and the VelaUX dashboard are installed on the talos cluster, but no workload is delivered through it today: there is not a single Application in Git, and apps ship as plain Kustomize overlays. Application delivery with KubeVela describes what is installed and what would have to happen before an app could move over.
Alternatives considered
Self Hosted
| Tool | Open Source | Full Features | Notes |
|---|---|---|---|
| Argo CD ApplicationSet | Yes | Yes | GitOps-only; no OAM abstraction layer |
| Kratix | Yes | Yes | Platform-as-a-product approach via Promises |
| Kustomize + Flux | Yes | Yes | No higher-level app abstraction; used alongside KubeVela here |
Installation
Architecture
HelmRelease kubevela in namespace kubevela-system, chart vela-core from https://kubevela.github.io/charts, version pinned via Renovate. Admission webhook enabled with cert-manager integration. VelaUX dashboard enabled (1 replica, ClusterIP service, ingress disabled). Leader election enabled. Built-in component definitions (webservice, k8s-objects, etc.) enabled. Webhook caBundle drift is ignored via driftDetection.ignore for multiple webhook paths.
Security
Pod securityContext: runAsNonRoot: true, runAsUser/Group/fsGroup: 1000, seccompProfile: RuntimeDefault. Container securityContext: allowPrivilegeEscalation: false, capabilities: drop: ALL. Admission webhook uses cert-manager for TLS. RBAC is cluster-wide (OAM controller needs to manage resources in any namespace).
Updates
Managed by Renovate. The chart version is semver-pinned in the HelmRelease.
Usage
Platform operators define ComponentDefinition and TraitDefinition resources to encapsulate Kubernetes patterns. Application owners create Application resources referencing those definitions to deploy workloads. The VelaUX dashboard provides a web UI for visualizing and managing applications. Traits such as ingress, scaling, and resource policies can be applied declaratively to components.
Cluster-specific deviations from the above live in the per-cluster README — see k8s/platform/kubevela/talos/README.md.
Cluster Deployment
KubeVela — Talos cluster
Deviations from defaults
- vela-core image pinned by digest (
kubevela-values.yaml) —verify-platform-imagesruns withverifyDigest: true, so the tag-only chart default is rejected at admission and Flux cannot reconcile the HelmRelease.
- HelmRelease:
vela-core@1.11.0 - HelmRepo:
kubevela(https://kubevela.github.io/charts)
Rendered manifests (kustomize build)
apiVersion: v1
data:
values.yaml: |
replicaCount: 1
# vela-core is pinned by tag AND digest: the Kyverno policy
# verify-platform-images checks the cosign signature with verifyDigest: true,
# which rejects tag-only image references at admission — Flux's dry-run of the
# Deployment fails and the HelmRelease cannot reconcile. The chart has no
# digest value, so the digest rides in `tag`. Renovate's helm-values manager
# parses `tag@digest`; the chart version is grouped into the same PR.
image:
repository: oamdev/vela-core
tag: v1.11.0@sha256:95fa412c934e3c94c741a0fa3f89652eeda41728b63db1c7d76d6356cf8664f7
pullPolicy: IfNotPresent
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
# No joined clusters — the cluster-gateway APIService only serves remote-cluster
# management and its helm-hook-patched caBundle repeatedly wedged upgrades
multicluster:
enabled: false
# Enable admission webhook (recommended)
admissionWebhooks:
enabled: true
failurePolicy: Fail
certManager:
enabled: true
# Enable leader election (important if scaling >1 replica later)
leaderElection:
enabled: true
# Enable built-in definitions (webservice, k8s-objects, etc.)
velaCore:
builtinDefinition:
enabled: true
# Disable velaux dashboard (install separately if needed)
velaux:
enabled: true
replicaCount: 1
resources:
limits:
cpu: 300m
memory: 256Mi
requests:
cpu: 50m
memory: 128Mi
service:
type: ClusterIP
ingress:
enabled: false
# Logging
logLevel: info
podSecurityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
fsGroupChangePolicy: OnRootMismatch
seccompProfile:
type: RuntimeDefault
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
kind: ConfigMap
metadata:
name: kubevela-values-kgt4bhcfgd
namespace: kubevela-system