Kubernetes configuration can be performed via imperative command line or declarative YAML files. While OpenShift provides a user interface to allow manual configuration of the Kubernetes cluster, which is ideal for discovery and development purposes, but is not sustainable in a production solution.

While Kubernetes YAML definitions are declarative, it is laborious have multiple copies for similar deployment patterns and multiple target environments. The most fundamental declaration is a deployment, which defines what containers are to be deployed.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14.2
        ports:
        - containerPort: 80

To avoid proliferation of YAML definitions, and provide flexibility to alter deployment specific aspects, Helm was introduced. Helm provides a template for deployments, which can be re-used for multiple applications across multiple environments.

graph TD subgraph test subgraph app1 serv1["service"] appt1["pod"] end subgraph app2 serv2["service"] appp2["pod"] end end subgraph prod subgraph app3 serv3["service"] appt3["pod"] end subgraph app4 serv4["service"] appp4["pod"] end end serv1 --> appt1 serv2 --> appp2 serv3 --> appt3 serv4 --> appp4 classDef dotted stroke-dasharray: 2, 2 class test,prod dotted classDef dashed stroke-dasharray: 5, 5 class app1,app2,app3,app4 dashed

Deploying each application, in each environment, requires imperative knowledge of what steps are needed to achieve the desired outcome. See Helmsman to apply Desired State releases, rather than imperative.