【问题标题】:How can we setup kubernetes to automatically change containers when a new one is pushed?我们如何设置 kubernetes 在推送新容器时自动更改容器?
【发布时间】:2021-04-08 18:56:15
【问题描述】:

我正在使用谷歌云来存储我的 Docker 图像并托管我的 kubernetes 集群。我想知道如何让 kubernetes 在每次推送新容器时拉下具有 latest 标记的容器。

我认为 imagePullPolicy 是可行的方法,但它似乎并没有起到作用(我可能遗漏了一些东西)。这是我的容器规格:

"name": "blah",
"image": "gcr.io/project-id/container-name:latest",
"imagePullPolicy": "Always",
"env": [...]

目前,当我上传新的 docker 映像时,我不得不删除并重新创建部署。

【问题讨论】:

    标签: kubernetes google-cloud-platform


    【解决方案1】:

    Kubernetes 它自己永远不会在存储库中的容器映像更新时触发。您的工具中需要某种 CI/CD 管道。此外,我强烈建议避免使用:latest,因为它会使您的容器随着时间的推移而变化。我认为使用某种版本控制要好得多。无论是像image:1.4.3 这样的语义,基于image:<gitsha> 还是我使用image:<gitsha>-<pushid>,其中push 是每次推送到repo 的顺序更新值(这样即使我从同一个版本重新上传标签也会改变)。

    使用此类版本控制,如果您更改清单中的图像,部署将按预期获得滚动更新。

    如果你想坚持image:latest,你可以在你的pod模板中添加一个带有版本的标签,所以如果你碰到它,它就会滚动。您也可以一个一个地手动杀死 pod,或者(如果您能承受停机时间)您可以将部署扩展到 0 个副本并返回到 N

    【讨论】:

    • 如果我需要使用最新的版本,我需要做什么?
    • 我完全同意这个概念,但我认为不可能通过简单地使用图像来使部署图像标签动态化:。正确的解决方案可能是使用掌舵图,以便我们可以将标签部分作为您所说的变量。
    【解决方案2】:

    实际上,您可以修补您的部署,以便它可以重新提取清单的规范部分(将您的部署名称放在那里)

    kubectl patch deployment YOUR-DEPLOYMENT-NAME -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"
    

    现在,每次您在容器注册表(DockerHub、ECR...)中推送新版本时,请转到您的 kubernetes CLI 并:

    kubectl rollout restart deployment/YOUR-DEPLOYMENT-NAME
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 2016-02-12
      • 1970-01-01
      • 2015-04-29
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多