Kubernetes 根据副本集中的 pod 数量使用不同的容器参数

nmi*_*nic 5 replicaset kubernetes

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

例如,如果我有 3 个工人,我会这样:

id:0, num_workers:3
id:1, num_workers:3
id:2, num_workers:3
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 kubernetes 来做到这一点?
我在命令行参数中将此信息传递给应用程序,并且我认为将其包含在环境变量中也可以。

尺寸变化可以让所有工人被杀死并产生新的工人。

mda*_*iel 4

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

但是,继续表演:


如果您想要稳定的标识符,那么StatefulSets是对此的现代答案。这是否完全适合您的情况取决于(对于您的问题域)id:0“重新启动”是否仍然算作,id:0或者它现在已停止并启动的事实使其失去资格id:0

簇大小的运行列表很棘手。如果您愿意在启动机制中保持灵活性,那么您可以在生成实际工作线程之前使用预启动二进制文件填充环境(该示例用于直接从 etcd 读取,但与 kubernetes 交互也适用相同的原则) API,然后启动)。

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

到目前为止一切都很好,除了

关于所有工人被杀死并产生新工人的尺寸变化

我对此要求的最佳答案是,如果应用程序必须在启动时知道其对等点,那么我很确定您已经离开了“scale $foo --replicas=5”领域并进入了“销毁对等点”并重新开始”境界,与kubectl delete pods -l some-label=of-my-pods;幸运的是,这就是updateStrategy: type: OnDelete与命令结合使用时所做的事情delete pods