如何在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

