Spring Boot+Kubernetes环境中Couchbase及应用镜像拉取失败问题
我正在实现Spring Boot整合Couchbase的示例,已完成Docker化流程,在Minikube的Kubernetes环境部署时遇到镜像拉取超时问题。启动Minikube并打开仪表盘后,执行kubectl apply -f k8s命令,出现以下错误:
Failed to pull image "couchbase:latest": rpc error: code = Unknown desc = context deadline exceeded
同时,自定义应用todowithcouchbase也抛出同类错误:
Failed to pull image "noyandocker/todowithcouchbase:latest": rpc error: code = Unknown desc = context deadline exceeded
以下是相关配置文件:
1. app-config.yml
apiVersion: v1 kind: ConfigMap metadata: name: app-config data: COUCHBASE_BUCKET: "todo_list" COUCHBASE_HOST: "couchbase"
2. couchbase-pv.yml
apiVersion: v1 kind: PersistentVolume metadata: name: couchbase-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/data/couchbase --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: couchbase-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi
3. couchbase-secret.yml
apiVersion: v1 kind: Secret metadata: name: couchbase-secret type: Opaque data: username: QWRtaW5pc3RyYXRvcg== # Base64编码的'Administrator' password: MTIzNDU2 # Base64编码的'123456'
4. couchbase-statefulset.yml
apiVersion: apps/v1 kind: StatefulSet metadata: name: couchbase spec: selector: matchLabels: app: couchbase serviceName: couchbase replicas: 1 template: metadata: labels: app: couchbase spec: containers: - name: couchbase image: couchbase:latest ports: - containerPort: 8091 - containerPort: 11210 env: - name: COUCHBASE_ADMINISTRATOR_USERNAME valueFrom: secretKeyRef: name: couchbase-secret key: username - name: COUCHBASE_ADMINISTRATOR_PASSWORD valueFrom: secretKeyRef: name: couchbase-secret key: password - name: COUCHBASE_BUCKET valueFrom: configMapKeyRef: name: app-config key: COUCHBASE_BUCKET volumeMounts: - name: couchbase-storage mountPath: /opt/couchbase/var volumes: - name: couchbase-storage persistentVolumeClaim: claimName: couchbase-pvc --- apiVersion: v1 kind: Service metadata: name: couchbase-service spec: selector: app: couchbase ports: - name: admin-port protocol: TCP port: 8091 targetPort: 8091 - name: data-port protocol: TCP port: 11210 targetPort: 11210 type: NodePort
5. todowithcouchbase-deployment.yml
apiVersion: apps/v1 kind: Deployment metadata: name: todowithcouchbase spec: replicas: 1 selector: matchLabels: app: todowithcouchbase template: metadata: labels: app: todowithcouchbase spec: containers: - name: todowithcouchbase image: noyandocker/todowithcouchbase:latest ports: - containerPort: 2323 envFrom: - configMapRef: name: app-config - secretRef: name: couchbase-secret --- apiVersion: v1 kind: Service metadata: name: todowithcouchbase-service spec: selector: app: todowithcouchbase ports: - protocol: TCP port: 2323 targetPort: 2323 type: NodePort
1. 检查并修复Minikube网络连接
Minikube节点可能无法访问Docker Hub,先测试连通性:
minikube ssh curl -I https://hub.docker.com
若无法访问,重启Minikube并使用国内镜像加速:
minikube delete minikube start --image-mirror-country='cn' --registry-mirror=https://registry.docker-cn.com
2. 提前在Minikube节点拉取镜像
直接在Minikube内部拉取所需镜像,避免部署时的网络延迟:
minikube ssh docker pull couchbase:latest docker pull noyandocker/todowithcouchbase:latest
拉取完成后重新执行部署命令:kubectl apply -f k8s
3. 替换latest标签为具体版本号
避免latest标签导致的镜像解析不稳定,换成明确版本。比如将couchbase:latest改为couchbase:7.2.0,自定义镜像使用固定版本标签(如noyandocker/todowithcouchbase:v1.0),修改配置文件中的image字段后重新部署。
4. 调整镜像拉取超时时间
在Deployment/StatefulSet的容器配置中添加超时参数:
containers: - name: couchbase image: couchbase:latest imagePullPolicy: IfNotPresent args: ["--timeout", "300s"]
或修改Minikube的Kubelet配置:
minikube ssh echo "imagePullTimeout: 5m0s" >> /var/lib/kubelet/config.yaml systemctl restart kubelet
5. 设置合理的镜像拉取策略
在容器字段中添加IfNotPresent策略,本地已有镜像时不再重复拉取:
imagePullPolicy: IfNotPresent
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu

