Helm
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 Desired State releases, rather than imperative.