219 views
--- title: JupyterHub on PLMshift langs: en-us type: slide slideOptions: theme: simple transition: fade tags: Mathrice, plmshift --- # JupyterHub on PLMshift Pierre Navaro - Scientific computing engineer [CNRS-IRMAR](https://irmar.univ-rennes.fr)-[Groupe Calcul](https://calcul.math.cnrs.fr) Paris, 16th November 2023. https://codimd.math.cnrs.fr/s/9CGY_3hr0 --- ## Warning *This material will serve as a guideline for my talk but does not constitute documentation. To build your application, you should use the most recent version of the documentation edited by the PLM team.* https://plmshift.pages.math.cnrs.fr/ --- <!-- .slide: style="text-align: left;"> --> ## Why me ? - Nice recommendation from Mathrice people. - One of the first external user of the platform. - Need to run a beta version of the python package [fdasrsf](https://fdasrsf-python.readthedocs.io/en/latest/). - I needed to make a demo for an industrial partner with limited access to digital resources. - [GitHub+Binder](https://binderhub.readthedocs.io/en/latest/) solution was not possible because the data had to remain confidential. - Exposing web services outside the network of the University of Rennes is very complicated or even impossible... --- <!-- .slide: style="text-align: left;"> --> ## PLMshift - Allows to provision, instantiate, run, and manage web applications, without the complexity of building and maintaining the infrastructure. - No need to configure and administer an OS. - Define your resources and the system makes them available. - An application is a web-based service that uses CPU and RAM: Website (static or CMS), R shiny application, Jupyter notebooks... --- <!-- .slide: style="text-align: left;"> --> ### Glossary - **Project**: used to group and isolate related applications and manage user access. - **Applications**: service created from templates, files, images, ... --- <!-- .slide: style="text-align: left;"> --> - **Build configuration**: parameters of your application. - **Builds**: process of transforming input parameters into a resulting object. - **Deployment**: management of the life cycle of an application. - **Pods**: provide the runtime environments - **Routes**: exposes a service at a host name. --- <!-- .slide: style="text-align: left;"> --> ### How to deploy your application - Configure your application from a catalog with a graphical interface on the web. - With a description file (yaml or json format) - With Helm3 (did not try) [OKD docs: Building applications overview](https://docs.okd.io/4.9/applications/index.html) [PLM docs: Déploiement d’applications sur PLMshift](https://indico.math.cnrs.fr/event/4309/contributions/3521/attachments/2272/2750/PLMshift_pour_le_chercheur.pdf) --- <!-- .slide: style="text-align: left;"> --> ### Deploy from the catalog - Connect to https://plmshift.math.cnrs.fr - Select the `Developer` mode - Create a project with `+Add` - Create an application with `Add to Project` - Use `Developer Catalog` to find your application - Left Menu -> Project -> Overview -> Route - Go to <https://app-project.apps.math.cnrs.fr> --- <!-- .slide: style="text-align: left;"> --> ### Deploy with openshift CLI - Download from https://plmshift.math.cnrs.fr/command-line-tools or on MacOS ```bash brew install openshift-cli ``` - Get your token by clicking on your name (top-right) and select `Copy login command` ```bash oc login --token=xxx --server=https://api.math.cnrs.fr:6443 --- <!-- .slide: style="text-align: left;"> --> ## Simple Notebook ```bash oc new-project myproject # create new project oc project myproject # switch to this project # display parameters oc process --parameters notebook-deployer -n openshift # instantiate your notebook oc new-app notebook-deployer \ -p APPLICATION_NAME=<NotebookName> \ -p NOTEBOOK_PASSWORD=<StrongPassword> # Get the deployment name oc get dc # Display logs oc logs -f dc/<NotebookName> ``` --- ## Deploy a JupyterHub server --- <!-- .slide: style="text-align: left;"> --> ### Deploy JupyterHub from catalog - Select or create a project - Create an app using **JupyterHub on PLMshift** - Follow instructions --- <!-- .slide: style="text-align: left;"> --> ### Deploy JupyterHub with CLI ```bash oc process --parameters jupyterhub-odh -n openshift oc new-app jupyterhub-odh \ -p APPLICATION_NAME=monjupyterhub \ -p JUPYTERHUB_HOST=monjupyterhub.apps.math.cnrs.fr oc edit kfdef ``` To change the default editor ``` env EDITOR=nano oc edit kfdef ``` --- <!-- .slide: style="text-align: left;"> --> ### Enable GPU ```yaml - kustomizeConfig: overlays: - storage-class - plm parameters: ... - name: gpu_enabled value: 'true' repoRef: name: manifests path: jupyterhub/jupyterhub ``` --- <!-- .slide: style="text-align: left;"> --> ### Make GPU kernels available ```yaml - kustomizeConfig: overlays: ... - cuda-plmshift repoRef: name: manifests path: jupyterhub/notebook-images name: notebook-images ``` --- <!-- .slide: style="text-align: left;"> --> ### Custom kernel - Fork https://plmlab.math.cnrs.fr/plmshift/notebook-example - Change the `requirements.txt` file to add your dependencies - Example: add a kernel with [dask](https://docs.dask.org/en/stable/) ``` dask graphviz pandas ``` --- <!-- .slide: style="text-align: left;"> --> - `Catalog -> Notebook Builder on PLMshift` + Set name: `dask` + Set repository url ending with `.git` + Set description: `Dask kernel` + Set project, leave empty to link with your current project + `dask` should appear on your jupyterhub home page --- <!-- .slide: style="text-align: left;"> --> ### Custom kernel with command line ```bash oc new-app --list # get list of kernels # display parameters oc process --parameters notebook-builder-odh -n openshift oc new-app notebook-builder-odh \ -p NOTEBOOK_NAME=dask-kernel \ -p NOTEBOOK_REPO_URL=https://plmlab.math.cnrs.fr/navaro/notebook-example.git \ -p NOTEBOOK_DESC="kernel with dask" ``` --- <!-- .slide: style="text-align: left;"> --> ### Rebuild your kernel - Change the requirements and push to the git repository ```bash oc get bc oc start-build bc/<BuildConfigName> oc logs -f bc/<BuildConfigName> ``` - Change parameters ```bash oc edit bc/<BuildConfigName> oc start-build bc/<BuildConfigName> oc logs -f bc/<BuildConfigName> ``` --- <!-- .slide: style="text-align: left;"> --> ### Configuration change triggers - Create a webhook ```bash oc set triggers bc/<BuildConfigName> --from-gitlab ``` - Copy the webhook url with secret in console `Builds -> Build Configs -> Build Config Details` --- <!-- .slide: style="text-align: left;"> --> - Create the webhook on gitlab in `Settings -> Webhooks -> URL` - Enable `Trigger -> Push events` and `Test` ! ```bash oc get bc oc describe bc/<BuildConfigName> oc logs -f build/<BuildName> ``` --- <!-- .slide: style="text-align: left;"> --> ### Private repository - Get an Access Token on PLMlab: `Settings -> Access Tokens` - Give a value to the `Token name`, check `read_repository` and click on `Create project access token`. - Save values of `Token name` and `Secret` because you will not be able to access it afterwards. --- <!-- .slide: style="text-align: left;"> --> Create the secret ```bash oc create secret generic <SecretName> \ --from-literal=username=<TokenName> \ --from-literal=password=<Token> \ --type=kubernetes.io/basic-auth ``` Build your application ```bash oc get bc oc set build-secret --source bc/<BuildConfig> <SecretName> oc start-build bc/<BuildConfig> ``` --- <!-- .slide: style="text-align: left;"> --> #### PLMshift web console - Go to the PLMShift console, select your project `Secrets -> Create -> Source Secret tab` - For`Authentication Type` select`Basic Authentication` - Enter the `<UserName>` and `<TokenName>` in the corresponding fields - Click on the `Create` button - Then add the secret in the Build Config (the command via `oc` is recommended for this action) --- ## Useful commands --- <!-- .slide: style="text-align: left;"> --> ### Manage your application - List the projects ```bash oc projects ``` - Switch to another project ```bash oc project <projectname> ``` - Remove an app ```bash oc delete all --selector app=myapp ``` --- <!-- .slide: style="text-align: left;"> --> - Re-deploy an app ```bash oc get dc oc rollout latest dc/<name> ``` - Display log ```bash oc logs -f dc/<name> ``` --- <!-- .slide: style="text-align: left;"> --> - Routes to your applications ```bash oc get route ``` - Build configurations ```bash oc get bc ``` --- <!-- .slide: style="text-align: left;"> --> - Running pods ```bash oc get pods ``` - Log to the pod ```bash oc rsh <podname> ``` - Copy files on the pod ```bash oc rsync mypod:dir/file oc cp mypod:dir/file ``` --- <!-- .slide: style="text-align: left;"> --> ### Performing and configuring builds ```bash oc status # do it as much as you want oc get bc # get list oc start-build <BuildConfigName> --follow # start and display logs oc cancel-build <BuildName> # cancel one build oc cancel-build bc/<BuildConfigName> # cancel all builds from a config oc delete bc <BuildConfigName> # delete build config oc describe build <BuildName> # build details oc logs -f bc/<BuildConfigName> # accessing logs oc edit bc/<BuildConfigName> # edit config ``` --- <!-- .slide: style="text-align: left;"> --> ## Install jupyterhub on your own server - https://tljh.jupyter.org/en/latest/install/custom-server.html --- <!-- .slide: style="text-align: left;"> --> ### Pre-requisites - Some familiarity with the command line. - A server running Ubuntu > 18.04 where you have root access. - At least 1GB of RAM on your server. - Ability to ssh into the server & run commands from the prompt. - An IP address where the server can be reached from the browsers of your target audience. --- <!-- .slide: style="text-align: left;"> --> ### Add kernel install packages using a terminal with ```bash sudo -E conda install -c conda-forge numpy \ scipy scikit-learn pandas ```` and new kernels. ```bash sudo -E conda create -y python=3.9 -n py39 sudo -E conda install ipykernel dask -n py39 sudo -E conda run -n py39 \ python -m ipykernel install --name python3.9 ``` --- <!-- .slide: style="text-align: left;"> --> ## Deploy R shiny app - fork https://plmlab.math.cnrs.fr/plmshift/shiny-custom - In `ShinyApps` directory, change `ui.R` and `server.R` - Update `requirements.txt` with R packages dependencies list. - Create an plmshift application with `Shiny R Application Server` template - Don't forget to end with `.git` when you set the url of your repository. --- ## References --- <!-- .slide: style="text-align: left;"> --> ### PLM-team - [PLMshift: Documentation](https://plmshift.pages.math.cnrs.fr) - [PLMshift: Deploy JupyterHub](https://plmshift.pages.math.cnrs.fr/exemples_de_deploiement/notebook_jupyter/jupyterhub/) - [PLMshift: Deploy a simple notebook](https://plmshift.pages.math.cnrs.fr/exemples_de_deploiement/notebook_jupyter/notebook/) - [PLMshift: Deploy a notebook with dependencies](https://plmshift.pages.math.cnrs.fr/exemples_de_deploiement/notebook_jupyter/notebook_custom/) - [PLMshift: Use PLMShift with a private repository](https://plmshift.pages.math.cnrs.fr/Foire_aux_Questions/acces_depot_prive/) - [Talk: Présentation de l'offre PaaS PLMshift dont les Notebooks Jupyter](https://indico.math.cnrs.fr/event/6772/contributions/5842/attachments/3109/4160/plmshift_et_gpu.pdf) - [Talk: Anatomie d'une application openshift](https://indico.math.cnrs.fr/event/4309/contributions/3521/attachments/2272/2750/PLMshift_pour_le_chercheur.pdf) https://mattermost.math.cnrs.fr/plm-support/channels/plmshift --- <!-- .slide: style="text-align: left;"> --> ### OKD Docs - [docs.okd.io : Applications](https://docs.okd.io/latest/applications/index.html) - [docs.okd.io : Source clone secrets](https://docs.okd.io/latest/cicd/builds/creating-build-inputs.html#builds-adding-source-clone-secrets_creating-build-inputs) - [docs.okd.io : Triggering builds](https://docs.okd.io/latest/cicd/builds/triggering-builds-build-hooks.html#builds-configuration-change-triggers_triggering-builds-build-hooks) ### The Littlest JupyterHub https://tljh.jupyter.org/en/latest/ --- Questions ?