k8s 如何每次拉取最新镜像

2022-12-17 12:36:21 +08:00
 orluna

CICD 工作流如何保证 kubectl apply -f deploymeny.yaml 每次都是最新的 docker 镜像

#deploymeny.yaml
imagePullPolicy: Always
image: xxx/xxxx/xxx:latest

还是说有必要部署helm动态渲染deploymeny.yaml

3954 次点击
所在节点    Kubernetes
22 条回复
dingyaguang117
2022-12-17 12:41:16 +08:00
得手动指定 tag 吧,你这个 latest 表意不明确呀?还有如何回滚呢
orluna
2022-12-17 12:56:27 +08:00
家用服务,是把 deploymeny.yaml 存在私有 git 上,所以 cicd 不会去修改 git 上的 deploymeny.yaml ,期望是每次拉最新的 images 。实际貌似都是 uncahnged ,只能用 helm 指定 tag 了吗
SweetEriri
2022-12-17 13:34:03 +08:00
可以 cicd 构建出镜像后 rollout deploy 滚动更新来拉取最新镜像
ccde8259
2022-12-17 13:45:19 +08:00
@orluna 先 scale 0 杀 pod 再 scale 1 起 pod
orluna
2022-12-17 14:50:39 +08:00
@ccde8259 清测有效 除了不太优雅~
leeeee9
2022-12-17 17:10:16 +08:00
jenkins 里面加一条删 pod 的不就完事
hubqin
2022-12-17 18:48:34 +08:00
每次打镜像用新的 tag 并修改 yaml 里面的镜像为新的 tag
chronos
2022-12-17 19:26:36 +08:00
使用 git commit hash 做为 tag ,每次 ci/cd 的时候用 yq 修改镜像的 tag ,再 apply 。或着使用 @sha256:, 如: image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
chronos
2022-12-17 19:30:58 +08:00
还有不优雅一点的方式,直接用 label 过滤删除对应的 pod ,然后 deployment 会重新将 pod 拉起来,imagePullPolicy: Always 就会拉新的镜像。

kubectl delete pod -l app=labelvalue
xuegy
2022-12-17 21:27:55 +08:00
@ccde8259 TrueNAS Scale 的杀鸡用牛刀法
zxzflower
2022-12-17 21:36:29 +08:00
如果 yaml 没有其他更新 至单纯更新镜像 直接`set`就好了 没必要`apply -f`
```
kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
```
如果 yaml 有其他更新, 建议还是用`helm` or `kubectl kustomize`吧 或者你不嫌麻烦就脚本更新这个 yaml push 给代码仓库 在下一步拉去 apply 吧.

实际上不建议用 latest 来作为镜像配置.
- 你不知道生产上的是哪个版本
- 不利于回滚操作
xabcstack
2022-12-17 23:03:38 +08:00
这个模版,可以解答问题

https://filelist.cn/disk/0/JAR-DEPLOYMENT.yml
moonheart
2022-12-17 23:07:51 +08:00
简单,给 podTemplate 加个 annotation deployedAt=xxx ,每次更新版本都改一次,保证 deployment 会重新滚动
Shawee
2022-12-18 00:29:02 +08:00
我使用的 argo 和 helm helm 仓库有提交 argo 自动更新
Nnq
2022-12-18 04:58:48 +08:00
使用详细版本号 或者删除当前所有 deploy 来重新拉去镜像
Chad0000
2022-12-18 05:52:06 +08:00
@zxzflower
把镜像放在 ci/cd 里就行了。我就是这么干的,每次 build 完后保留 image ,发布时上传给 tag ,deployment 设置总是拉取 image 。回滚就是 release 之前的 build 结果(会打 tag 重新 push )。
Chad0000
2022-12-18 08:20:57 +08:00
打开电脑单独看了一下 CICD ,其中在 Deployment 配置是:
image: your-app:latest
imagePullPolicy: Always

然后 CICD 中 Build 完生成 Image ,使用 docker save 将 Image 保存起来而不 Push

Release 时再将当时保存的 Image 打 Tag ,再 Push 上去,使用下面指令触发部署:
restart deployment/your-app
xcai
2022-12-18 09:54:13 +08:00
如果考虑 openshift 的话,这种功能是开箱即用的。
blackwhites
2022-12-18 15:25:22 +08:00
在 CICD 工作流中,可以通过以下步骤来保证 kubectl apply -f deployment.yaml 每次都使用最新的 Docker 镜像:

在构建 Docker 镜像时,使用最新的代码。在构建镜像之前,可以通过拉取最新的代码或检出特定的代码分支来确保使用最新的代码。

在部署应用时,使用 imagePullPolicy: Always 。这会告诉 Kubernetes 在每次部署应用时总是从 Docker Registry 中拉取最新的镜像。

在构建 Docker 镜像时使用带有版本号的标签,例如 xxx/xxxx/xxx:1.0 。这样,每次构建镜像时都会生成一个新的版本号,从而确保使用最新的镜像。

在构建镜像时使用自动化工具,例如 Jenkins 或 GitLab CI 。这些工具可以自动完成构建、测试和部署应用的过程,并确保每次都使用最新的代码和镜像
tudou1514
2022-12-19 08:49:14 +08:00
如果 tag 不变的话,设置 imagePullPolicy: Always 就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.fyfyfm.apispeedy.workers.dev/t/903126

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX