使用 minikube 从 docker hub 拉取私有镜像
Pulling private image from docker hub using minikube
我在 macOS 10.12 上使用 minikube 并尝试使用托管在 docker hub 的私有图像。我知道 minikube 启动了一个 VM,据我所知它将是我本地 kubernetes 集群的唯一节点,它将托管我所有的 pods.
我了解到我可以通过 运行 eval $(minikube docker-env)
使用 VM 的 docker 运行时。所以我使用这些变量从我的本地 docker 运行时更改为另一个。 运行 docker images
我可以看到更改是有效完成的。
我的下一步是使用 docker login
在 docker 中心登录,然后手动拉取我的图像,结果没有错误。在那之后,我认为图像将准备好被集群中的任何 pod 使用,但我总是得到 ImagePullBackOff
。我还尝试通过 minikube ssh
ssh 进入虚拟机,结果是一样的,图像在那里可以使用,但出于某种原因我不知道它拒绝使用它。
如果有帮助,这是我的部署描述文件:
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\""
问题出在镜像拉取策略上。它被设置为 Always
所以 docker 试图拉出图像,即使它存在。设置 imagePullPolicy: Never
解决了问题。
我想你需要的是创建一个 secret,它会告诉 kube 从哪里可以拉取你的私有镜像及其凭据
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
现在在部署定义中,您需要定义要使用的秘密
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
我在 macOS 10.12 上使用 minikube 并尝试使用托管在 docker hub 的私有图像。我知道 minikube 启动了一个 VM,据我所知它将是我本地 kubernetes 集群的唯一节点,它将托管我所有的 pods.
我了解到我可以通过 运行 eval $(minikube docker-env)
使用 VM 的 docker 运行时。所以我使用这些变量从我的本地 docker 运行时更改为另一个。 运行 docker images
我可以看到更改是有效完成的。
我的下一步是使用 docker login
在 docker 中心登录,然后手动拉取我的图像,结果没有错误。在那之后,我认为图像将准备好被集群中的任何 pod 使用,但我总是得到 ImagePullBackOff
。我还尝试通过 minikube ssh
ssh 进入虚拟机,结果是一样的,图像在那里可以使用,但出于某种原因我不知道它拒绝使用它。
如果有帮助,这是我的部署描述文件:
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\""
问题出在镜像拉取策略上。它被设置为 Always
所以 docker 试图拉出图像,即使它存在。设置 imagePullPolicy: Never
解决了问题。
我想你需要的是创建一个 secret,它会告诉 kube 从哪里可以拉取你的私有镜像及其凭据
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
现在在部署定义中,您需要定义要使用的秘密
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