어제는 성공한 게 아니었습니다

주피터 허브는 열렸는데 노트북이 열리지 않고  무한 pending에 빠지는 바람에..

 

우선 참고한 문서부터

https://z2jh.jupyter.org/en/latest/jupyterhub/installation.html

https://z2jh.jupyter.org/en/latest/jupyterhub/customization.html

https://github.com/jupyterhub/zero-to-jupyterhub-k8s/blob/main/jupyterhub/values.yaml

트러블슈팅

https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/issues/114
https://stackoverflow.com/questions/50156124/kubernetes-nfs-persistent-volumes-permission-denied

https://docs.run.ai/admin/integration/jupyterhub/

https://discourse.jupyter.org/t/singleuser-pods-stuck-in-pending/6349/11

 

제가 최종 작성한 config.yaml 는 아래와 같습니다.

앞으로 계속 수정이 있을 예정입니다.

정답이 아니고, 수많은 시행착오를 거쳐 수정에 수정을 거듭하여,,

제가 했을 때 이렇게 하니 되더라 ~ 이니 참고'만' 하시고,

나머지는 위의 문서들 보고 입맛대로 작성하시는 편이 좋겠습니다

꿀팁 드리자면 한국어 레퍼런스는 8할이 k3s, 미니큐브, 퍼블릭 클라우드 등

나와는 관계 없는 환경에서 진행한 것들이기에 그냥 스택 오버플로우나 https://discourse.jupyter.org/ 보시는게 좋습니다

proxy:
  secretToken: "<#터미널에서 openssl rand -hex 32의 결과를 여기에 복붙#>"
  service:
    nodePorts:
      http: 30360 # 임의 지정
    loadBalancerIP: 192.168.0.100 # 임의 지정

ingress:
  enabled: true

cull:
  enabled: true
  timeout: 3600
  every: 300

singleuser:
  cmd: ["jupyterhub-singleuser"]
  profileList:
  - display_name: "선택할 프로필"
    description: "에 대한 설명"
    default: true

  memory:
    limit: 
    guarantee: 1G
  cpu:
    limit:
    guarantee: 0.5
  storage:
    homeMountPath: /home/{username}
    dynamic:
      storageClass: nfs-client
      storageAccessModes: [ReadWriteMany]
    capacity: 100Gi

  extraFiles:
    jupyter_notebook_config.json:
      mountPath: /etc/jupyter/jupyter_notebook_config.json
      data:
        MappingKernelManager:
          cull_idle_timeout: 1800
          cull_interval: 600
          cull_connected: false
          cull_busy: false

scheduling:
  userScheduler:
    enabled: false

hub:
  service:
    type: ClusterIP
  config:
    JupyterHub:
      admin_access: true
      admin_users:
      - cslab
      
debug:
  enabled: true

설치 과정은 위의 공식 문서와 동일하게

helm upgrade --cleanup-on-fail \
  --install jupyter jupyterhub/jupyterhub \
  --namespace jupyter \ # 미리 namespace를 만들어 두시거나, create 옵션을 넣어주시기 바랍니다
  --version=1.2.0 \ # 2.0.0은 알 수 없는 오류가 많아서 1.2.0으로 돌아왔습니다
  --values config.yaml # 위에서 작성한 config.yaml, 해당 디렉토리에서 설치 수행해야 함

helm 차트를 사용합니다.

 

이상입니다. 간단합니다

이러고 나서

kubectl get svc -n jupyter

로 proxy-public의 EXTERNAL IP, port를 확인하여 접속하시면 되는데

그렇게 간단할 리가 없겠죠 ?

 

제가 겪었던 문제들을 읊어보도록 하겠습니다.

 

PVC가 bound 되지 않는 문제

저는 마스터가 아닌 노드에서 NFS 서버를 열어 그곳을 저장소로 사용하였는데

PVC가 바운딩 되지 않는 문제가 발생하였습니다.

위의 helm 명령어를 실행하면 자동으로 생성되는 PVC를

kubectl delete pvc hub-db-dir -n jupyter

로 지워버리고

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    meta.helm.sh/release-name: jupyterhub
    meta.helm.sh/release-namespace: jhub
  labels:
    app: jupyterhub
    app.kubernetes.io/managed-by: Helm
    chart: jupyterhub-1.2.0
    component: hub
    heritage: Helm
    release: jupyterhub
  name: hub-db-dir
  namespace: jupyter
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs-client
  volumeMode: Filesystem

위와 같이 pvc.yaml을 작성하여

kubectl apply -f pvc.yaml -n jupyter

PVC를 새로 만들어 주었습니다.

 

만약 PVC를 생성하였는데도 문제가 발생한다면

kubectl get sc -A

를 찍어보시고 storageclass가 있는지, pvc에 할당이 되어있는지 확인하시기 바랍니다.

 

동적 프로비저닝을 사용하였는데 이 부분도 추후에 수정하겠습니다.

 

외부 접속이 되지 않을 때

config.yaml의 ingress.enabled를 true로 고쳐보시기 바랍니다

 

허브가 열리지만 user pod이 pending에서 머무르다가 Timeout 될 경우

config.yaml의 scheduling.userScheduler:enabled 를 false로 바꿔보시기 바랍니다

 

위의 오류들과 트러블슈팅에  사용한 문서 이외에도 수정한 사항이 굉장히 많습니다.

시도해본 것이 너무 많아 모두 정리하지 못해 아직 부족합니다.

이후에 메모해둔 것들과 기억나는 것을 모두 종합해서 글 수정하도록 하겠습니다.

 

다음 시간에는 스파크와 GPU 연산을 해보겠습니다.

감사합니다

+ Recent posts