What is the fundamental difference between modifying your k8s deployment to point to a new tag and your solution?
You can easily roll back (except with database migrations) and easily see what version is deployed when.
You're also only modifying a single piece of your whole state at any given time, meaning that if you have the services A and B and their deployment pipelines independently modify state - you have nothing that declares any relationship between which versions of these should be deployed together.
There's a little piece of infrastructure wisdom I've learned over the years, I refer to it sometimes as "tazjin's law":
Any infrastructure component not controlled by a reconciliation process will eventually fail.
Versions of dependent components will get out of sync, configuration is being deployed independently of the application, and so on.
In order to reconcile your current state with your desired state you must know what your desired state is.
Does that explain it?
Our Kontemplate repository contains the state of an entire cluster, including all versions and all configuration.
A tag value is a single piece of mutable data that is in no relation to the other relevant data.
Still don't see any advantage to justify the additional complexity in your system.
I find it more complex to try and keep track of remote state modifications than to have a single source of truth, but whatever floats your boat ;-)
This predates infra-as-code.. it took years before someone wrote a clone that used Git instead of CVS
Made something stupidly similar for kubernetes: https://github.com/pieterlange/kube-backup
In addition its design (with warts like the separate versioning layer of charts) adds complexity that I don't think is necessary for most use-cases.
In traditional deployments that may be some kind of "copy this thing over SSH and make it go!", in Kubernetes-land it's more like "lets just modify this API-state to point at the new image tag!".
Neither of those produce a consistent record of changes applied and state mutation like that is very error-prone.
We actually use Gitlab's CI at work, but we have our own deployment solutions built on it that end up making git commits into the NixOS & Kontemplate repositories which then run their own pipelines to deploy.
This way we can always answer the question "what set of applications at which versions was deployed at $time?" and also roll back consistently.