我有一个谷歌云功能,当文件上传到存储桶时触发。该函数连接到kubernetes集群(使用this library),删除与标签purpose: 'address-migration'
匹配的给定命名空间中的任何现有作业,并创建新作业。
更具体地说,这是我的代码:
const jobsListResponse = await clientInstance.api.batch.v1.jobs.get();
const foundJob = jobsListResponse.body.items.find(job => (
job.metadata.namespace === 'microservice' &&
job.metadata.labels && job.metadata.labels['purpose'] === 'address-migration'
));
if (foundJob !== undefined) {
const deleteResponse = await clientInstance.api.batch.v1.namespace('microservice').job(foundJob.metadata.name).delete();
console.log('Deleted old job', deleteResponse);
}
const jobManifest = require('./jobManifest.json');
jobManifest.metadata.name += (new Date()).getTime().toString();
jobManifest.spec.template.spec.containers[0].env.push({
name: 'DP',
value: targetLink
});
const createJobResponse = await clientInstance.api.batch.v1.namespace('microservice').jobs.post({body: jobManifest});
console.log('Created new job', createJobResponse);
当函数第一次执行并且之前没有任何作业时,它创建了它并且它成功运行。
但是,当第二次触发该功能时,旧作业似乎与新作业合并。
新工作现在应该有像address-migration-${timestamp}
这样的名字。但相反,它是address-migration-15361359838821536136672927
。由于奇怪的原因,新时间戳附加到现有名称(包括旧时间戳)。
此外,还将新的环境变量合并到其中。我现在在清单中有两个DP条目:
- name: DP
value: gs://dpdat/dp2.dat
- name: DP
value: gs://dpdat/dp3.dat
毕竟,我刚删除的工作似乎与我之后直接创建的工作合并。
我的错。谷歌云功能是有状态的。我认为它会像过去那样为每个请求提供一次节点。不,我对我的要求的变化('./ jobManifest.json')在记忆中是有状态的。一旦功能“冷却”(暂时不执行)节点也退出,导致状态重置。解释为什么它有时工作,有时不工作。
结论:Google云功能在给定的时间内保持温暖。在内存中,更改可能会持续存在于以下请求中。