GoogleCloudPlatform / metacontroller

Lightweight Kubernetes controllers as a service
https://metacontroller.app/
Apache License 2.0
792 stars 105 forks source link

Running Voyager Ingress metacontroller fails, because of the need to reconcile internal resources of Voyager #151

Open moredure opened 5 years ago

moredure commented 5 years ago

When running other resources managed by another operator (Voyager) via metacontroller, he tries to reconcile state of internal resources of Voyager (service, etc.).

enisoc commented 5 years ago

Sorry, I don't understand. Can you give a code snippet or log entries to show what you're trying to do, and what the resulting behavior is?

moredure commented 5 years ago

So, I has

childResources:
    - apiVersion: v1
      resource: pods
    - apiVersion: v1
      resource: persistentvolumeclaims
    - apiVersion: voyager.for.example
      resource: ingress
    - apiVersion: v1
      resource: services
      updateStrategy:
        method: InPlace

When I try to utilise ingress, it create additional resources (Voyager Operator creates it: services, pods, etc) and looks like metacontroller tries to reconcile them. But I expect Voyager Ingress resource to be black box and not expose underling resources to metacontroller, can it be avoided somehow, I don't want to manage voyager resources in my metacontroller instance? Because of that Voyager fails to infinite loop of reconciling, my sync hook not expects to be voyager resources in desired childs.

enisoc commented 5 years ago

It sounds like the Voyager Operator is not adding ControllerRef to the objects it creates. That's an important rule that controllers need to follow in order to maintain the "black box" isolation you mentioned.

If it's not possible for you to fix the Voyager Operator (e.g. you didn't write it), one way you might be able to work around this is to make sure that the label selector for the parent object in your controller does not match the objects created by the Voyager Operator.