Skip to main content

使用 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 服务,特别适合离线开发或快速原型设计场景。