使用 Minikube 内置 Registry 管理容器镜像
Minikube 提供了内置的 Docker registry 插件,可以方便地在本地 Kubernetes 开发环境中管理容器镜像。以下是完整使用指南:
一、启用 Minikube Registry
1.1 启动 Registry 插件
# 启用 registry 插件
minikube addons enable registry
# 查看插件状态
minikube addons list | grep registry
1.2 验证 Registry 运行
kubectl get pods -n kube-system -l kubernetes.io/minikube-addons=registry
# 预期输出类似:
# registry-5b4c6d9d5d-2w8xk 1/1 Running 0 2m
二、配置 Docker 客户端
2.1 设置本地 Docker 环境
# 指向 Minikube 的 Docker 守护进程
eval $(minikube docker-env)
# 验证
docker ps
2.2 直接访问 Registry
Minikube registry 默认暴露在 localhost:5000
和集群内 registry.kube-system.svc.cluster.local:5000
# 获取 registry 服务详情
kubectl get svc -n kube-system registry
# 测试连接
curl http://$(minikube ip):5000/v2/_catalog
三、推送和拉取镜像
3.1 构建并标记镜像
# 构建镜像 (示例使用前面提到的 Vue 应用)
docker build -t vue-app -f Dockerfile.frontend .
# 标记镜像推送到 registry
docker tag vue-app localhost:5000/vue-app:1.0.0
3.2 推送镜像到 registry
docker push localhost:5000/vue-app:1.0.0
# 验证推送
curl http://$(minikube ip):5000/v2/vue-app/tags/list
3.3 在 Kubernetes 中使用镜像
# deployment.yaml 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: vue-frontend
spec:
containers:
- name: vue-app
image: localhost:5000/vue-app:1.0.0
imagePullPolicy: Always # 必须设置为 Always 或 IfNotPresent
四、高级配置
4.1 持久化存储配置
默认 registry 使用 emptyDir,重启会丢失数据。配置持久化存储:
# 创建 PVC
kubectl apply -n kube-system -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: registry-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
EOF
# 更新 registry 部署使用 PVC
kubectl patch deployment -n kube-system registry \
-p '{"spec":{"template":{"spec":{"volumes":[{"name":"storage","persistentVolumeClaim":{"claimName":"registry-pvc"}}]}}}}'
4.2 外部访问配置
# 将 registry 服务类型改为 NodePort
kubectl patch svc -n kube-system registry \
-p '{"spec":{"type":"NodePort"}}'
# 获取外部端口
REGISTRY_PORT=$(kubectl get svc -n kube-system registry -o jsonpath='{.spec.ports[0].nodePort}')
echo "Registry available at: $(minikube ip):${REGISTRY_PORT}"
五、常见问题解决
5.1 推送镜像失败 - 不安全的 registry
解决方法 1:配置 Docker 信任 registry
# 在 /etc/docker/daemon.json 添加 (Linux/Mac)
{
"insecure-registries" : ["localhost:5000", "<minikube-ip>:5000"]
}
# 然后重启 Docker 服务
解决方法 2:使用 HTTP 直接访问
docker tag vue-app $(minikube ip):5000/vue-app:1.0.0
docker push $(minikube ip):5000/vue-app:1.0.0
5.2 Pod 无法拉取镜像
确保 deployment 中配置了正确的 imagePullPolicy
:
imagePullPolicy: IfNotPresent # 对于本地 registry
# 或
imagePullPolicy: Always
六、清理资源
# 列出 registry 中的镜像
curl http://$(minikube ip):5000/v2/_catalog
# 删除特定镜像
kubectl exec -n kube-system $(kubectl get pods -n kube-system -l kubernetes.io/minikube-addons=registry -o name) \
-- bin/registry garbage-collect /etc/docker/registry/config.yml
# 禁用 registry
minikube addons disable registry
# 完全删除
kubectl delete -n kube-system all -l kubernetes.io/minikube-addons=registry
七、实际应用示例
7.1 CI/CD 流水线集成
# 在 Jenkins 或其他 CI 系统中使用
docker build -t vue-app .
docker tag vue-app localhost:5000/vue-app:${BUILD_NUMBER}
docker push localhost:5000/vue-app:${BUILD_NUMBER}
# 更新 deployment
kubectl set image deployment/vue-frontend vue-app=localhost:5000/vue-app:${BUILD_NUMBER}
7.2 多项目共享 registry
# 项目A
docker tag project-a localhost:5000/team-a/project-a:1.0
# 项目B
docker tag project-b localhost:5000/team-b/project-b:2.1
通过 Minikube registry,您可以轻松管理本地开发环境中的容器镜像,无需依赖外部 registry 服务,特别适合离线开发或快速原型设计场景。
No Comments