Sync Patches
Sync Patches can patch any Kubernetes resource (e.g. Deployments, Secrets, Service Accounts, etc.) during synchronization and right before they are applied to the Kubernetes API server. It can be used to remove sensitive information before being written to the host cluster or the vCluster. It can also add additional information to a resource, such as labels and annotations on all resources belonging to a tenant, for example.
Hook Syntax
Sync Patches consist of hooks that specify Kubernetes resources to patch. You can
specify the resource group, API version, and resource kind and then the verbs for
which API calls to patch. The actual patches can be specified using operations like
add, remove replace and copyFromObject.
To configure sync patches, you can define hooks in the syncer generic sync configuration of the vCluster config.
version: v1beta1
hooks:
  hostToVirtual: []
  virtualToHost: []
# Generic Sync Configs
export: []
import: []
The apiVersion field expects a "group/version" definition of both the resource
group and API version.
The kind field specifies which Kubernetes resources to patch.
The verbs field defines the API calls to patch before application to the Kubernetes
API.
The patches reuse the same syntax as the patches
utilized in generic sync.
version: v1beta1
hooks:
  hostToVirtual:
    - apiVersion: v1
      kind: Pod
      patches:
        - op: add
          path: metadata.annotations
          value:
            import-annotation: from-host-to-virtual
  virtualToHost: []
# Generic Sync Configs
export: []
import: []
Example - Node Info Remover
The example below removes all .status.images and all .metadata.annotations except
the node.alpha.kubernetes.io/ttl annotation, as well as all labels except some
kubernetes.io labels.
version: v1beta1
hooks:
  hostToVirtual:
    - apiVersion: v1
      kind: Node
      verbs: ["update", "patch", "create", "get", "list"]
      patches:
        - op: remove
          path: status.images
        - op: replace
          path: metadata.annotations
          value: {}
        - op: replace
          path: metadata.labels
          value: {}
        - op: copyFromObject
          fromPath: metadata.annotations["node.alpha.kubernetes.io/ttl"]
          path: metadata.annotations["node.alpha.kubernetes.io/ttl"]
        # Add arch labels
        - op: copyFromObject
          fromPath: metadata.labels["kubernetes.io/arch"]
          path: metadata.labels["kubernetes.io/arch"]
        - op: copyFromObject
          fromPath: metadata.labels["kubernetes.io/hostname"]
          path: metadata.labels["kubernetes.io/hostname"]
        - op: copyFromObject
          fromPath: metadata.labels["kubernetes.io/os"]
          path: metadata.labels["kubernetes.io/os"]
        - op: copyFromObject
          fromPath: metadata.labels["beta.kubernetes.io/arch"]
          path: metadata.labels["beta.kubernetes.io/arch"]
        - op: copyFromObject
          fromPath: metadata.labels["beta.kubernetes.io/hostname"]
          path: metadata.labels["beta.kubernetes.io/hostname"]
        - op: copyFromObject
          fromPath: metadata.labels["beta.kubernetes.io/os"]
          path: metadata.labels["beta.kubernetes.io/os"]
  virtualToHost: []
Usage in Pro Helm Chart
When installing vCluster.Pro, make sure to set your generic sync configs in the
sync.generic.config field as string.
For example by either inlining it during helm install/upgrade
helm upgrade [RELEASE_NAME] loft-sh/vcluster -n [RELEASE_NAMESPACE] \
  --create-namespace --install --set pro=true --set sync.generic.config="..."
Or by specifying it in a dedicated values.yaml
sync:
  generic:
   config: |–
     version: v1beta1
     hooks:
       hostToVirtual:
       ...