在 Minikube 上部署 Kubernetes Deployment 并解决 ImagePullBackOff 问题
文章目录
- 背景
- 问题分析
- 解决方案
- 步骤 1:确认本地镜像
- 步骤 2:将镜像导入 Minikube
- 步骤 3:重新应用 Deployment
- 步骤 4:检查 Pod 状态
- 常用命令
- Minikube 相关
- Kubernetes 相关
- Docker 相关
- 总结
本文记录了如何在 Minikube 上部署一个 Kubernetes Deployment,解决常见的
ImagePullBackOff
问题,并提供了一些常用命令供参考。场景基于一个 Go 应用的 Deployment,镜像为本地构建的
flycash/webook-live:v0.0.1
。
背景
在尝试使用以下命令部署 Kubernetes Deployment 时:
kubectl apply -f k8s-webook-deployment.yaml
Deployment 创建成功,但 Pod 状态显示为 ImagePullBackOff
或 ErrImagePull
,表明 Kubernetes 无法拉取镜像 flycash/webook-live:v0.0.1
。通过排查,发现镜像存在于本地 Docker 环境中,但 Minikube 使用独立的 Docker 守护进程,无法直接访问本地镜像。
以下是解决问题的步骤和最终方案。
问题分析
ImagePullBackOff
错误通常由以下原因引起:
- 镜像不存在于指定的仓库(例如 Docker Hub)。
- Minikube 的网络问题导致无法拉取镜像。
- 镜像在本地存在,但未导入 Minikube 的 Docker 环境。
通过 kubectl describe pod <pod-name>
,我们看到错误:
Failed to pull image "flycash/webook-live:v0.0.1": Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection
这表明 Kubernetes 尝试从 Docker Hub 拉取镜像,但失败。而 docker images
确认镜像 flycash/webook-live:v0.0.1
存在于本地,说明需要将本地镜像导入 Minikube。
解决方案
以下是将本地镜像部署到 Minikube 的步骤:
步骤 1:确认本地镜像
检查本地 Docker 环境中是否存在镜像:
docker images | grep flycash/webook-live
输出:
REPOSITORY TAG IMAGE ID CREATED SIZE
flycash/webook-live v0.0.1 a66eca81439c 22 hours ago 84.9MB
步骤 2:将镜像导入 Minikube
Minikube 使用独立的 Docker 守护进程,无法直接访问本地 Docker 镜像。需要将镜像导出并导入 Minikube:
# 1.切换到本地 Docker 环境(如果当前在 Minikube 环境中):
eval $(minikube -p minikube docker-env --unset)# 2. 导出本地镜像为 tar 文件:
docker save -o webook-live.tar flycash/webook-live:v0.0.1# 3. 将 tar 文件导入 Minikube:
minikube image load webook-live.tar# 4. 验证镜像是否在 Minikube 中:
eval $(minikube -p minikube docker-env)
docker images | grep flycash/webook-live# 5. 清理临时文件:rm webook-live.tar
步骤 3:重新应用 Deployment
使用以下 Deployment YAML 文件:
apiVersion: apps/v1
kind: Deployment
metadata:name: webook-live
spec:replicas: 3selector:matchLabels:app: webook-livetemplate:metadata:labels:app: webook-livespec:containers:- name: webookimage: flycash/webook-live:v0.0.1ports:- containerPort: 8080
应用 Deployment:
kubectl apply -f k8s-webook-deployment.yaml
步骤 4:检查 Pod 状态
验证 Pod 是否正常运行:
kubectl get pods
输出:
NAME READY STATUS RESTARTS AGE
webook-live-7fb974b957-4scx9 1/1 Running 0 28m
webook-live-7fb974b957-vs8fc 1/1 Running 0 28m
webook-live-7fb974b957-xh852 1/1 Running 0 28m
常用命令
以下是在 Minikube 和 Kubernetes 中常用的命令,方便调试和管理:
Minikube 相关
# 启动 Minikube:
minikube start --driver=docker --base-image=registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.46# 查看 Minikube 状态:
minikube status# 切换到 Minikube 的 Docker 环境:
eval $(minikube -p minikube docker-env)# 切换回本地 Docker 环境:
eval $(minikube -p minikube docker-env --unset)# 导入本地镜像到 Minikube:
minikube image load <image-tar-file># 删除 Minikube 集群:
minikube delete
Kubernetes 相关
# 应用 YAML 文件:
kubectl apply -f <filename>.yaml# 查看节点状态:
kubectl get nodes# 查看 Pod 状态:
kubectl get pods# 查看 Pod 详细信息:
kubectl describe pod <pod-name># 查看 Pod 日志:
kubectl logs <pod-name># 查看 Service 状态:
kubectl get svc# 删除资源:
kubectl delete -f <filename>.yaml
Docker 相关
# 查看本地镜像:
docker images
# 构建镜像:
docker build -t <image-name>:<tag> .
# 导出镜像为 tar 文件:
docker save -o <output-file>.tar <image-name>:<tag>
总结
通过将本地镜像导入 Minikube 的 Docker 环境,成功解决了 ImagePullBackOff
问题,Pod 状态变为 Running
。创建 Service 后,可以通过 Minikube 提供的 URL 访问应用。添加健康检查和处理版本警告可以进一步提高部署的稳定性。