Skip to main content

Platform Lifecycle Model

Purpose: For platform engineers and architects, explains the boundary between Day-1 (provisioning, bootstrap, initial configuration) and Day-2 (upgrades, scaling, backup, drift management) in openCenter, including which tools own each phase and how handoffs work.

Concept Summary

openCenter splits cluster lifecycle into two distinct phases:

  • Day-1: Everything needed to go from zero to a running, GitOps-managed cluster.
  • Day-2: Everything needed to keep it running, healthy, and up-to-date.

The boundary between phases is the moment FluxCD starts reconciling from Git. Before that point, the CLI orchestrates. After it, Git + FluxCD own desired state.

Day-1: Provision and Bootstrap

Day-1 transforms a cluster configuration file into a running Kubernetes cluster with platform services.

Stages

StageOwnerInputOutput
1. Configureopencenter cluster init / configureUser answers<cluster>-config.yaml
2. Validateopencenter cluster validateConfig filePass/fail + issues
3. Generateopencenter cluster generateConfig fileGitOps repository (manifests, Terraform, Ansible)
4. Provision infrastructureopencenter cluster deploy (OpenTofu)main.tfVMs, networks, LBs, volumes
5. Deploy Kubernetesopencenter cluster deploy (Kubespray)Ansible inventoryRunning K8s cluster + kubeconfig
6. Bootstrap GitOpsopencenter cluster deploy (FluxCD)GitRepository + KustomizationsFluxCD reconciling platform services

Tools per Stage

Stage 1-3: opencenter CLI (Go binary)

Stage 4: OpenTofu (infrastructure provisioning)

Stage 5: Kubespray via Ansible (Kubernetes installation)

Stage 6: flux bootstrap (FluxCD installation + first reconciliation)

Day-1 Artifacts

After Day-1 completes, these artifacts exist:

ArtifactLocationPurpose
Cluster configclusters/state/<org>/<cluster>/<cluster>-config.yamlSource of truth for cluster parameters
GitOps repositoryclusters/gitops/<org>/FluxCD reconciliation source
SOPS Age keyclusters/secrets/<org>/<cluster>/age/keys/Secret decryption in cluster
SSH key pairclusters/secrets/<org>/<cluster>/ssh/Node access
Kubeconfigclusters/state/<org>/<cluster>/kubeconfig.yamlCluster admin access
Terraform stateclusters/state/<org>/<cluster>/terraform.tfstateInfrastructure state

Day-2: Operate and Evolve

Day-2 starts once FluxCD is reconciling. The cluster is "alive" — changes flow through Git.

Operations

OperationToolTriggerMechanism
Kubernetes upgradeopencenter cluster upgradeOperator decisionKubespray rolling upgrade playbook
Service upgradeGit PR (update gitops-base tag)New release availableFluxCD reconciles new HelmRelease versions
Worker scalingGit PR (add/remove worker pool)Capacity needOpenTofu + Kubespray for new nodes
BackupVelero (scheduled)CronJobSnapshot to S3/Swift
Certificate rotationcert-manager (automatic)30 days before expirycert-manager renews via ACME
Drift detectionopencenter cluster driftOperator or scheduledCompares desired (config) vs actual (cloud API)
Drift reconciliationopencenter cluster drift --reconcileOperator approvalCloud API calls to fix divergence
Secret rotationopencenter secrets rotateSecurity policyRe-encrypt with new key, update cluster
Disaster recoveryvelero restoreIncidentRestore from backup
Configuration changeopencenter cluster configure --guidedOperator decisionRegenerate manifests → Git PR → FluxCD reconciles

Day-2 Ownership Model

┌─────────────────────────────────────────────────────┐
│ Git Repository │
│ (source of truth for cluster desired state) │
└──────────────────────┬──────────────────────────────┘

┌────────────┼────────────┐
▼ ▼ ▼
┌─────────────┐ ┌───────────┐ ┌──────────────┐
│ FluxCD │ │ Kyverno │ │ cert-manager │
│ reconciles │ │ enforces │ │ rotates │
│ manifests │ │ policy │ │ certs │
└─────────────┘ └───────────┘ └──────────────┘
ConcernOwnerHow
Manifest desired stateGitPRs, reviews, merge
Manifest enforcementFluxCDContinuous reconciliation
Policy enforcementKyvernoAdmission control
TLS lifecyclecert-managerACME renewal
Backup scheduleVeleroCronJob
Infrastructure stateOpenTofuTerraform state file
Node OS patchesOperatorSSH + package manager (outside openCenter scope)

Handoff Boundaries

CLI → FluxCD Handoff

The CLI generates and pushes manifests. FluxCD reconciles them. After Day-1, the CLI no longer directly applies resources to the cluster (except for upgrade playbooks and infrastructure changes).

CLI writes to Git → FluxCD reads from Git → Cluster state matches Git

If you need to change a service configuration:

  1. Don't kubectl edit or kubectl apply.
  2. Do update the manifest in Git. FluxCD will enforce it.

FluxCD → Operator Handoff

Some operations require human judgment:

  • Kubernetes version upgrades: FluxCD cannot upgrade kubelet on nodes. The CLI + Kubespray handles this.
  • Infrastructure scaling: Adding nodes requires OpenTofu to provision VMs first.
  • Disaster recovery: Deciding what to restore and validating post-restore state.

openCenter-gitops-base → Customer Repo Handoff

Base manifests provide hardened defaults. Customer overlays provide cluster-specific values.

Owned by gitops-baseOwned by customer overlay
HelmRelease spec (chart version, default values)Value overrides (replicas, resources, domains)
Kyverno ClusterPolicy definitionsNamespace-scoped exceptions
Default NetworkPolicies for platform namespacesTenant NetworkPolicies

Lifecycle Diagram

Day-1 │ Day-2

┌──────────┐ ┌──────────┐ │ ┌──────────┐ ┌──────────┐
│Configure │──▶│ Validate │ │ │ Upgrade │ │ Scale │
└──────────┘ └──────────┘ │ └──────────┘ └──────────┘
│ │
▼ │ ┌──────────┐ ┌──────────┐
┌──────────┐ │ │ Backup │ │ Drift │
│ Generate │ │ └──────────┘ └──────────┘
└──────────┘ │
│ │ ┌──────────┐ ┌──────────┐
▼ │ │ Rotate │ │ Recover │
┌──────────┐ │ │ Certs │ │ │
│ Provision│ │ └──────────┘ └──────────┘
└──────────┘ │
│ │
▼ │
┌──────────┐ │
│Deploy K8s│ │
└──────────┘ │
│ │
▼ │
┌──────────┐ │
│Bootstrap │──────────┼──▶ FluxCD reconciling
│ GitOps │ │ (continuous)
└──────────┘ │

When to Use Each Tool

TaskToolPhase
Create cluster from scratchopencenter cluster deployDay-1
Change Helm values for a serviceGit PR to overlayDay-2
Add a new platform serviceGit PR (add Kustomization + source)Day-2
Upgrade Kubernetes versionopencenter cluster upgradeDay-2
Add worker nodesUpdate config → opencenter cluster generate → OpenTofu → KubesprayDay-2
Rotate SOPS keysopencenter secrets rotateDay-2
Investigate driftopencenter cluster driftDay-2
Restore from backupvelero restore createDay-2
Decommission clusteropencenter cluster deploy --destroy or manual teardownEnd of life