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. |