You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kubernetes StatefulSet中部署支持节点自动发现的Elasticsearch集群

解决方案

你遇到的问题是缺少Elasticsearch集群自动发现配置、K8s侧服务配置不满足节点通信要求,按照以下步骤修改即可实现Pod扩容后自动加入集群:

1. 调整Service配置

Elasticsearch节点间通信依赖9300端口,且需要Headless Service为StatefulSet的Pod生成稳定DNS域名,替换你的原有Service配置如下:

---
# 节点间通信用Headless Service
apiVersion: v1
kind: Service
metadata:
  name: es-entrypoint
spec:
  selector:
    name: es
  ports:
    - port: 9200
      targetPort: 9200
      name: http
    - port: 9300
      targetPort: 9300
      name: inter-node
  clusterIP: None # 声明为Headless Service
---
# 可选:对外提供访问的NodePort Service
apiVersion: v1
kind: Service
metadata:
  name: es-nodeport
spec:
  selector:
    name: es
  ports:
    - port: 9200
      targetPort: 9200
      protocol: TCP
  type: NodePort

2. 配置RBAC权限

Elasticsearch需要调用K8s API查询同命名空间下的Pod列表用于自动发现节点,添加以下RBAC配置:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: es-sa
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: es-role
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: es-role-binding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: es-role
subjects:
- kind: ServiceAccount
  name: es-sa
  namespace: default

之后在StatefulSet的spec.template.spec下添加serviceAccountName: es-sa,绑定服务账号。

3. 修改StatefulSet存储配置

你当前配置中所有Pod共用同一个PVC,会导致存储冲突,改为使用volumeClaimTemplates为每个Pod生成独立存储:
删除原StatefulSet中volumes下的persistent-storage静态PVC配置,在StatefulSet的spec层级(和template同级)添加以下配置:

volumeClaimTemplates:
- metadata:
    name: persistent-storage
  spec:
    accessModes: ["ReadWriteOnce"]
    resources:
      requests:
        storage: 10Gi # 按需调整存储大小

4. 调整Elasticsearch配置

更新你的es-config ConfigMap里的elasticsearch.yml内容,添加自动发现相关配置:

cluster.name: es-cluster # 所有节点统一集群名
node.name: ${HOSTNAME} # 用Pod名作为节点名,StatefulSet的Pod名固定为es-0、es-1格式
network.host: 0.0.0.0
discovery.seed_providers: k8s # 启用K8s自动发现
discovery.k8s.service: es-entrypoint # 填写Headless Service名
discovery.k8s.namespace: default # 填写部署的命名空间
discovery.k8s.port: 9300
cluster.initial_master_nodes: ["es-0", "es-1", "es-2"] # 首次集群启动时填写master候选节点,集群稳定后可删除该配置

同时在StatefulSet的containers.env下添加JVM堆内存配置,避免内存溢出:

env:
- name: ES_JAVA_OPTS
  value: "-Xms4g -Xmx4g" # 堆内存设为Pod申请内存的一半,你申请了8G内存,这里设为4G

另外修正你原有资源配置的单位错误,把memory: 8改为memory: 8Gi。

5. 验证

所有配置修改完成后重新部署,扩容replicas到3即可看到节点自动加入集群,执行kubectl exec -it es-0 -- curl http://localhost:9200/_cat/nodes即可查看所有集群节点。


内容的提问来源于stack exchange,提问作者Joey Yi Zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 15:36:03