Answers:
您可以为Pod配置宽限期(例如30秒或更长时间,具体取决于容器启动时间和图像大小)并进行设置"imagePullPolicy: "Always"
。并使用kubectl delete pod pod_name
。将创建一个新容器,并自动下载最新的映像,然后终止旧容器。
例:
spec:
terminationGracePeriodSeconds: 30
containers:
- name: my_container
image: my_image:latest
imagePullPolicy: "Always"
我目前正在使用Jenkins进行自动构建和图像标记,它看起来像这样:
kubectl --user="kube-user" --server="https://kubemaster.example.com" --token=$ACCESS_TOKEN set image deployment/my-deployment mycontainer=myimage:"$BUILD_NUMBER-$SHORT_GIT_COMMIT"
另一个技巧是初始运行:
kubectl set image deployment/my-deployment mycontainer=myimage:latest
然后:
kubectl set image deployment/my-deployment mycontainer=myimage
它实际上会触发滚动更新,但请确保您也已imagePullPolicy: "Always"
设置。
更新:
我发现的另一个技巧是,无需更改图像名称,而是更改将触发滚动更新的字段的值,例如terminationGracePeriodSeconds
。您可以使用kubectl edit deployment your_deployment
或kubectl apply -f your_deployment.yaml
或使用如下补丁来做到这一点:
kubectl patch deployment your_deployment -p \
'{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":31}}}}'
只要确保您始终更改数字值即可。
kubectl set image
命令时,kubernetes都会执行滚动更新。例如,假设您部署了“ repo / myimage:latest”。同时,您的图像已更改,并使用“ v0.2”标签推送到存储库。您可以通过运行来执行更新。kubectl set image deployment/my-deployment mycontainer=myimage:v0.2
此图像还将具有“最新”标签。
更新2019-06-24
基于@Jodiug注释(如果您有1.15
版本),可以使用以下命令:
kubectl rollout restart deployment/demo
阅读有关该问题的更多信息:
https://github.com/kubernetes/kubernetes/issues/13488
好吧,在kubernetes GitHub项目上对此主题进行了有趣的讨论。看到问题:https : //github.com/kubernetes/kubernetes/issues/33664
从那里描述的解决方案中,我建议两个。
1,准备部署
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: demo
spec:
replicas: 1
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo
image: registry.example.com/apps/demo:master
imagePullPolicy: Always
env:
- name: FOR_GODS_SAKE_PLEASE_REDEPLOY
value: 'THIS_STRING_IS_REPLACED_DURING_BUILD'
2.部署
sed -ie "s/THIS_STRING_IS_REPLACED_DURING_BUILD/$(date)/g" deployment.yml
kubectl apply -f deployment.yml
kubectl patch deployment web -p \
"{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"
当然imagePullPolicy: Always
,这两种情况都是必需的。
似乎k8s希望我们为每次部署提供不同的图像标签。我的默认策略是使CI系统生成并推送docker映像,并用内部版本号标记它们xpmatteo/foobar:456
。
对于本地开发,可以方便地使用脚本或makefile,如下所示:
# create a unique tag
VERSION:=$(shell date +%Y%m%d%H%M%S)
TAG=xpmatteo/foobar:$(VERSION)
deploy:
npm run-script build
docker build -t $(TAG) .
docker push $(TAG)
sed s%IMAGE_TAG_PLACEHOLDER%$(TAG)% foobar-deployment.yaml | kubectl apply -f - --record
该sed
命令用实际生成的图像标记替换部署文档中的占位符。
我正在使用Azure DevOps部署容器化应用程序,我可以通过使用生成ID轻松地解决该问题
每次构建并生成新的Build ID时,我都将此构建ID用作docker image的标签,此处为示例
imagename:buildID
成功建立映像(CI)之后,在部署yml文件的CD管道中,我将映像名称指定为
imagename:env:buildID
此处evn:buildid是天蓝色的devops变量,其值为构建ID。
所以现在每次我对build(CI)和deploy(CD)进行新更改时。
如果您需要CI / CD的构建定义,请发表评论。