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: Information about the chart, such as author, version, description, and image location.
 - values.yaml: Default configuration values for the chart.
 - templates: A directory of templates that, when combined with values, will generate valid Kubernetes manifest files.
 
 - 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 template 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 chart’s lifecycle.
 - Flux can manage a chart’s 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 
kubectlnatively. - 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_count.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.
 
 
Quiz Questionsπ
What is a Package Manager?
A Package Manager is a tool or collection of tools that automates the process of installing, upgrading, configuring, and removing computer programs for a computer in a consistent manner.
The Package Managing tool the Big Bang uses is Helm
What are the required components of the Helm Chart structure?
The required files are: Chart.yaml and values.yaml
The required folders are: charts/ and templates/
How does Big Bang use Helm?
Big Bang uses helm to manage a chartβs lifecycle, install all core Big Bang components as Helm Charts, and uses Flux can manage a chartβs lifecycle