如何在kubernetes中部署新的应用程序版本

时间:2017-11-28 14:34:01

标签: deployment kubernetes

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

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

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

2 个答案:

答案 0 :(得分:1)

假设v1已经在运行,并且您尝试使用相同的环境变量值等再次部署v1,那么k8s将看不到您当前和更新的部署资源之间的任何差异。 没有差异,k8s调度程序假定已达到所需状态,并且即使设置了imagePullPolicy: Always,也不会安排任何新的pod。原因是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)

答案 1 :(得分:1)

如果您不想:

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

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

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