0%

如何强制Kubernetes预拉取镜像

问题描述

我在GKE上的Kubernetes中有以下rc控制器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: v1
kind: ReplicationController
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 2
selector:
app: myapp
deployment: initial
template:
metadata:
labels:
app: myapp
deployment: initial
spec:
containers:
- name: myapp
image: myregistry.com/myapp:5c3dda6b
ports:
- containerPort: 80
imagePullPolicy: Always
imagePullSecrets:
- name: myregistry.com-registry-key

现在,如果我执行以下命令执行滚动更新,但没有重新拉镜像。为什么?

1
kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b

高票回答

如果有如下定义,Kubernetes将会在Pod创建时拉取镜像(请参阅更新镜像文档):

  • 镜像的标签为:latest
  • 指定镜像的拉取策略imagePullPolicy: Always

如果你想每次都拉取镜像,这很好。但是,如果您想按需执行该操作:例如,如果您想使用some-public-image:latest,但只想在请求时手动提取新版本。你现在可以:

  • 将imagePullPolicy设置为IfNotPresent或Never并提前拉取好,在每个群集节点上手动拉取镜像,以便是最新版本,然后执行kubectl rolling-update或类似重启Pods
  • 暂时更改imagePullPolicy,执行kubectl apply,重新启动pod(例如kubectl rolling-update),还原imagePullPolicy,重新kubectl apply
  • 将一些some-public-image:latest推送到您的私有存储库并执行kubectl rolling-update

按需拉动没有好的解决方案。如果有变化,请评论,我会更新这个答案。

原文链接

How do I force Kubernetes to re-pull an image?