V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
orluna
V2EX  ›  Kubernetes

k8s 如何每次拉取最新镜像

  •  
  •   orluna · 2022-12-17 12:36:21 +08:00 · 4070 次点击
    这是一个创建于 708 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    22 条回复    2022-12-19 10:19:57 +08:00
    dingyaguang117
        1
    dingyaguang117  
       2022-12-17 12:41:16 +08:00
    得手动指定 tag 吧,你这个 latest 表意不明确呀?还有如何回滚呢
    orluna
        2
    orluna  
    OP
       2022-12-17 12:56:27 +08:00
    家用服务,是把 deploymeny.yaml 存在私有 git 上,所以 cicd 不会去修改 git 上的 deploymeny.yaml ,期望是每次拉最新的 images 。实际貌似都是 uncahnged ,只能用 helm 指定 tag 了吗
    SweetEriri
        3
    SweetEriri  
       2022-12-17 13:34:03 +08:00
    可以 cicd 构建出镜像后 rollout deploy 滚动更新来拉取最新镜像
    ccde8259
        4
    ccde8259  
       2022-12-17 13:45:19 +08:00 via iPhone
    @orluna 先 scale 0 杀 pod 再 scale 1 起 pod
    orluna
        5
    orluna  
    OP
       2022-12-17 14:50:39 +08:00
    @ccde8259 清测有效 除了不太优雅~
    leeeee9
        6
    leeeee9  
       2022-12-17 17:10:16 +08:00
    jenkins 里面加一条删 pod 的不就完事
    hubqin
        7
    hubqin  
       2022-12-17 18:48:34 +08:00
    每次打镜像用新的 tag 并修改 yaml 里面的镜像为新的 tag
    chronos
        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
    chronos
        9
    chronos  
       2022-12-17 19:30:58 +08:00
    还有不优雅一点的方式,直接用 label 过滤删除对应的 pod ,然后 deployment 会重新将 pod 拉起来,imagePullPolicy: Always 就会拉新的镜像。

    kubectl delete pod -l app=labelvalue
    xuegy
        10
    xuegy  
       2022-12-17 21:27:55 +08:00 via iPhone
    @ccde8259 TrueNAS Scale 的杀鸡用牛刀法
    zxzflower
        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 来作为镜像配置.
    - 你不知道生产上的是哪个版本
    - 不利于回滚操作
    xabcstack
        12
    xabcstack  
       2022-12-17 23:03:38 +08:00
    这个模版,可以解答问题

    https://filelist.cn/disk/0/JAR-DEPLOYMENT.yml
    moonheart
        13
    moonheart  
       2022-12-17 23:07:51 +08:00
    简单,给 podTemplate 加个 annotation deployedAt=xxx ,每次更新版本都改一次,保证 deployment 会重新滚动
    Shawee
        14
    Shawee  
       2022-12-18 00:29:02 +08:00
    我使用的 argo 和 helm helm 仓库有提交 argo 自动更新
    Nnq
        15
    Nnq  
       2022-12-18 04:58:48 +08:00
    使用详细版本号 或者删除当前所有 deploy 来重新拉去镜像
    Chad0000
        16
    Chad0000  
       2022-12-18 05:52:06 +08:00 via iPhone
    @zxzflower
    把镜像放在 ci/cd 里就行了。我就是这么干的,每次 build 完后保留 image ,发布时上传给 tag ,deployment 设置总是拉取 image 。回滚就是 release 之前的 build 结果(会打 tag 重新 push )。
    Chad0000
        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
    xcai
        18
    xcai  
       2022-12-18 09:54:13 +08:00
    如果考虑 openshift 的话,这种功能是开箱即用的。
    blackwhites
        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 。这些工具可以自动完成构建、测试和部署应用的过程,并确保每次都使用最新的代码和镜像
    tudou1514
        20
    tudou1514  
       2022-12-19 08:49:14 +08:00
    如果 tag 不变的话,设置 imagePullPolicy: Always 就行了
    ModerRAS
        21
    ModerRAS  
       2022-12-19 09:19:03 +08:00
    @blackwhites 看着好像 ChatGPT 会说出来的话
    YzSama
        22
    YzSama  
       2022-12-19 10:19:57 +08:00
    latest tag 不变的话,设置 镜像策略 always 。

    然后,走 rollout restart deploy xxx 了。

    否则,kubectl 客户端 diff 永远都是 unchanged 。

    可以通过 shell 判断,如果是 unchanged 的话,则走 rollout restart
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1892 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:17 · PVG 00:17 · LAX 08:17 · JFK 11:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.