Kraan is a kubernetes controller for processing “AddonLayer” custom resources. An AddonLayer has the following features.
Kraan is a combination of 3 tools. The installation of kraan will involve the installation of all these 3 tools.
kraan controller is the main controller that is responsible to watching AddonLayer custom resources and bringing to its desired state. In attempting to do so, it relies on helm-controller to deploy the addon helm charts that are part of the layer. Helm operator watches and reconciles HelmRelease custom resource. Each HelmRelease custom resources represents a single addon. For more details on HelmRelease, check here. source-controller is one of the components in gitops-toolkit which helps abstracting away git interaction from kraan. By design, an AddonLayer will point to a directory in a git repository which contains the list of HelmReleases. Whenever kraans’ reconciliation logic is kicked off, in order to fetch the list of helm releases that are part of that addon layer, it will reach out to source-controller api to fetch repo files instead of reaching out to git directly.
Note: In future, kraan will support packaging addons in formats other than helm charts e.g kustomization
The addons are first packaged as HelmRelease custom resources which represents a helm chart. A sample helm release custom resource is shown below. For more details on HelmRelease, check here.
# podinfo.yaml
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: podinfo
namespace: default
spec:
install:
remediation:
retries: -1
upgrade:
remediation:
retries: -1
chart:
spec:
chart: podinfo
sourceRef:
kind: HelmRepository
name: podinfo
namespace: gotk-system
version: '>4.0.0'
values:
podinfo:
service:
enabled: true
type: ClusterIP
replicaCount: 1
message: podinfo
interval: 1m0s
A sample addon layer custom resource is shown below.
apiVersion: kraan.io/v1alpha1
kind: AddonsLayer
metadata:
name: bootstrap
spec:
version: 1.0.0
hold: true
interval: 1m
source:
name: addons
namespace: gotk-system
path: ./addons/bootstrap
prereqs:
k8sVersion: "1.16"
---
apiVersion: kraan.io/v1alpha1
kind: AddonsLayer
metadata:
name: base
spec:
version: 1.0.1
interval: 1m
source:
name: addons
namespace: gotk-system
path: ./addons/base
prereqs:
k8sVersion: "1.16"
dependsOn:
- bootstrap@1.0.0
Kraan controller is built using the kubebuilder project. From a controllers’ perspective, reconciliation is where it attempts to bring the current state of the layer into its desired state. The reconciliation logic is kicked off whenever there is a change detected in the AddonLayer custom resource. It could be an addition, deletion or an update to the resource. Whenever an event is received for an AddonLayer,
Check if the dependent layers are succesfully deployed. This is a multi step process.
At every stage, the status subresource on the layer custom resource will be updated with the latest status.