Helm KCL Plugin
Introduction
Helm is a tool for managing Charts. Charts are packages of pre-configured Kubernetes resources. You can use the Helm-KCL-Plugin
to
- Edit the helm charts in a hook way to separate data and logic for the Kubernetes manifests management.
- For multi-environment and multi-tenant scenarios, you can maintain these configurations gracefully rather than simply copy and paste.
- Validate all KRM resources using the KCL schema.
Prerequisites
- Install Helm
- Install Helm KCL Plugin
Quick Start
Let’s write a KCL function which add annotation managed-by=helm-kcl-plugin
only to Deployment
resources in the helm chart.
1. Get the Example
git clone https://github.com/kcl-lang/helm-kcl.git/
cd ./helm-kcl/examples/workload-charts-with-kcl
2. Test and Run
Run the KCL code via the Helm KCL Plugin
.
helm kcl template --file ./kcl-run.yaml
The output yaml is
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/instance: workload
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: workload
app.kubernetes.io/version: 0.1.0
helm.sh/chart: workload-0.1.0
name: workload
spec:
ports:
- name: www
port: 80
protocol: TCP
targetPort: 80
selector:
app.kubernetes.io/instance: workload
app.kubernetes.io/name: workload
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/instance: workload
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: workload
app.kubernetes.io/version: 0.1.0
helm.sh/chart: workload-0.1.0
name: workload
annotations:
managed-by: helm-kcl-plugin
spec:
selector:
matchLabels:
app.kubernetes.io/instance: workload
app.kubernetes.io/name: workload
template:
metadata:
labels:
app.kubernetes.io/instance: workload
app.kubernetes.io/name: workload
spec:
containers:
- image: nginx:alpine
name: frontend
Guides for Developing KCL
Here's what you can do in the KCL code:
- Read resources from
option("items")
. Theoption("items")
complies with the KRM Functions Specification. - Return a KRM list for output resources.
- Return an error using
assert {condition}, {error_message}
. - Read the PATH variables. e.g.
option("PATH")
. - Read the environment variables. e.g.
option("env")
.