如果我们只需要一组相同Pod中每个Pod的一致标识符,那么Kubernetes StatefulSet是正确的答案吗



我们正在研究一个Kubernetes场景,该场景要求我们为给定的部署维护Npod(为了简化起见,我们假设N是静态的,N=3(。目前,我们正在为此使用部署和副本集。

在每个pod中,有没有任何方法(通过环境变量注入或类似方法(让我们获得一个唯一的标识符,显示该pod是哪个pod(即"1"、"2"、"3"或类似……确切的格式并不重要(。

特别重要的是(由于这些吊舱连接的系统(;2〃;则替换吊舱也将其标识符报告为"死亡";2〃;,而不是作为新事物,例如";4〃;。。。换句话说,标识符的集合不会随着时间而改变,除非该集合的大小增加/减少。目前,我们正在使用pod名称,但这种方式并不稳定;pod的名称每次都是新的和唯一的。

这就是StatefulSet的作用吗?文档似乎特别关注存储卷,但这不是我们的优先事项。我们如何在代码中实际获得容器内唯一且稳定的ID?

是的,如果pod需要以某种方式定义其身份,那么Statefulset就是最好的选择。

以下是文档中相关部分的报价:

与部署一样,StatefulSet管理基于与部署不同,StatefulSet维护他们每个播客的粘性身份。这些吊舱是从相同的规范,但不可互换:每个规范都有一个持久的它在任何重新安排中维护的标识符。

因此,如果您有一个名为myappStatefulset对象,其中有3个副本,则pod将命名为myapp-0myapp-1myapp-2

此外,如果任何一个吊舱死亡,比如myapp-1,那么作为其替代品创建的新吊舱将再次是myapp-1

您可以通过Downward API通过环境变量向容器公开pod名称,并在脚本中使用它:

env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name

我没有提到的一个相关注意事项是,与Deployments不同,Statefulsets的吊舱是一个接一个地提出的。因此,对于上面的示例myappmyapp-1将仅在myapp-0准备好之后才开始。

相关内容

最新更新