首页 > 解决方案 > Jupyter notebook Docker 镜像在 Docker 中运行,但不在 Kubernetes 中

问题描述

我创建了一个 Dockerfile 用于在 Docker 中运行 Jupyter。

FROM ubuntu:latest
FROM python:3.7

WORKDIR /app
ADD . /app

RUN pip install -r requirements.txt

CMD ["jupyter", "notebook", "--allow-root", "--ip=0.0.0.0"]

我的 requirements.txt 文件如下所示:

jupyter
git+https://github.com/kubernetes-client/python.git

我跑了docker build -t hello-jupyter .,它构建得很好。然后我跑了docker run -p 8888:8888 hello-jupyter,它运行良好。

当我运行 Docker 映像 hello-jupyter 时,我可以在 Web 浏览器 (127.0.0.1:8888) 中打开 Jupyter 笔记本。


现在我想将 Jupyter 作为 Kubernetes 部署运行。我创建了这个 deployment.yaml 文件:

apiVersion: v1
kind: Service
metadata:
  name: hello-jupyter-service
spec:
  selector:
    app: hello-jupyter
  ports:
  - protocol: "TCP"
    port: 8888
    targetPort: 8888
  type: LoadBalancer


---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-jupyter
spec:
  replicas: 4
  selector:
    matchLabels:
      app: hello-jupyter
  template:
    metadata:
      labels:
        app: hello-jupyter
    spec:
      containers:
      - name: hello-jupyter
        image: hello-jupyter
        imagePullPolicy: Never
        ports:
        - containerPort: 8888

我在 shell 中运行了这个命令:

$ kubectl apply -f deployment.yaml
service/hello-jupyter-service unchanged
deployment.apps/hello-jupyter unchanged

当我检查我的 pod 时,我看到了崩溃循环

$ kubectl get pods
NAME                             READY   STATUS             RESTARTS   AGE
hello-jupyter-66b88b5f6d-gqcff   0/1     CrashLoopBackOff   6          7m16s
hello-jupyter-66b88b5f6d-q59vj   0/1     CrashLoopBackOff   15         55m
hello-jupyter-66b88b5f6d-spvl5   0/1     CrashLoopBackOff   6          7m21s
hello-jupyter-66b88b5f6d-v2ghb   0/1     CrashLoopBackOff   6          7m20s
hello-jupyter-6758977cd8-m6vqz   0/1     CrashLoopBackOff   13         43m

Pod 的状态为崩溃循环,我无法在 Web 浏览器中打开 Jupyter。

deployment.yaml 文件有什么问题?deployment.yaml 文件只是在四个不同的 pod 中运行 Docker 镜像 hello-jupyter。为什么 Docker 镜像在 Docker 中运行,而不在 Kubernetes pod 中运行?

这是我的一个豆荚的日志:

$ kubectl logs hello-jupyter-66b88b5f6d-gqcff
[I 18:05:03.805 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/traitlets/traitlets.py", line 537, in get
    value = obj._trait_values[self.name]
KeyError: 'port'

我确实在我的 deployment.yaml 文件中指定了一个端口。我不确定为什么会在日志中出现此错误。

标签: pythondockerkubernetesjupyter-notebookjupyter

解决方案


CrashLoopBackOff出现错误的原因有很多。在您的情况下,您的部署文件似乎被锁定或缺乏资源阻止容器加载。

据我了解,您已经在本地构建了 docker 映像并将其添加到本地 Docker 注册表中。由于imagePullPolicy: Never指定并且没有错误ErrImageNeverPull,因此本地 docker 和 kubernetes 之间的 docker 注册表没有问题。

您可以从运行命令开始:kubectl describe pod [name]从 kubelet 中获取更多信息。

除非,尝试先部署单个 pod,而不是部署 4 个副本,以确保 kubernetes 正确运行您的映像。


推荐阅读