151 lines
4.7 KiB
Markdown
151 lines
4.7 KiB
Markdown
# Notebook Controller
|
|
|
|
The controller allows users to create a custom resource "Notebook" (jupyter
|
|
notebook).
|
|
|
|
It has been developed using **Golang** and
|
|
**[Kubebuilder](https://book.kubebuilder.io/quick-start.html)**.
|
|
|
|
## Spec
|
|
|
|
The user needs to specify the PodSpec for the Jupyter notebook.
|
|
For example:
|
|
|
|
```yaml
|
|
apiVersion: kubeflow.org/v1
|
|
kind: Notebook
|
|
metadata:
|
|
name: my-notebook
|
|
spec:
|
|
template:
|
|
spec:
|
|
containers:
|
|
- name: my-notebook
|
|
image: kubeflownotebookswg/jupyter:master
|
|
args:
|
|
[
|
|
"start.sh",
|
|
"lab",
|
|
"--LabApp.token=''",
|
|
"--LabApp.allow_remote_access='True'",
|
|
"--LabApp.allow_root='True'",
|
|
"--LabApp.ip='*'",
|
|
"--LabApp.base_url=/test/my-notebook/",
|
|
"--port=8888",
|
|
"--no-browser",
|
|
]
|
|
```
|
|
|
|
The required fields are `containers[0].image` and (`containers[0].command` and/or `containers[0].args`).
|
|
That is, the user should specify what and how to run.
|
|
|
|
All other fields will be filled in with default value if not specified.
|
|
|
|
## Environment parameters
|
|
|Parameter | Description |
|
|
| --- | --- |
|
|
|ADD_FSGROUP| If the value is true or unset, fsGroup: 100 will be included in the pod's security context. If this value is present and set to false, it will suppress the automatic addition of fsGroup: 100 to the security context of the pod.|
|
|
|DEV| If the value is false or unset, then the default implementation of the Notebook Controller will be used. If the admins want to use a custom implementation from their local machine, they should set this value to true.|
|
|
|
|
|
|
|
|
## Commandline parameters
|
|
|
|
`metrics-addr`: The address the metric endpoint binds to. The default value is `:8080`.
|
|
|
|
`probe-addr`: The address the health endpoint binds to. The default value is `:8081`.
|
|
|
|
`enable-leader-election`: Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager. The default value is `false`.
|
|
|
|
## Implementation detail
|
|
|
|
This part is WIP as we are still developing.
|
|
|
|
Under the hood, the controller creates a StatefulSet to run the notebook instance, and a Service for it.
|
|
|
|
## Deployment
|
|
|
|
Install the `notebooks.kubeflow.org` CRD:
|
|
|
|
```
|
|
make install
|
|
```
|
|
|
|
Deploy the notebook controller manager:
|
|
|
|
```
|
|
make deploy
|
|
```
|
|
|
|
Verify that the controller is running in the `notebook-controller-system` namespace:
|
|
|
|
```
|
|
$ kubectl get pods -l app=notebook-controller -n notebook-controller-system
|
|
NAME READY STATUS RESTARTS AGE
|
|
notebook-controller-deployment-564d76877-mqsm8 1/1 Running 0 16s
|
|
```
|
|
|
|
### Clean-up
|
|
|
|
Uninstall the notebook controller manager:
|
|
|
|
```
|
|
make undeploy
|
|
```
|
|
|
|
Uninstall the `notebooks.kubeflow.org` CRD:
|
|
|
|
```
|
|
make uninstall
|
|
```
|
|
|
|
## Contributing
|
|
|
|
[https://www.kubeflow.org/docs/about/contributing/](https://www.kubeflow.org/docs/about/contributing/)
|
|
|
|
### Development Environment
|
|
|
|
To develop on `notebook-controller`, your environment must have the following:
|
|
|
|
- [go](https://golang.org/dl/) version v1.17+.
|
|
- [docker](https://docs.docker.com/install/) version 20.10+.
|
|
- [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) version 1.22.0+.
|
|
- [kustomize](https://sigs.k8s.io/kustomize/docs/INSTALL.md) version 3.8.7+.
|
|
- [kubernetes](https://github.com/kubernetes-sigs/kind) Access to a Kubernetes v1.22.0+ cluster.
|
|
- [kubebuilder](https://book.kubebuilder.io/quick-start.html#installation) version 3.3.0+.
|
|
|
|
In order for the custom Notebook Controller to be functional from your local machine,
|
|
the admins must:
|
|
|
|
1. Set the number of replicas to zero:
|
|
```
|
|
kubectl edit deployment notebook-controller-deployment -n=kubeflow
|
|
```
|
|
2. Allow the controller to proxy the traffic to the Notebook Services by executing on your local machine:
|
|
```
|
|
kubectl proxy
|
|
```
|
|
3. Start the manager locally in developer mode:
|
|
```
|
|
export DEV="true"
|
|
make run
|
|
```
|
|
|
|
### Testing
|
|
|
|
Make sure all the tests are passing after you add a new feature:
|
|
|
|
```
|
|
make test
|
|
```
|
|
|
|
## TODO
|
|
|
|
- e2e test (we have one testing the jsonnet-metacontroller one, we should make it run on this one)
|
|
- `status` field should reflect the error if there is any. See [#2269](https://github.com/kubeflow/kubeflow/issues/2269).
|
|
- Istio integration (controller will generate istio resources to secure each user's notebook)
|
|
- CRD [validation](https://github.com/kubeflow/kubeflow/blob/master/kubeflow/jupyter/notebooks.schema)
|
|
- `ttlSecondsAfterFinished`: This is in the original jsonnet controller spec, but not being used yet. I think we want to cleanup the notebook after idle?
|
|
- Add more instructions on contributing like build,deploy and test locally.
|
|
- A script for installing all deps.
|