Package Managers
What is a package manager?💣
Helm💣
- Helm is a configuration management tool for Kubernetes.
- It uses a set of templates to allow customization of application configuration.
- Helm is a CNCF project with a large community built around it
- Key Concepts:
- A Helm Chart is a bundle of information necessary to create an instance of a Kubernetes application.
- The chart holds configuration data for merging into a packaged chart to create a release object.
- A release is a running instance of a chart, combined with a specific config.
Helm Charts💣
- Application Packages are called Helm Charts.
- A chart is a way to define an application.
- File Structure:
- Chart.yaml: Author, version, description, image location.
- values.yaml: default configuration values for chart.
- templates: Templatized Kubernetes resources that will be paramterized at installation time.
- Helm CLI is available from GitHub or Homebrew.
Helm Chart Structure💣
MyChart/
|── Chart.yaml #Required
|── LICENSE
|── values.yaml #Required
|── values.schema.json
|── charts/ #Required
└── dependent charts
|── crds/
└── needed crds
└── templates/ #Required
|── deployment.yaml
|── ingress.yaml
|── service.yaml
|── NOTES.txt
└── tests/
└── test-connection.yaml
Example Helm Chart Files💣
Example values.yaml
# The istio profile to use
profile: default
# The hub to use for the image (note: the image is built as
hub: registryl.dsop.io/ironbank/opensource/istio
# The tag to use for the image
tag: 1.7.3
# The hostname to use for the default gateway
hostname: bigbang.dev
imagePullSecrets:
[]
# - private-registry
tls:
credentialName: wildcard-cert
mode: SIMPLE
Example tempalte file
apiVersion: install.istio.io/vlalpha1
kind: IstioOperator
metadata:
name: istiocontrolplane
namespace: {{ .Release. Namespace }}
spec:
profile: {{ .Values.profile }}
hub: {{ .Values.hub }}
tag: {{ .Values.tag }}
components:
ingressGateways:
- name: istio-ingressgateway
namespace: {{ .Release.Namespace }}
enabled: true
k85:
hpaSpec:
minReplicas: {{ .Values.ingressGateway.minReplicas }}
maxReplicas: {{ .Values.ingressGateway.maxReplicas }}
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 60
scaleTargetRef:
apiVersion: apps/v1
kind: Development
How Big Bang uses Helm💣
- Helm can manage a charts lifecycle.
- Flux can manage a charts lifecycle.
- All core Big Bang components are installed as Helm Charts.
Kustomize💣
Kustomize is template-free configuration customization for Kubernetes that allows you to reuse manifests across all of your environments (dev, stage, prod) and then overlay unique specifications for each.
- Kustomize has a CLI for managing kubernetes style objects in a declarative way.
- It is built into
kubectl
natively. - Customizations for any file can be defined declaratively, as needed.
- This is done through overlay files that customize the base yaml configurations.
- Kustomize build.
Kustomize File Structure💣
hello-world/
|── base
| ├── deployment.yaml
| └── kustomization.yaml
└── overlays
|── production
| ├── replica_count.yaml
| └── kustomization.yaml
└── staging
├── replica_count.yaml
└── kustomization.yaml
Kustomize File Rendering💣
Assuming the structure above, let’s see how Kustomize combines base files and overlays to arrive at a materialized file. Assume the files below:
hello-world/base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
hello-world/base/kustomization.yaml
resources:
- deployment.yaml
hello-world/overlays/staging/replica_cound.yaml
apiVersion: apps/v1
kind: Deployment
metatdata:
name: hello-world
spec:
replicas: 3
hello-world/base/kustomization.yaml
bases:
- dep../../base
patches:
- replica_count.yaml
The resultant output of running the following command, notice that the replicas
spec has been updated to 3
.
kustomize build hello-world/overlays/staging/
Will be the below:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 3
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
Additional Kustomize Features💣
- Name prefix
- Add a prefix to all resource names.
- Common Labels
- Adds labels to all resources.
- Common Annotations
- Adds annotations to all resources.
- ConfigMap Generator
- Take a file and turns the contents into a configmap.
- SOPS Secret Generator
- (Big Bang Enabled alpha plugin) Takes a file and turns the contents into a Secret.