A version of this has been asked and answered before, but the key bit of infomration needed to get a precise answer for JupyterHub is:
- which Spawner is being used
- who is creating the envs, and
- when are envs created
In general, the short answer for making an environment available as a kernel is to run:
/path/to/env-name/bin/ipython-kernel install --prefix /path/to/singleuser-server-env --name env-name
for each env and make sure that all users have sufficient permission (read+execute) in the env. But this will look a little different if you are using containers (e.g. KubeSpawner) where this is done in the image vs multiple system users on a shared system (e.g. the default Spawner or systemd).