【问题标题】:How to deploy new app versions in kubernetes如何在 Kubernetes 中部署新的应用程序版本
【发布时间】:2018-05-12 01:24:42
【问题描述】:

在这个 stackoverflow 问题中:kubernetes Deployment. how to change container environment variables for rolling updates?

提问者提到他编辑了部署以将版本更改为 v2。假设容器 v2 已经存在,自动部署新版本的工作流程是什么?然后如何在不手动编辑部署配置或签入新版本的 yaml 的情况下部署它?

如果您更改底层容器(例如 v1 -> 另一个也称为 v1 的版本),Kubernetes 将部署新的还是旧的?

【问题讨论】:

  • 我认为它基于图像拉取策略。默认是`imagePullPolicy: Always`。这意味着它将获得新的。

标签: deployment kubernetes


【解决方案1】:

如果你不想:

  • 签入新的 YAML 版本
  • 手动更新配置

您可以通过以下任一方式更新部署:

  • 通过修补/放置新映像作为资源修改,对相关部署进行 REST 调用。即PUT /apis/extensions/v1beta1/namespaces/{namespace}/deployments -d {... deployment with v2...}
  • Set the imagekubectl set image deployment/<DEPLOYMENT_NAME> <CONTAINER_NAME>:< IMAGE_NAME>:v2

【讨论】:

    【解决方案2】:

    假设v1 已经在运行并且您尝试使用相同的环境变量值等再次部署v1,那么k8s 将不会看到您当前和更新的部署资源之间的任何差异。 如果没有 diff,k8s 调度程序会假定已经达到所需的状态并且不会调度任何新的 pod,即使设置了imagePullPolicy: Always 也是如此。原因是imagePullPolicy 只对新创建的 pod 有影响。所以如果一个新的 pod 正在被调度,那么 k8s 总是会再次拉取镜像。尽管如此,在您的部署中没有任何差异,首先不会安排新的 pod ..

    对于我的部署,我总是设置一个虚拟环境变量,例如部署时间戳DEPLOY_TS,例如:

      containers:
      - name: my-app
        image: my-app:{{ .Values.app.version }}  ## value dynamically set by my deployment pipeline
        env:
        - name: DEPLOY_TS
          value: "{{ .Values.deploy_ts }}"  ## value dynamically set by my deployment pipeline
    

    DEPLOY_TS 的值始终设置为当前时间戳 - 因此它始终是不同的值。这样,k8s 将在每次部署时看到差异并安排新的 pod - 即使正在重新部署相同的版本。

    (我目前正在运行 k8s 1.7)

    【讨论】:

    • 来自 DevOps 的开发端,我们只需添加/更新配置环境变量 RESTART=<timestamp>,以便我们可以再次重新部署相同的版本(即:v1)。
    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2022-12-14
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多