CICD 工作流如何保证 kubectl apply -f deploymeny.yaml
每次都是最新的 docker 镜像
#deploymeny.yaml
imagePullPolicy: Always
image: xxx/xxxx/xxx:latest
还是说有必要部署helm
动态渲染deploymeny.yaml
1
dingyaguang117 2022-12-17 12:41:16 +08:00
得手动指定 tag 吧,你这个 latest 表意不明确呀?还有如何回滚呢
|
2
orluna OP 家用服务,是把 deploymeny.yaml 存在私有 git 上,所以 cicd 不会去修改 git 上的 deploymeny.yaml ,期望是每次拉最新的 images 。实际貌似都是 uncahnged ,只能用 helm 指定 tag 了吗
|
3
SweetEriri 2022-12-17 13:34:03 +08:00
可以 cicd 构建出镜像后 rollout deploy 滚动更新来拉取最新镜像
|
6
leeeee9 2022-12-17 17:10:16 +08:00
jenkins 里面加一条删 pod 的不就完事
|
7
hubqin 2022-12-17 18:48:34 +08:00
每次打镜像用新的 tag 并修改 yaml 里面的镜像为新的 tag
|
8
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
|
9
chronos 2022-12-17 19:30:58 +08:00
还有不优雅一点的方式,直接用 label 过滤删除对应的 pod ,然后 deployment 会重新将 pod 拉起来,imagePullPolicy: Always 就会拉新的镜像。
kubectl delete pod -l app=labelvalue |
11
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 来作为镜像配置. - 你不知道生产上的是哪个版本 - 不利于回滚操作 |
12
xabcstack 2022-12-17 23:03:38 +08:00
|
13
moonheart 2022-12-17 23:07:51 +08:00
简单,给 podTemplate 加个 annotation deployedAt=xxx ,每次更新版本都改一次,保证 deployment 会重新滚动
|
14
Shawee 2022-12-18 00:29:02 +08:00
我使用的 argo 和 helm helm 仓库有提交 argo 自动更新
|
15
Nnq 2022-12-18 04:58:48 +08:00
使用详细版本号 或者删除当前所有 deploy 来重新拉去镜像
|
16
Chad0000 2022-12-18 05:52:06 +08:00 via iPhone
@zxzflower
把镜像放在 ci/cd 里就行了。我就是这么干的,每次 build 完后保留 image ,发布时上传给 tag ,deployment 设置总是拉取 image 。回滚就是 release 之前的 build 结果(会打 tag 重新 push )。 |
17
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 |
18
xcai 2022-12-18 09:54:13 +08:00
如果考虑 openshift 的话,这种功能是开箱即用的。
|
19
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 。这些工具可以自动完成构建、测试和部署应用的过程,并确保每次都使用最新的代码和镜像 |
20
tudou1514 2022-12-19 08:49:14 +08:00
如果 tag 不变的话,设置 imagePullPolicy: Always 就行了
|
21
ModerRAS 2022-12-19 09:19:03 +08:00
@blackwhites 看着好像 ChatGPT 会说出来的话
|
22
YzSama 2022-12-19 10:19:57 +08:00
latest tag 不变的话,设置 镜像策略 always 。
然后,走 rollout restart deploy xxx 了。 否则,kubectl 客户端 diff 永远都是 unchanged 。 可以通过 shell 判断,如果是 unchanged 的话,则走 rollout restart |