Kubernetes不同的容器args取决于副本集中的pod数量

时间:2017-09-27 15:51:17

标签: kubernetes replicaset

我想用工人扩展应用程序 可能有1名工人或100名工人,我想无缝地扩展它们 这个想法是使用副本集。但是,由于特定领域的原因,扩展它们的适当方法是让每个工人知道它:ID和工人总数。

例如,如果我有3名工人,我会有:

id:0, num_workers:3
id:1, num_workers:3
id:2, num_workers:3

有没有办法使用kubernetes这样做?
我将这些信息在命令行参数中传递给应用程序,我认为在环境变量中也可以使用它。

所有工人的大小变化都可以被杀死,新的工人也会被催生。

2 个答案:

答案 0 :(得分:2)

在给出kubernetes特定的答案之前,我想指出问题似乎是试图将集群协调推进应用程序,这几乎比使用为该任务设计的分布式系统原语更难定义。例如,如果每个新工作人员在etcd中标识自己,那么他们可以watch keys来检测更改,这意味着没有人需要销毁正在运行的应用程序只是为了更新其对等列表,他们的联系信息,他们的容量,当前工作负载,以及在构建分布式工作系统时您将享受的任何有趣信息。

但是,随着节目:

如果你想要稳定的标识符,那么StatefulSets就是现代的答案。这是否适合您的情况取决于(对于您的问题域)id:0是否正在重新启动"仍被视为id:0或已停止并开始的事实现在取消其成为id:0的资格。

群集大小的运行列表很棘手。如果您愿意在启动机制中保持灵活性,那么您可以在产生实际工作人员之前使用pre-launch binary填充环境(该示例用于直接从etcd读取,但同样的原则适用于与kubernetes API,然后启动)。

你可以通过让initContainer将当前状态写入文件来以更静态的方式执行相同的技巧,然后应用程序将读入该文件。或者,由于所有Pod容器共享网络,该应用程序可以联系" sidecar" localhost上的容器,以通过API获取该信息。

到目前为止很好,除了

  

关于要杀死的所有工人的尺寸变化以及产生的新工人

我对该要求的最佳答案是,如果应用程序必须在发布时知道其对等方,那么我很确定您已经离开了"扩展$ foo --replicas = 5"进入"摧毁同伴并重新开始#34;领域,kubectl delete pods -l some-label=of-my-pods;谢天谢地,当delete pods命令与@Bean public IntegrationFlow processFileFlow() { return IntegrationFlows .from("fileInputChannel") .transform(fileToStringTransformer()) .handle("fileProcessor", "process") .channel("xmlChannel") .get(); } @Bean public DirectChannel fileInputChannel(){ return new DirectChannel(); } @Bean public DirectChannel xmlChannel(){ return new DirectChannel(); } @Bean public FileProcessor fileProcessor() { return new FileProcessor(); } @Bean public IntegrationFlow enrichDataFlow() { return IntegrationFlows .from("xmlChannel") .handle("enricher", "enrichProduct") .channel("bvChannel") .get(); } @Bean public Enricher enricher() { return new Enricher(); } 命令结合使用时,updateStrategy: type: OnDelete会做什么。

答案 1 :(得分:1)

最后,我尝试了不同的东西。我已经使用kubernetes API来获取具有相同标签的正在运行的pod的数量。这是使用kubernetes python客户端的python代码。

$('#summernote').summernote('createRange').toString()