3. Kubernetes 基础回顾:Pod、Deployment、StatefulSet、Service、ConfigMap、PV/PVC 核心概念

在深入搜索索引分片与副本调优之前,必须牢固掌握 Kubernetes 的核心抽象层。搜索工作负载(如 Elasticsearch、OpenSearch)对有状态存储、网络标识和配置管理有极高要求,理解这些原语的差异是后续调优的基石。

3.1 核心工作负载:Pod、Deployment、StatefulSet

Kubernetes 通过不同的控制器管理容器生命周期,选择错误的控制器会导致索引分片在节点故障时无法正确恢复。

控制器 Pod 标识 存储 扩缩容行为 搜索场景适用性
Pod 随机名称 临时(默认) 手动管理 仅用于测试或 Sidecar
Deployment 随机名称 + 哈希 无状态(推荐挂载空卷) 滚动更新、快速回滚 仅适合无状态网关或协调器节点
StatefulSet 有序、固定名称(如 es-data-0) 每个 Pod 绑定专属 PVC 有序、逐个扩缩 必须用于数据节点
关键原则:搜索索引的分片数据必须持久化。使用 StatefulSet 保证每个数据节点拥有固定的网络标识(pod-name-0.svc.cluster.local)和独立的持久卷,这是分片分配与故障迁移的前提。

3.2 网络抽象:Service

Service 为 Pod 提供稳定的网络入口。对于搜索集群,需要区分两类 Service:

  • ClusterIP(无头 Service,Headless Service):设置 clusterIP: None,返回所有 Pod 的 IP 列表。StatefulSet 依赖此模式实现稳定的 DNS 解析(如 es-data-0.es-headless.ns.svc.cluster.local),用于节点间发现与分片传输。
  • ClusterIP(普通 Service):提供负载均衡入口,用于客户端请求(如 HTTP 9200 端口)。
调优提示:搜索集群的传输端口(9300/9400)应只暴露在无头 Service 下,避免外部负载均衡器干扰节点间内部通信。

3.3 配置与密钥:ConfigMap 与 Secret

搜索索引的配置(如分片数、副本数、内存锁、线程池)应通过 ConfigMap 注入,避免硬编码在镜像中。

apiVersion: v1
kind: ConfigMap
metadata:
  name: es-config
data:
  elasticsearch.yml: |
    cluster.name: search-cluster
    node.name: ${POD_NAME}
    discovery.seed_hosts: es-headless
    cluster.initial_master_nodes: es-data-0,es-data-1,es-data-2
    indices.memory.index_buffer_size: 10%

敏感信息(如 S3 快照密钥、LDAP 密码)必须使用 Secret,并通过环境变量或卷挂载注入。

3.4 持久化存储:PV 与 PVC

搜索索引的 I/O 模式以随机写 + 顺序读为主,存储选型直接影响分片恢复速度。

存储类型 IOPS 延迟 推荐场景
本地 SSD(Local PV) 高 亚毫秒 热数据节点,追求低延迟
网络块存储(如 EBS、Cinder) 中 毫秒级 温数据节点,支持快照
分布式文件系统(如 NFS、CephFS) 低 高 不推荐用于主分片
避坑:不要为搜索数据节点使用 NFS 或 CephFS 作为主存储。文件锁语义缺失和延迟抖动会导致分片频繁重新分配,甚至集群脑裂。

3.5 核心概念关系图

下图展示了搜索集群中 Pod、StatefulSet、Service、ConfigMap 和 PV/PVC 之间的协作关系:

搜索集群核心对象关系图 ConfigMap elasticsearch.yml StatefulSet es-data 有序、固定标识 es-data-0 es-data-1 es-data-2 PVC-0 PVC-1 PVC-2 PV-0 PV-1 PV-2 Headless Service clusterIP: None Client Service 端口 9200 图例说明: 配置 控制器 Pod PVC/Service PV/Client 绑定/依赖 DNS/网络

3.6 搜索集群中的典型部署模式

基于上述原语,一个生产级搜索集群的部署结构如下:

  1. 数据节点(Data Node):使用 StatefulSet + 本地 SSD 的 Local PV,每个 Pod 对应一个 PVC。副本数等于数据节点数量。
  2. 协调节点(Coordinating Node):使用 Deployment,无状态,负责接收客户端请求并分发到数据节点。
  3. 主节点(Master Node):使用 StatefulSet(3 个 Pod),不存储数据,只负责集群状态管理。使用小规格 PV 或无存储。
  4. 服务暴露:协调节点通过普通 ClusterIP Service 对外暴露 HTTP 端口;数据节点通过无头 Service 实现内部节点发现。
调优要点:StatefulSet 的 podManagementPolicy: OrderedReady 确保索引分片在主节点选举完成后再启动数据节点,避免分片分配冲突。使用 volumeClaimTemplates 自动为每个 Pod 生成 PVC,保证存储与 Pod 生命周期绑定。