Generating Manifests
To demonstrate ktl
ability to generate K8s manifests from live clusters, we
will use the following setup with 4 clusters (dev-a
, dev-b
, prod-a
and
prod-b
):
-
All clusters have
demo-app
deployed inktl-examples
namespace -
dev-*
clusters use container imagedemo-app:v2
whileprod-*
clusters are runningv1
-
*-a
clusters have an additionalsidecar
container -
dev-a
cluster uses a configmap for thesidecar
container
To generate the manifests, we can use ktl run pipeline.yaml
command. Full
specification of the pipeline.yaml
is available in the run
spec section.
Kustomize Components
source:
kubeconfig:
clusters:
- matchNames: { include: [ '*' ] }
resources:
- matchNamespaces: { include: [ 'ktl-examples' ] }
output:
kustomizeComponents: {}
As a result ktl
will generate the following Kustomize layout:
components
├── all-clusters
│ ├── ktl-examples
│ │ ├── demo-app-deployment.yaml
│ │ └── demo-app-service.yaml
│ └── kustomization.yaml
├── dev-a
│ ├── ktl-examples
│ │ ├── demo-app-deployment.yaml
│ │ └── sidecar-env-configmap.yaml
│ └── kustomization.yaml
├── dev-a_dev-b
│ ├── ktl-examples
│ │ └── demo-app-deployment.yaml
│ └── kustomization.yaml
├── dev-a_prod-a
│ ├── ktl-examples
│ │ └── demo-app-deployment.yaml
│ └── kustomization.yaml
└── prod-a_prod-b
├── ktl-examples
│ └── demo-app-deployment.yaml
└── kustomization.yaml
overlays
├── dev-a
│ └── kustomization.yaml
├── dev-b
│ └── kustomization.yaml
├── prod-a
│ └── kustomization.yaml
└── prod-b
└── kustomization.yaml
Here the demo-app
for cluster dev-a
is composed from the all-clusters
base
and 3 patches:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: demo-app
name: demo-app
namespace: ktl-examples
spec:
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
spec:
containers:
- name: demo-app
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
namespace: ktl-examples
spec:
template:
spec:
containers:
- name: demo-app
image: demo-app:v2
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
namespace: ktl-examples
spec:
template:
spec:
containers:
- image: sidecar:v1
name: sidecar
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
namespace: ktl-examples
spec:
template:
spec:
containers:
- name: sidecar
envFrom:
- configMapRef:
name: sidecar-env
Cluster group aliases and resource selection
resources
attribute can be used to
refine resource selection. All match*
attributes support shell
-like
patterns.
alias
attribute can be used
to improve component naming.
source:
kubeconfig:
clusters:
- alias: dev
matchNames: { include: [ 'dev-*' ] }
- alias: prod
matchNames: { include: [ 'prod-*' ] }
- alias: env-a
matchNames: { include: [ '*-a' ] }
- alias: env-b
matchNames: { include: [ '*-b' ] }
resources:
- matchNamespaces: { include: [ 'ktl-examples' ] }
matchApiResources: { exclude: [ 'services' ] }
- matchApiResources: { include: [ 'namespaces' ] }
matchNames: { include: [ 'ktl-examples' ] }
output:
kustomizeComponents: {}
As a result, the ktl-examples
namespace will be exported, but not the
service. And component names will use aliases when possible:
components
├── all-clusters
│ ├── ktl-examples
│ │ └── demo-app-deployment.yaml
│ ├── ktl-examples-namespace.yaml
│ └── kustomization.yaml
├── dev
│ ├── ktl-examples
│ │ └── demo-app-deployment.yaml
│ └── kustomization.yaml
├── dev-a
│ ├── ktl-examples
│ │ ├── demo-app-deployment.yaml
│ │ └── sidecar-env-configmap.yaml
│ └── kustomization.yaml
├── env-a
│ ├── ktl-examples
│ │ └── demo-app-deployment.yaml
│ └── kustomization.yaml
└── prod
├── ktl-examples
│ └── demo-app-deployment.yaml
└── kustomization.yaml
Helm Chart
We can also change the output to a Helm chart:
source:
kubeconfig:
clusters:
- alias: dev
matchNames: { include: [ 'dev-*' ] }
- alias: prod
matchNames: { include: [ 'prod-*' ] }
- alias: env-a
matchNames: { include: [ '*-a' ] }
- alias: env-b
matchNames: { include: [ '*-b' ] }
resources:
- matchNamespaces: { include: [ 'ktl-examples' ] }
output:
helmChart:
name: demo-app
version: v1.0
As a result, ktl
will generate the following:
charts
└── demo-app
├── Chart.yaml
├── templates
│ ├── _helpers.tpl
│ ├── demo-app-deployment.yaml
│ ├── demo-app-service.yaml
│ └── sidecar-env-configmap.yaml
└── values.yaml
overlays
├── dev-a
│ └── kustomization.yaml
├── dev-b
│ └── kustomization.yaml
├── prod-a
│ └── kustomization.yaml
└── prod-b
└── kustomization.yaml
The resulting deployment template will have all variable attributes parameterized:
{{- include "merge_presets" . -}}
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: demo-app
name: demo-app
namespace: ktl-examples
spec:
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
spec:
containers:
{{- if index .Values.global "ktl-examples/Deployment/demo-app.spec.template.spec.containers.[name=sidecar]" }}
- {{- if index .Values.global "ktl-examples/Deployment/demo-app.spec.template.spec.containers.[name=sidecar].envFrom" }}
envFrom:
- configMapRef:
name: sidecar-env
{{- end }} # ktl-examples/Deployment/demo-app.spec.template.spec.containers.[name=sidecar].envFrom
image: sidecar:v1
name: sidecar
{{- end }} # ktl-examples/Deployment/demo-app.spec.template.spec.containers.[name=sidecar]
- image: {{ index .Values.global "ktl-examples/Deployment/demo-app.spec.template.spec.containers.[name=demo-app].image" }}
name: demo-app
Common values will be grouped into presets and bundled within chart's
values.yaml
- simiar to Kustomize components:
global: {}
preset_values:
dev:
ktl-examples/Deployment/demo-app.spec.template.spec.containers.[name=demo-app].image: demo-app:v2
env-a:
ktl-examples/Deployment/demo-app.spec.template.spec.containers.[name=sidecar]: enabled
prod:
ktl-examples/Deployment/demo-app.spec.template.spec.containers.[name=demo-app].image: demo-app:v1
The Kustomize overlays
will contain per-cluster valuesInline
:
kind: Kustomization
helmGlobals:
chartHome: ../../charts
helmCharts:
- name: demo-app
version: v1.0
valuesInline:
global:
ktl-examples/ConfigMap/sidecar-env: enabled
ktl-examples/Deployment/demo-app.spec.template.spec.containers.[name=sidecar].envFrom: enabled
presets:
- dev
- env-a