Kubernetes/삽질

[k8s/helm] JupyterHub kubespawner 사용자 별 volume 설정

비번변경 2023. 5. 12. 03:02

개요

최근 kubernetes 버전을 1.21에서 1.24로 업그레이드를 진행하게 되면서 쿠버네티스 환경에서 동작하고 있던 helm chart의 업그레이드가 필요해졌다. 관련해서 업그레이드가 필요한 helm chart 중 하나가 JupyterHub였는데, 작업 중 singleuser notebook server 스폰 시 volume 설정 방법을 변경하게 되어 적어둔다.

 

우선 jupyterhub는 다음과 같은 방식으로 사용 중이다.

- kubernetes 환경에서 동작한다.

- singleuser server를 spawn 하여 사용한다.

- spawn 할 수 있는 여러 profile을 지원한다.

- singleuser server는 사용자 별 홈 디렉터리와 nas mount가 필요하다.

 

 

기존 설정

기존 환경에서 사용하던 Jupyterhub helm chart 정보와 singleuser server volume 설정은 다음과 같다.

 

사용 helm chart 정보

- repository : https://jupyterhub.github.io/helm-chart/

- name: jupyterhub

- version: 0.8.2

 

singleuser server volume 설정

singleuser:
  profileList:
    - display_name: "notebook_1"
      kubespawner_override:
      	image: jupyter/datascience-notebook:2343e33dec46
        volume_mounts:
        - name: nas001
          mountPath: /nas001
        - name: volume-{username}
          mountPath: /home/jovyan
        volumes:
        - name: nas001
          persistentVolumeClaim:
            claimName: claim-nas001
        - name: volume-{username}
          persistentVolumeClaim:
            claimName: claim-{username}

 

spawn한 서버 volume 정보

 

 

신규 설정

먼저 kubernetes 1.24 버전에서 사용할 jupyterhub helm chart 정보는 아래와 같다.

 

사용 helm chart 정보

- repository : https://jupyterhub.github.io/helm-chart/

- name: jupyterhub

- version: 1.1.4

 

기존에는 singleuser.profileList.kubespawner_override에서 volumes와 volume_mounts를 설정했는데, profileList 설정을 kubespawner profilelist으로 변경하려고 한다. kubespawner은 hub.extraConfig에 정의된다. hub.extraConfig 내 설정은 Python 소스로 취급하면 된다.

💡
JupyterHub와 authenticators, spawner와 같은 구성 요소는 traitlets를 통해 설정을 노출하는 Python 클래스이다. Helm Chart 구성 설정 중 hub.config를 사용하면 정적 yaml 값을 이용해 구성할 수 있다.
동적으로 설정할 때는 hub.extraConfig를 사용해야 한다.
hub:
  extraConfig:
    myConfig: |
        c.KubeSpawner.profile_list = [
            {
                'display_name': 'notebook_1',
                'kubespawner_override': {
                    'image': 'jupyter/datascience-notebook:2343e33dec46',
                    'volume_mounts': [
                        {
                            'name': 'nas001',
                            'mountPath': '/nas001'
                        },
                        {
                            'name': f'volume-{{username}}',
                            'mountPath': '/home/jovyan'
                         }
                    ],
                    'volumes': [
                        {
                            'name': 'nas001',
                            'persistentVolumeClaim': {
                                'claimName': 'claim-nas001'
                            }
                        },
                        {
                            'name': f'volume-{{username}}',
                            'persistentVolumeClaim': {
                                'claimName': f'claim-{{username}}'
                            }
                        }
                    ],
                }
            },
        ]

 

 

+ 추가로 확인할 부분 🤔

KubeSpawner.volume_mounts나 volumes 구성에서 {username}, {userid}, {servername}, {hubnamespace}, {unescaped_username}, {unescaped_servername}이 문자열에 포함되어 있으면 자동으로 확장한다고 한다.

현재 신규 설정 중 volume과 pvc 이름을 보면 중괄호를 excape 한 f-string으로 처리한 것을 알 수 있는데, c.KubeSpawner.profile_list를 단순히 출력하면 아래와 같다.

[
  {
    'display_name': 'notebook_1',
    'kubespawner_override': {
      'image': 'jupyter/datascience-notebook:2343e33dec46',
      'volume_mounts': [
        {
          'name': 'nas001',
          'mountPath': '/nas001'
        },
        {
          'name': 'volume-{username}',
          'mountPath': '/home/jovyan'
        }
      ],
      'volumes': [
        {
          'name': 'nas001',
          'persistentVolumeClaim': {
            'claimName': 'claim-nas001'
          }
        },
        {
          'name': 'volume-{username}',
          'persistentVolumeClaim': {
            'claimName': 'claim-{username}'
          }
        }
      ]
    }
  }
]

테스트할 때는 인지하지 못했는데 아무래도 c.KubeSpawner.profile_list 초기화 시 f-string을 사용하지 않아도 될 것 같다. 이 부분은 확인이 필요하다.

 

 

참고 문서

https://jupyterhub-kubespawner.readthedocs.io/en/latest/spawner.html

https://z2jh.jupyter.org/en/latest/resources/reference.html#hub-config

https://jupyterhub-kubespawner.readthedocs.io/en/latest/spawner.html#kubespawner.KubeSpawner.profile_list