Platform Manifests
This document provides an example of how Holos uses CUE and Helm to unify and render the platform configuration. It refers to the manifests rendered in the Try Holos Locally guide.
Take a moment to review the manifests holos
rendered to build the platform.
ArgoCD Application
Note the Git URL in the Platform Model is used to derive the ArgoCD
Application
resource for all of the platform components.
# deploy/clusters/workload/gitops/namespaces.application.gen.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: namespaces
namespace: argocd
spec:
destination:
server: https://kubernetes.default.svc
project: default
source:
path: /deploy/clusters/workload/components/namespaces
repoURL: https://github.com/holos-run/holos-k3d.git
targetRevision: HEAD
One ArgoCD Application
resource is produced for each Holos component by
default. The CUE definition which produces the rendered output is defined in
buildplan.cue
around line 222.
Note how CUE does not use error-prone text templates, the language is well
specified and typed which reduces errors when unifying the configuration with
the Platform Model in the following #Argo
definition.
// buildplan.cue
// #Argo represents an argocd Application resource for each component, written
// using the #HolosComponent.deployFiles field.
#Argo: {
ComponentName: string
Application: app.#Application & {
metadata: name: ComponentName
metadata: namespace: "argocd"
spec: {
destination: server: "https://kubernetes.default.svc"
project: "default"
source: {
path: "\(_Platform.Model.argocd.deployRoot)/deploy/clusters/\(_ClusterName)/components/\(ComponentName)"
repoURL: _Platform.Model.argocd.repoURL
targetRevision: _Platform.Model.argocd.targetRevision
}
}
}
// deployFiles represents the output files to write along side the component.
deployFiles: "clusters/\(_ClusterName)/gitops/\(ComponentName).application.gen.yaml": yaml.Marshal(Application)
}
Helm Chart
The cert-manger
component renders using the upstream Helm chart. The build
plan that defines the helm chart to use along with the values to provide looks
like the following.
Holos fully supports your existing Helm charts. Consider leveraging holos
as
an alternative to umbrella charts.
// components/cert-manager/cert-manager.cue
package holos
// Produce a helm chart build plan.
(#Helm & Chart).Output
let Chart = {
Name: "cert-manager"
Version: "1.14.5"
Namespace: "cert-manager"
Repo: name: "jetstack"
Repo: url: "https://charts.jetstack.io"
Values: {
installCRDs: true
startupapicheck: enabled: false
// Must not use kube-system on gke autopilot. GKE Warden blocks access.
global: leaderElection: namespace: Namespace
// https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-resource-requests#min-max-requests
resources: requests: {
cpu: "250m"
memory: "512Mi"
"ephemeral-storage": "100Mi"
}
webhook: resources: Values.resources
cainjector: resources: Values.resources
startupapicheck: resource: Values.resources
// https://cloud.google.com/kubernetes-engine/docs/how-to/autopilot-spot-pods
nodeSelector: {
"kubernetes.io/os": "linux"
if _ClusterName == "management" {
"cloud.google.com/gke-spot": "true"
}
}
webhook: nodeSelector: Values.nodeSelector
cainjector: nodeSelector: Values.nodeSelector
startupapicheck: nodeSelector: Values.nodeSelector
}
}