以编程方式识别 kubernetes 部署中的特定副本

Identifying specific replica in kubernetes deployment programmatically

假设一个 K8s 集群部署有 3 个副本(应该不相关,但我们假设它是一个 AKS 集群)。

容器使用 K8s .NET 客户端库运行 .NET 6 代码。我们可以读取主机 pod id,但是我们可以读取主机 pod 副本编号吗?

例如,假设这 3 个副本托管在名为 podA、podB、podC 的 pods 中。 然后 podB 崩溃。 K8s 将重启副本,但使用不同的 pod 名称,比如 podD。 我如何以编程方式发现刚刚启动的 pod 正是恢复的 podB?

首先,当一个pod crash时,k8s并不一定会改变pod的名称,因为正如你所说的,它是重启的,而不是重新创建的。在 kubectl get pods -n <namespace> 命令输出的 RESTARTS 列中将出现重新启动并且数字将递增。如果每次重启都会创建一个新的 pod,那么一开始就没有必要有 RESTARTS 列。

其次,在您的示例中,无法在部署中将 PodB 的完全随机名称分配给 PodD。因为 k8s 将它们随机分配给部署 pods。如果你想完成这个,你应该使用 StatefulSet 而不是 Deployment 因为 StatefulSet 中的每个 pod 都有一个唯一且稳定的网络标识。

作为k8s文档点;

Like a Deployment, a StatefulSet manages Pods that are based on an identical container spec. Unlike a Deployment, a StatefulSet maintains a sticky identity for each of their Pods. These pods are created from the same spec, but are not interchangeable: each has a persistent identifier that it maintains across any rescheduling.

参考:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/