본문 바로가기
AI 빅데이터/Google Cloud Platform

[GCP] GKE에 Jupyter Notebook 운영하고 GitHub로 사용자 관리

by 마고커 2020. 7. 29.


Jupyter Notebook은 로컬 환경이나 클라우드 환경에서 VM에 설치하여 많이 이용된다. 기업차원에서 이용한다면 매 사용자마다 노트북을 설치하는 것보다 쿠버네티스 환경에 Jupyter Notebook을 설치하고 여러 사용자가 이를 이용할 수 있다면 효율성을 높일 수 있다. 즉, 쿠버네티스 환경에서 Multi Tenant로 Jupyter Notebook을 이용하게 되는 것이다.

 

Jupyter Notebook은 Multi Tenant를 위해 Jupyter Hub를 개발하였으며, 쿠버네티스 환경에서의 운영을 위해 아래와 같은 가이드도 제공하고 있다. 

 

 

Setup Kubernetes — Zero to JupyterHub with Kubernetes 0.0.1-set.by.chartpress documentation

 

zero-to-jupyterhub.readthedocs.io

크게 1) 쿠버네티스 설정, 2) Jupyter Hub 설정, 3) 사용 개인화(customization)로 나뉜다. 

 

1) 쿠버네티스 설정

 

쿠버네티스 설정은 Cluster를 만드는 과정이다. 테스트는 GKE를 활용했는데, 클러스터를 만들 수 있는 어떤 환경에서 적용해도 이용 가능하다. Jupyter Notebook 자체가 차지하는 메모리가 있기 때문에 노드의 메모리는 8G 이상으로 해 주는게 좋을 듯 하다.

 

여기서는 4개의 노드를 사용했고, Autoscaling을 적용하여 노드에 부하가 차면 다른 노드로 부하를 자동으로 이동할 수 있도록 하였다. 기본적으로 0.07CPU 정도가 프로메테우스 등 모니터링 및 관리 도구들을 위해 사용된다. 

 

2) Jupyter Hub 설정

 

쿠버네티스 클러스터를 만든 후에는 Jupyter Hub를 클러스터에 Helm을 통해 설치한다. 우선 Helm을 설치하고 Initialize 해 준다.

 

// Helm 가져오기
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash

// helm의 서버 tiller를 접근할 수 있는 계정 생성
kubectl --namespace kube-system create serviceaccount tiller

// tiller에 admin 권한 부여
kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller

// helm 초기화
helm init --service-account tiller --history-max 100 --wait

// helm 설치 확인
helm version

 

설치 확인 결과가 아래와 같이 나왔다면 완료된 것이다.

 

Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}

 

JupyterHub의 설정은 config.yaml 파일을 통해 이루어진다. 쿠버네티스 클러스터 내 설치를 위해 인증 토큰을 생성하여 적어준다.

 

// random 코드 생성
openssl rand -hex 32

// 생성된 코드를 config.yaml 안에 아래 형식으로 추가
proxy:
  secretToken: "<RANDOM_HEX>"

 

이제 helm을 통해 Jupyter Hub를 설치해 주면 된다.

 

// helm repo 가져오기
helm repo add jupyterhub https://jupyterhub.github.io/helm-chart/
helm repo update

RELEASE=jhub
NAMESPACE=jhub

// jupyter hub를 config.yaml에 정의된 대로 설치
helm upgrade --install $RELEASE jupyterhub/jupyterhub \
  --namespace $NAMESPACE  \
  --version=0.9.0 \
  --values config.yaml

 

설치가 끝났으면 kubectl로 service의 end point를 확인하여 접근해 본다.

 

$ kubectl get service --namespace jhub
NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
hub            ClusterIP      10.44.5.193   <none>        8081/TCP                     83s
proxy-api      ClusterIP      10.44.0.223   <none>        8001/TCP                     83s
proxy-public   LoadBalancer   10.44.8.179   34.64.75.13   443:32105/TCP,80:30587/TCP   83s

 

proxy-public의 external-ip를 브라우저에서 입력하면  jupyter notebook 화면을 볼 수 있다.

 

일단 아무 계정과 암호를 입력하면 Jupyter Notebook에 접근하게 된다.

 

3) Customize - GitHub을 통한 Log-in

 

멀티 테넌트라고는 하지만 위까지는 별도의 계정인증 설정 과정이 없었다. Jupyter Hub는 OAuth를 통해 GitHub나 Google Login으로 인증을 수행할 수 있다. GitHub내 특정 그룹에 속한 사용자들을 모두 수용하고자 한다면, GitHub에서 그룹 기능을 사용하면 된다. 

 

상단의 '+' 버튼을 누르면 'New Organization'을 생성할 수 있고, Free로 Organization을 만든 후 사용자들을 초대하면 된다. 생성된 Organization으로 이동해서  아래와 같이 settings -> developer settings -> OAuth Apps로 가서 새로운 OAuth App을 등록한다고 선택한 후, 아래와 같은 화면 나오면 ClientID와 Client Secret을 우선 복사해 둔다. 

HomePage URL은 Jupyter Hub가 설치된 URL이고 Call Back URL에서 Home Page URL에 '/hub/oauth_callback'을 붙여 저장한다.

 

GitHub쪽 설정은 끝났고, Jupyter Hub에서는 전에 이야기 한대로 config.yaml을 변경해 준다. 

 

proxy:
    secretToken: "14097825b454aebf48557ae7915ea58f9b3acd44879d80271f652aa556317791"
auth:
    type: github
    github:
        clientId: "6c497b33b0df587fb836"
        clientSecret: "996814b23d4dbf12e3b5b1f091119eadbc724cf3"
        callbackUrl: "http://34.64.123.196/hub/oauth_callback"
        orgWhiteList:
          - "<<GitHub에서 생성한 그룹의 이름>>"
    scope:
      - "read:user"
singleuser:
    defaultUrl: "/lab"

 

저장해 두었던 ID와 Secret을 위와 같이 정해주고 Callback 주소와 Organization 이름을 적어준 다음에 전에 수행했던 아래의 명령어를 한번 더 실행하여 설정을 반영한다.

 

helm upgrade --install $RELEASE jupyterhub/jupyterhub \
  --namespace $NAMESPACE  \
  --version=0.9.0 \
  --values config.yaml

 

설정이 완료된 후, 브라우저에서 접속하면 아래와 같이 Organization에 속한 GitHub 계정으로 Log-in이 가능하다.

 

 

마지막으로 Jupyter Hub를 사용하지 못할 환경이 되어 삭제해야 한다면 아래의 명령으로 삭제할 수 있다.

 

// helm으로 설치한 release 삭제. 여기서는 jhub
helm delete <YOUR-HELM-RELEASE-NAME> --purge

// kubernetes namespace 삭제
// 이것을 해주면, Jupyter Hub에서 만든 데이터나 IP 주소 등 모든 것이 삭제됨
kubectl delete namespace <YOUR-NAMESPACE>


댓글