Service exposition with ListenerClasses

The operator deploys a Listener for each DataNode and NameNode pod. They both default to only being accessible from within the Kubernetes cluster, but this can be changed by setting .spec.{data,name}Nodes.config.listenerClass.

The cluster can be configured to be accessible from outside of Kubernetes like this:

spec:
  dataNodes:
    config:
      listenerClass: external-unstable (1)
  nameNodes:
    config:
      listenerClass: external-stable (2)
1 DataNode listeners should prioritize having a direct connection, to minimize network transfer overhead.
2 NameNode listeners should prioritize having a stable address, since they will be baked into the client configuration.