개요
최근 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