The loop you already know, one level up
C-II taught the reconciliation loop: desired versus actual, fix the difference, repeat.
ArgoCD is the same habit applied to delivery. An Application names a repo, a path and a
revision - watch this branch of this repository - and the controller renders what it finds
there, compares it against the live cluster, and syncs the difference. The deploy button is a
git commit; the audit log is git log; code review is change control.
oc apply is for archaeology, not for change.
Pull, not push - the security inversion
The cluster pulls. No CI system, no laptop, no build pipeline holds a credential that
can touch it - the agent inside holds a read-only deploy key, and the trust arrow points out.
Compromise the build system and you can propose a change, which is visible; you cannot reach
into production. Hand-edit a live object and the controller flags it OutOfSync - selfHeal puts
it back, and what leaves git leaves the cluster. Rollback is git revert,
which is why commit hygiene is an operational skill.
Field note. Fighting the reconciler over SSH is arm-wrestling a
machine that does not get tired - C-II's warning, now with a face. The fix is always
upstream, in git.
At fleet scale, the label is the deploy button
Run many OpenShift clusters under a hub - RHACM, with edge clusters arriving through
zero-touch provisioning - and nobody applies apps to clusters by hand. Each app carries a
Placement that selects cluster labels; the hub matches placements against the
labels a cluster wears, and the chosen cluster pulls its assignment. Labelling the cluster
is the deploy action: attach the label and the app follows, remove it and the app
leaves. The same pull model as above, one level bigger - a cluster's labels are its
entitlements, reconciled like everything else.
Label the cluster; the app follows.
The one thing git never holds
Git holds everything except secrets - a secret in git is published, forever, to everyone who
ever clones. So the pattern splits the reference from the value: git carries an ExternalSecret
naming a logical key; a vault - Azure Key Vault in the worked example - holds the value;
an operator inside the cluster exchanges one for the other at runtime. Rotation happens in the
vault, never as a commit. That is why the vault floats apart in the scene above: it is never
absorbed into the pipeline.
Git holds the shape of the secret. The vault holds the secret.
Delivery stops being an event and becomes a property: the cluster is always
converging on what the repository says. "Who deployed this?" becomes "who merged this?" - and
that question always has an answer.
Pre-reads: C-II ·
Kubernetes concepts ·
git + pull requests
Further: Argo CD ·
OpenShift GitOps ·
External Secrets ·
Azure Key Vault