qbec uses a 3-way merge patch similar to
kubectl/ksonnet apply. The Kubernetes documentation
describes how this works.
For existing objects, the
qbec diff command produces a diff between the last applied configuration stored
on the server and the current configuration of the object loaded from source. This diff is “clean” in the
sense of the remote object not having additional fields, default values and so on.
It faithfully represents the change between the previous and current version of the object produced from
qbec apply is run, it calculates the patch for existing objects. This calculation does have to account for the
shape of the object as stored by Kubernetes.
In many if not most cases, if
qbec diff does not report a diff for an object,
qbec apply will also
not try to update the object.
This is not always true. Among other things:
the local object may have fields that are never stored on the server and every run of
qbec apply will
attempt to update these extra fields. This is particularly noticeable for custom resources and definitions.
the local object may represent a value differently from how the server stores it. For example a local
CPU resource of
1000m may be stored in the server as
1 instead. Every
qbec apply will notice
this difference and try to update the value back to