安装 JupyterHub#

在拥有一个可用的 Kubernetes 集群 并且安装了 Helm 之后,我们就可以使用 JupyterHub Helm chart 在 Kubernetes 集群中安装 JupyterHub。

初始化 Helm chart 配置文件#

Helm chart 包含模板,这些模板可以渲染成要安装的 Kubernetes 资源。Helm chart 的用户可以覆盖 chart 的默认值来影响模板的渲染方式。

在这一步,我们将初始化一个 chart 配置文件,供您调整 JupyterHub 的安装。接下来,我们将其命名并称为 config.yaml

YAML 简介

如果您以前没有接触过 YAML,花几分钟学习一下可能会物有所值。

从 1.0.0 版本开始,您不需要任何配置就可以开始使用,所以您只需创建一个带有注释的 config.yaml 文件即可。

# This file can update the JupyterHub Helm chart's default configuration values.
#
# For reference see the configuration reference and default values, but make
# sure to refer to the Helm chart version of interest to you!
#
# Introduction to YAML:     https://www.youtube.com/watch?v=cdLNKUoMc6c
# Chart config reference:   https://zero-to-jupyterhub.readthedocs.io/en/stable/resources/reference.html
# Chart default values:     https://github.com/jupyterhub/zero-to-jupyterhub-k8s/blob/HEAD/jupyterhub/values.yaml
# Available chart versions: https://hub.jupyter.org/helm-chart/
#

如果您在终端上操作,不确定如何创建此文件,可以尝试使用 nano config.yaml

安装 JupyterHub#

  1. 让 Helm 知道 JupyterHub Helm chart 仓库的位置,这样您就可以从中安装 JupyterHub chart,而无需使用长 URL 名称。

    helm repo add jupyterhub https://hub.jupyter.org/helm-chart/
    helm repo update
    

    这应该会显示类似以下的输出

    Hang tight while we grab the latest from your chart repositories...
    ...Skip local chart repository
    ...Successfully got an update from the "stable" chart repository
    ...Successfully got an update from the "jupyterhub" chart repository
    Update Complete. ⎈ Happy Helming!⎈
    
  2. 现在,通过在包含 config.yaml 的目录中运行以下命令,来安装由您的 config.yaml 文件配置的 chart

    helm upgrade --cleanup-on-fail \
      --install <helm-release-name> jupyterhub/jupyterhub \
      --namespace <k8s-namespace> \
      --create-namespace \
      --version=<chart-version> \
      --values config.yaml
    

    其中

    • <helm-release-name> 指的是 Helm release 名称,一个用于区分不同 chart 安装的标识符。当您更改或删除此 chart 安装的配置时,会需要它。如果您的 Kubernetes 集群将包含多个 JupyterHub,请确保区分它们。您可以使用 helm list 列出您的 Helm release。

    • <k8s-namespace> 指的是 Kubernetes 命名空间,一个用于对 Kubernetes 资源进行分组的标识符,在这里是指与 JupyterHub chart 关联的所有 Kubernetes 资源。在使用 kubectl 执行任何命令时,您都需要这个命名空间标识符。

    • 此步骤可能需要一些时间,在此期间您的终端不会有任何输出。JupyterHub 正在后台进行安装。

    • 如果您遇到 release named <helm-release-name> already exists 的错误,您应该通过运行 helm delete <helm-release-name> 来删除该 release。然后重复此步骤重新安装。如果问题仍然存在,也请执行 kubectl delete namespace <k8s-namespace>,然后重试。

    • 通常情况下,如果安装步骤出现问题,请在重新运行安装命令之前,通过运行 helm delete <helm-release-name> 来删除 Helm release。

    • 如果您正在拉取一个大的 Docker 镜像,可能会收到 Error: timed out waiting for the condition 错误,请在 helm 命令中添加一个 --timeout=<number-of-minutes>m 参数。

    • --version 参数对应的是 Helm chart 的版本,而不是 JupyterHub 的版本。每个版本的 JupyterHub Helm chart 都与特定版本的 JupyterHub 配对。例如,0.11.1 版本的 Helm chart 运行的是 JupyterHub 1.3.0。要查看每个版本的 JupyterHub Helm Chart 中安装了哪个 JupyterHub 版本,请参阅 Helm Chart 仓库

  3. 在步骤 2 运行时,您可以在另一个终端中输入以下命令来查看正在创建的 pod

    kubectl get pod --namespace <k8s-namespace>
    

    为了保持理智,我们建议您为 kubectl 启用自动补全功能(请按照您平台的 kubectl 安装说明来查找 shell 自动补全的说明)

    并为 --namespace 标志设置一个默认值

    kubectl config set-context $(kubectl config current-context) --namespace <k8s-namespace>
    
  4. 等待 hubproxy pod 进入 Running 状态。

    NAME                    READY     STATUS    RESTARTS   AGE
    hub-5d4ffd57cf-k68z8    1/1       Running   0          37s
    proxy-7cb9bc4cc-9bdlp   1/1       Running   0          37s
    
  5. 找到我们可以用来访问 JupyterHub 的 IP 地址。运行以下命令,直到 proxy-public 服务EXTERNAL-IP 可用,如示例输出所示。

    kubectl --namespace <k8s-namespace> get service proxy-public
    
    NAME           TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
    proxy-public   LoadBalancer   10.51.248.230   104.196.41.97   80:31916/TCP   1m
    

    或者,使用简写形式

    kubectl --namespace <k8s-namespace> get service proxy-public --output jsonpath='{.status.loadBalancer.ingress[].ip}'
    
  6. 要使用 JupyterHub,请在浏览器中输入 proxy-public 服务的外部 IP。JupyterHub 正在使用默认的 dummy 认证器运行,因此输入任何用户名和密码组合都可以让您进入 Hub。

恭喜!现在您已经有了一个基本的 JupyterHub 在运行,您可以扩展它优化它,以多种方式满足您的需求。

一些定制化的例子有

  • 配置登录以使用对您有意义的账户(Google、GitHub 等)。

  • 为用户容器使用合适的预构建镜像或构建您自己的镜像。

  • 将其托管在 https://your-domain.com 上。