我在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
执行滚动更新,但没有重新拉动。为什么?
如果有的话,Kubernetes将会创建Pod(参见updating-images doc):
: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
(重!)按需拉动没有好的解决方案。如果有变化,请评论;我会更新这个答案。
必须将imagePullPolicy
分组到容器数据中而不是在规范数据中。但是,我提交了一个issue,因为我发现它很奇怪。此外,没有错误信息。
所以,这个规范片段有效:
spec:
containers:
- name: myapp
image: myregistry.com/myapp:5c3dda6b
ports:
- containerPort: 80
imagePullPolicy: Always
imagePullSecrets:
- name: myregistry.com-registry-key
我在开发过程中的黑客攻击是更改我的部署清单以添加最新标记,并始终如此拉动
image: etoews/my-image:latest
imagePullPolicy: Always
然后我手动删除pod
kubectl delete pod my-app-3498980157-2zxhd
因为它是一个部署,Kubernetes将自动重新创建pod并提取最新图像。
popular workaround是使用虚拟注释(或标签)修补部署:
kubectl patch deployment <name> -p \
"{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"
假设您的部署meets these requirements,这将导致K8s提取任何新图像并重新部署。
显然,现在当您使用与现有容器图像相同的--image
参数运行滚动更新时,还必须指定--image-pull-policy
。当以下命令与容器图像相同时,应强制拉动图像:
kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always
滚动更新命令,当给定图像参数时,assumes that the image is different比复制控制器中当前存在的参数。
将有一个新命令直接执行此操作:
创建一个新的kubectl rollout restart
命令,用于执行部署的滚动重新启动。
pull request合并了。它将是版本1.15
(changelog)的一部分