python - 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 文件中指定了一个端口。我不确定为什么会在日志中出现此错误。
解决方案
CrashLoopBackOff
出现错误的原因有很多。在您的情况下,您的部署文件似乎被锁定或缺乏资源阻止容器加载。
据我了解,您已经在本地构建了 docker 映像并将其添加到本地 Docker 注册表中。由于imagePullPolicy: Never
指定并且没有错误ErrImageNeverPull
,因此本地 docker 和 kubernetes 之间的 docker 注册表没有问题。
您可以从运行命令开始:kubectl describe pod [name]
从 kubelet 中获取更多信息。
除非,尝试先部署单个 pod,而不是部署 4 个副本,以确保 kubernetes 正确运行您的映像。
推荐阅读
- java - 如何在不跳过其他步骤的情况下手动失败 Serenity bdd 中的步骤
- java - 休眠:在保存无效的 ltree 列时捕获异常
- powershell - 计划任务中的 Send-MailMessage 编码错误
- google-maps - 我试图渲染一千多个标记但它崩溃了..有人可以帮助我吗?
- javascript - 更改 javascript 显示/隐藏文本功能
- c# - 如何使用 c# 从 selenium 中的给定 IwebElement 获取相对 xpath?
- c# - 在 c# 中添加证书 ocsp 权限信息访问和策略扩展
- excel - 一个单元格等于 IF 语句中存在的多个数字,excel
- string - 禁用特定列的自动增量
- c# - 将结构映射注册表添加到 Microsoft.Azure.Functions.Extensions.DependencyInjection