728x90

http://127.0.0.1:53081/user/admin/api didn't respond in 30 seconds

[E 2024-08-14 08:09:37.628 JupyterHub gen:629] Exception in Future <Task finished name='Task-817' coro=<BaseHandler.spawn_single_user.<locals>.finish_user_spawn() done, defined at /usr/local/lib/python3.10/dist-packages/jupyterhub/handlers/base.py:1115> exception=TimeoutError("Server at http://127.0.0.1:53081/user/admin/api didn't respond in 30 seconds")> after timeout
    Traceback (most recent call last):
      File "/usr/local/lib/python3.10/dist-packages/tornado/gen.py", line 624, in error_callback
        future.result()
      File "/usr/local/lib/python3.10/dist-packages/jupyterhub/handlers/base.py", line 1122, in finish_user_spawn
        await spawn_future
      File "/usr/local/lib/python3.10/dist-packages/jupyterhub/user.py", line 1033, in spawn
        await self._wait_up(spawner)
      File "/usr/local/lib/python3.10/dist-packages/jupyterhub/user.py", line 1076, in _wait_up
        raise e
      File "/usr/local/lib/python3.10/dist-packages/jupyterhub/user.py", line 1047, in _wait_up
        resp = await server.wait_up(
      File "/usr/local/lib/python3.10/dist-packages/jupyterhub/utils.py", line 322, in wait_for_http_server
        re = await exponential_backoff(
      File "/usr/local/lib/python3.10/dist-packages/jupyterhub/utils.py", line 265, in exponential_backoff
        raise asyncio.TimeoutError(fail_message)
    asyncio.exceptions.TimeoutError: Server at http://127.0.0.1:53081/user/admin/api didn't respond in 30 seconds

 

 

 Jupyterhub๋ž€?

 jupyer notebook๊ณผ jupyterlab์„ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ ์ค‘๊ณ„์ž ์—ญํ• ์„ ํ•ด์ฃผ๋Š” Hub์ž…๋‹ˆ๋‹ค. Jupyter Notebook์€ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธ์Šค, ๋ฐ์ดํ„ฐ ๋ถ„์„, ๋งˆ์ผ€ํŒ… ๋ถ„์„ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ ์—ฌ๋Ÿฌ ๋ช…์ด ๋™์‹œ์— ๊ฐ™์€ Python kernel์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ  ์ƒ๊ธฐ๋Š” ์˜ค๋ฅ˜๋ฅผ Hub๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Subsystems

JupyterHub๋Š” 4๊ฐœ์˜ ํ•˜์œ„ ์‹œ์Šคํ…œ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • JupyterHub ์˜ ์‹ฌ์žฅ์ธ ํ—ˆ๋ธŒ(tornado process)
  • ํด๋ผ์ด์–ธํŠธ ๋ธŒ๋ผ์šฐ์ €๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜๋Š” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ http ํ”„๋ก์‹œ (node-http-proxy)
  • Spawners๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋‹ค์ค‘ ๋‹จ์ผ ์‚ฌ์šฉ์ž Jupyter ๋…ธํŠธ๋ถ ์„œ๋ฒ„ (Python/IPython/tornado)
  • ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์— ์–ด๋–ป๊ฒŒ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ธ์ฆ ํด๋ž˜์Šค

Jupyterhub https://jupyterhub.readthedocs.io/en/stable/

 

 1. jupyterhub_config.py 

 Jupyterhub์˜ Authenticator ๋ฐฉ์‹(GoogleOauth, Keycloak, Generic etc), host, ip, ๋ฆฌ์†Œ์Šค ๋“ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. 

 

config ํŒŒ์ผ ์ƒ์„ฑ

jupyterhub --generate-config

 

config ํŒŒ์ผ ์ ์šฉ (์ ์šฉ ์‹œ Jupyterhub ์žฌ์‹œ์ž‘ ํ•„์š”)

jupyterhub -f /etc/jupyterhub/jupyterhub_config.py

 

 

2. Jupyterhub Access ๋ฐฉ์‹

 Http Proxy๋กœ ๋“ค์–ด์˜จ ์œ ์ €์˜ ์š”์ฒญ์„ Authenticator๊ฐ€ ์ธํ—ˆ๊ฐ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด ์ตœ์ดˆ ๋กœ๊ทธ์ธ์˜ ๊ฒฝ์šฐ Spawners๊ฐ€ ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ Spawners๋กœ ์ƒ์„ฑ๋œ ์œ ์ €๋Š” ์„œ๋ฒ„์˜ ์œ ์ €์™€ ๋™์ผํ•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

 

 PAM(Pluggable Authentication Module)์€ ์‹œ์Šคํ…œ ๊ณ„์ •์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ ์œ ์ €๋Š” ๋‹น์—ฐํžˆ root๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • jupyter_config.py์— c.Spawner.args = ['--allow-root'] ์ถ”๊ฐ€
  • docker image ์ผ ๊ฒฝ์šฐ --privileged ์˜ต์…˜ ์ถ”๊ฐ€

  Spawner๋กœ ์ƒ์„ฑ๋œ ๊ณ„์ •์€ ๊ฐ์ž ์‹œ์ž‘ dir์˜ ํ•˜์œ„ path๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ถ„๋ฆฌ๋œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ณต์œ  ํด๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌ์„ฑ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


 

 root ๊ถŒํ•œ์„ ๋ถ€์—ฌํ–ˆ์Œ์—๋„ Spawner๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด Proxy API ์š”์ฒญ ์˜ค๋ฅ˜๋ฅผ ์˜์‹ฌํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. user ์ƒ์„ฑ api์— ์š”์ฒญ์— Timeout์ด ๋‚ฌ๋‹ค๋ฉด configurable-http-proxy ๋ชจ๋“ˆ์„ ์žฌ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

https://github.com/jupyterhub/configurable-http-proxy?tab=readme-ov-file#install

 

๋ฐ˜์‘ํ˜•
๋‹คํ–ˆ๋‹ค