我想从 此处 使用 Dockerfile 测试自定义 kubernetes 调度程序:
FROM python:3.7
RUN pip install kubernetes
COPY scheduler.py /scheduler.py
CMD python /scheduler.py
一旦创建了映像和容器:
docker build -t app .
docker container run -d -it --name my-scheduler app:latest
容器立即进入 退出 状态。 首先我假设容器内的进程已经结束,因为它还没有在 kubernetes 集群中运行。 所以我创建了 deployment.yaml 并运行:
kubectl create -f deployment.yaml
然后检查:
kubectl get po -A
正如你所看到的,pod还没有准备好:
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-minikube 1/1 Running 0 119s
kube-system kube-apiserver-minikube 1/1 Running 0 119s
kube-system kube-controller-manager-minikube 1/1 Running 0 119s
kube-system kube-proxy-8c7l5 1/1 Running 0 107s
kube-system kube-scheduler-minikube 1/1 Running 0 119s
kube-system my-scheduler-5f964589d7-pgg74 0/1 ErrImagePull 0 6s
kube-system storage-provisioner 1/1 Running 1 (85s ago) 116s
我知道stackoverflow中有很多类似的问题和答案我尝试了其中一些对本案没有帮助的方法。
问题在于的 Dockerfile 中缺少
CMD
或
ENTRYPOINT
指令来使容器保持运行状态。虽然在 Dockerfile 中定义了
CMD
,但在
docker container run
命令中使用
-it
标志(代表
--interactive --tty
)会覆盖此默认命令。
以下步骤将帮助解决此问题:
1. 更新 Dockerfile:
需要确保进程在容器内运行。一种常见的方法是使用无限循环,直到进程被明确终止。可以使用
tail -f /dev/null
在 Dockerfile 中实现此目的。
FROM python:3.7
RUN pip install kubernetes
COPY scheduler.py /scheduler.py
CMD ["python", "/scheduler.py"] # 使用 exec 格式,更可靠
# 在调度程序运行后,使用 tail 保持容器运行
CMD ["tail", "-f", "/dev/null"]
2. 构建并运行容器:
使用以下命令构建并运行容器:
docker build -t app .
docker container run -d --name my-scheduler app:latest
请注意,我们删除了
-it
标志,以避免覆盖 Dockerfile 中定义的
CMD
。
3. 验证容器是否正在运行:
docker ps
应该看到
my-scheduler
容器处于运行状态。
4. 部署到 Kubernetes:
现在,的容器应该能够成功部署到 Kubernetes。确保的 deployment.yaml 文件正确配置,并使用以下命令创建或更新部署:
kubectl apply -f deployment.yaml
其他建议:
-
确保的
scheduler.py
脚本没有错误,并且在 Kubernetes 集群中运行时不会立即退出。 -
使用
kubectl describe pod <pod-name>
获取有关 Pod 未就绪状态的更多信息,例如,查看事件和日志。 -
如果仍然遇到问题,请提供以下信息:
-
scheduler.py
脚本的内容 -
deployment.yaml
文件的内容 - 运行的 Kubernetes 集群类型(例如,minikube、GKE、AKS)
- 任何错误消息或日志
-
通过按照上述步骤操作,应该能够解决容器立即退出问题,并成功在 Kubernetes 中运行的自定义调度程序。
标签:python,docker,kubernetes From: 74929004