我在GKE上的Kubernetes中有以下复制控制器:
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
现在,如果我说
kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b
执行滚动更新,但不重新拉入。为什么?
7条答案
按热度按时间z0qdvdin1#
如果出现以下任一情况,Kubernetes将启动Pod创建(请参阅更新图像文档):
:latest
的图像imagePullPolicy: Always
这是很棒的,如果你想一直拉。但如果您想按需执行此操作:例如,如果您想使用
some-public-image:latest
,但只想在请求时手动拉出较新的版本。您目前可以:imagePullPolicy
设置为IfNotPresent
或Never
,并Pre-Pull:在每个集群节点上手动拉取镜像,以便缓存最新的镜像,然后执行kubectl rolling-update
或类似的操作来重新启动Pods(丑陋、容易损坏的黑客!)**临时*更改
imagePullPolicy
、执行kubectl apply
、重新启动Pod(例如kubectl rolling-update
)、恢复imagePullPolicy
、重做kubectl apply
(丑陋!)*拉入并推送
some-public-image:latest
到您的专用存储库,然后执行kubectl rolling-update
(Heavy!)对于按需拉入,没有好的解决方案。如果这一点发生变化,请发表评论;我会更新这个答案。
hxzsmxv22#
必须将
imagePullPolicy
分组到容器数据中,而不是规范数据中。然而,我对此提交了一份issue,因为我觉得这很奇怪。此外,没有错误消息。因此,此规范代码片段可以工作:
iovurdzv3#
有一个命令可以直接做到这一点:
创建执行滚动重新启动展开的新
kubectl rollout restart
命令。已合并pull request。它是版本
1.15
(changelog)或更高版本的一部分。igetnqfo4#
我在开发期间的诀窍是更改我的部署清单,以添加最新的标记,并总是这样拉
然后我手动删除Pod
因为是部署,Kubernetes会自动重新创建Pod并拉取最新的镜像。
tmb3ates5#
一种流行的解决方法是使用虚拟注解(或标签)修补展开:
假设您的部署满足这些要求,这将导致K8拉出任何新的镜像并重新部署。
ttisahbt6#
现在,命令
kubectl rollout restart deploy YOUR-DEPLOYMENT
与imagePullPolicy: Always
策略相结合将允许您使用最新版本的映像重新启动所有Pod。z4bn682m7#
1.将策略指定为:
1.确保每个部署都有不同的注解。Helm是这样做的:
1.指定镜像拉取策略-始终