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 change history is git log; code review is change control. Git is the
record of intent - the cluster's own audit log and the reconciler's sync history still
record what actually happened, including everything git never sees.
oc is for archaeology. git is for change.
Pull, not push - the security inversion
Here the cluster pulls. Push-based delivery exists and is still GitOps to many - this
is the stronger variant, and worth choosing deliberately: no CI system, no laptop, no build
pipeline holds a credential that can touch the cluster, because 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 through git. It
can still push images - which is the other half of why a manifest should name the digest, not
the tag. Hand-edit a live object
and the controller flags it OutOfSync - with selfHeal enabled it puts the object back,
and with prune enabled what leaves git leaves the cluster. Both are opt-in: without
them the reconciler reports the drift and waits for a human. 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 is given its assignment - push-style from the
hub by default, or in a pull model where each cluster runs its own reconciler, which is the
variant this arc teaches. Either way, 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. Commit a plaintext secret and you should treat it as
compromised from that moment: deleting it later does not guarantee it is gone from
history, forks, clones, CI caches or backups. 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