在此stackoverflow问题中:kubernetes Deployment. how to change container environment variables for rolling updates?
提问者提到他编辑部署以将版本更改为v2。假设容器v2已存在,自动部署新版本的工作流程是什么?如何在不手动编辑部署配置或签入新版本的yaml的情况下部署它?
如果您更改基础容器(如v1 - >另一个版本也称为v1),Kubernetes会部署新的还是旧的?
答案 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)
如果您不想:
您可以通过以下方式更新部署:
PUT /apis/extensions/v1beta1/namespaces/{namespace}/deployments -d {... deployment with v2...}
kubectl set image deployment/<DEPLOYMENT_NAME> <CONTAINER_NAME>:< IMAGE_NAME>:v2