以编程方式识别 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/
假设一个 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/