我们正在研究一个Kubernetes场景,该场景要求我们为给定的部署维护Npod(为了简化起见,我们假设N是静态的,N=3(。目前,我们正在为此使用部署和副本集。
在每个pod中,有没有任何方法(通过环境变量注入或类似方法(让我们获得一个唯一的标识符,显示该pod是哪个pod(即"1"、"2"、"3"或类似……确切的格式并不重要(。
特别重要的是(由于这些吊舱连接的系统(;2〃;则替换吊舱也将其标识符报告为"死亡";2〃;,而不是作为新事物,例如";4〃;。。。换句话说,标识符的集合不会随着时间而改变,除非该集合的大小增加/减少。目前,我们正在使用pod名称,但这种方式并不稳定;pod的名称每次都是新的和唯一的。
这就是StatefulSet的作用吗?文档似乎特别关注存储卷,但这不是我们的优先事项。我们如何在代码中实际获得容器内唯一且稳定的ID?
是的,如果pod需要以某种方式定义其身份,那么Statefulset
就是最好的选择。
以下是文档中相关部分的报价:
与部署一样,StatefulSet管理基于与部署不同,StatefulSet维护他们每个播客的粘性身份。这些吊舱是从相同的规范,但不可互换:每个规范都有一个持久的它在任何重新安排中维护的标识符。
因此,如果您有一个名为myapp
的Statefulset
对象,其中有3个副本,则pod将命名为myapp-0
、myapp-1
和myapp-2
。
此外,如果任何一个吊舱死亡,比如myapp-1
,那么作为其替代品创建的新吊舱将再次是myapp-1
。
您可以通过Downward API
通过环境变量向容器公开pod名称,并在脚本中使用它:
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
我没有提到的一个相关注意事项是,与Deployments
不同,Statefulsets
的吊舱是一个接一个地提出的。因此,对于上面的示例myapp
,myapp-1
将仅在myapp-0
准备好之后才开始。