我正在做一个思想实验关于部署PostgresXL在 Kubernetes (k8s) 上,每个数据节点使用本地(直接连接)贮存。
假设我们有以下节点:
- 2x配备速度超快的 Optane DC SSD 和 NVDIMM 的高端机器。这些节点已在 k8s 中注册并标记为
type: datanode
。 - 1x机器在 k8s 上注册并标记为
type: GTM
。 - 2x在 k8s 上注册并标记为 的机器
type: coodinator
。
假设每个标签创建一个“节点组”(例如,type: datanode
标签组成一个包含两个节点的组)。
我们还假设每个节点都有一个/data
挂载点(在主机操作系统中),该挂载点映射到其底层最快的磁盘(或 LVM 逻辑卷)。
我将部署如下架构:
--------------
| gtm_0 |
--------------
/ | | \
/ | | \
/ | | \
/ | | \
/ | | \
/ | | \
/ | | \
/ | | \
/ ------------ ------------ \
| | coord_0 | | coord_1 | |
| ------------ ------------ |
| / \ / \ |
| / \/ \ |
------------ ------------/\------------ ------------
| data_0 | / \ | data_1 |
------------ ---- ---- ------------
我希望最终水平扩展这三个节点类别,并且我需要为每个节点起一个稳定的名称,因此我将创建三个StatefulSet
(每个都由相同的无头服务支持):ss-datanodes
和ss-gtms
。ss-coords
在每个节点中,StatefulSet
pod 模板将仅选择相关节点(例如: podtype: datanode
的节点ss-datanodes
)并具有适当的图像(例如:集合的 GTM ss-gtms
)。
这将允许 k8s 对同一节点组内的 pod 进行“洗牌”。
但是,我不想使用任何 NAS,每个 pod 只能使用数据采集系统以最大限度地提高性能。
为此,我创建了一个StorageClass
不带配置的,并将绑定模式设置为“WaitForFirstConsumer”的。
然后我将创建一个三 PersistentVolume
s,这些 PV 将属于以下类型local
,指向/data
挂载点,仅在 上有所不同nodeAffinity
。
我还会创建一个三 PersistenceVolumeClaim
(PVC)与伴随 PV 匹配。
最后,我会在 s 中的 pods 模板中添加 PVC StatefulSet
。
这应该允许 k8s:
- 仅在其节点组中调度组件(GTM,Coordinator,DataNode)。
- 将节点组中的 pod 进行混洗。
- 让
/data
挂载点在每个 pod 上都可用。
我对 PostgresXL 做出以下假设:
- 组件可以按任意顺序启动(例如 coord_0、data_1、gtm_0、data_0、coord_1)。
- 每个组件都可以处理由同一类型的另一个组件写入的数据(例如,可以交换 data_0 和 data_1 pod,并使用另一个数据并继续工作)。这似乎并不不合理,因为 pod 保留的唯一身份是其主机名。
这个设置适用于 PostgresXL 吗?使用 k8s 我能得到什么?
K8s 的一个有用功能是 HPA,它可用于自动添加另一个数据节点并进行扩展ss-datanodes
。
但是,我在网上看到,K8s 中的状态管理很难。但这个设置并不难,所以我一定错过了什么。