/sync-operator

🔄 A Kubernetes Operator for syncing resources across namespaces

Primary LanguageGoApache License 2.0Apache-2.0

sync-operator

A operator for syncing any kind of resources across namespaces.

Description

Most operators for syncing between namespaces only allow this for configmaps and secrets (which might also be most of the use-cases), but they won't be able to sync any other resources. So, I got curious about the limitations and started to build sync-operator which can sync all kind of resources. The downside is, that I didn't yet find an easy way for triggering a reconcile when the original resource or one of its replicas get adjusted. Probably, this might be the reason why similar solutions only sync on configmaps ans secrests. As a workaround, you have to set the interval in the SyncObject to match your needs.

Deploy

  • Adjust the sync-operator-object-role ClusterRole according to your needs. By default, it has permissions for all resources. You may want to adjust it to the resources you want to sync.
  • Pin the image version of the operator in the Deployment.
  • Adjust the sample according to the resource you want to sync.

Apply the manifests:

kubectl apply -Rf deploy/

Example

Lets imagine we have the following ConfigMap we want to sync:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-sync
  namespace: default
data:
    key1: value1

When you have installed the CRDs and the Operator succesfully, you can create a SyncObject and reference the ConfigMap from above:

apiVersion: sync.sj14.github.io/v1alpha1
kind: SyncObject
metadata:
  name: syncobject-sample
spec:
  # interval: 1h            # How often to sync the reference resource (defaults to 10h)
  # targetNamespaces:       # Namespaces to replicate the reference into (defaults to all namespaces)
  #   - kube-public
  # ignoreNamespaces:       # Namespaces to not replicate into
  #   - kube-system
  # disableFinalizer: true  # Do not remove replicas when the reference gets removed
  reference:                # Reference which will get replicated into other namespaces
    group: ""               # empty for core group
    version: v1 
    kind: ConfigMap         # case-sensitive!
    name: test-sync
    namespace: default

After applying the manifests, the ConfigMap should get synced across the namespaces.