使用Minikube从Docker Hub拉取私有镜像

7

我正在macOS 10.12上使用minikube,并尝试使用在docker hub上托管的私有镜像。我知道minikube启动一个虚拟机,作为本地Kubernetes集群的唯一节点,并将托管所有我的Pod。

我了解到可以通过运行eval $(minikube docker-env)来使用VM的Docker运行时。因此,我使用这些变量从我的本地Docker运行时更改到其他运行时。运行docker images后,我可以看到变更已经生效。

接下来,我尝试使用docker login登录docker hub,然后手动拉取我的镜像,这个过程没有出错。之后,我认为镜像是准备好供集群中的任何Pod使用的,但是我总是收到ImagePullBackOff的错误提示。我还尝试通过minikube ssh SSH进入VM,结果是一样的,镜像可用,但由于某种原因拒绝使用它。

如果有帮助的话,这是我的部署描述文件:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 1
template:
  metadata:
    labels:
      app: nginx
  spec:
    containers:
    - name: nginx
      image: godraude/nginx
      imagePullPolicy: Always
      ports:
      - containerPort: 80
      - containerPort: 443

以下是kubectl describe pod <podname>命令的输出结果:

Events:
  FirstSeen LastSeen    Count   From            SubobjectPath       Type        Reason      Message
  --------- --------    -----   ----            -------------       --------    ------      -------
  1m        1m      1   {default-scheduler }                Normal      Scheduled   Successfully assigned web-deployment-2451628605-vtbl8 to minikube
  1m        23s     4   {kubelet minikube}  spec.containers{nginx}  Normal      Pulling     pulling image "godraude/nginx"
  1m        20s     4   {kubelet minikube}  spec.containers{nginx}  Warning     Failed      Failed to pull image "godraude/nginx": Error: image godraude/nginx not found
  1m        20s     4   {kubelet minikube}              Warning     FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "nginx" with ErrImagePull: "Error: image godraude/nginx not found"

  1m    4s  5   {kubelet minikube}  spec.containers{nginx}  Normal  BackOff     Back-off pulling image "godraude/nginx"
  1m    4s  5   {kubelet minikube}              Warning FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "nginx" with ImagePullBackOff: "Back-off pulling image \"godraude/nginx\""
2个回答

6
我认为您需要创建一个密钥,告诉Kubernetes从哪里获取您的私有镜像及其凭据。
kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

以下命令可列出您的密钥:

kubectl get secret
NAME            TYPE                      DATA      AGE
my-secret   kubernetes.io/dockercfg   1         100d

现在在部署定义中,您需要定义使用哪个 secret。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 1
template:
  metadata:
    labels:
      app: nginx
  spec:
    containers:
    - name: nginx
      image: godraude/nginx
      imagePullPolicy: Always
      ports:
      - containerPort: 80
      - containerPort: 443
    imagePullSecrets:
      - name: my-secret

1
问题是镜像拉取策略。它被设置为Always,因此即使镜像已经存在,docker也会尝试拉取它。将imagePullPolicy: Never设置解决了这个问题。

你能详细说明一下吗?对我来说不起作用(2022年)。 - bashizip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接