ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Elasticsearch三节点集群K8s高可用完整搭建

Elasticsearch三节点集群K8s高可用完整搭建 Elasticsearch三节点集群K8s高可用完整搭建技术栈Kubernetes v1.32.13 Rocky Linux 8.6 Elasticsearch 8.11.x Containerd 1.7.x操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案Elasticsearch三节点集群K8s高可用完整搭建操作环境K8s 集群 3 节点k8s-master(192.168.1.10), k8s-node1(192.168.1.11), k8s-node2(192.168.1.12)Elasticsearch 部署于 K8s 集群中Elasticsearch 版本 8.11.x容器镜像 elasticsearch:8.11使用 Containerd 作为容器运行时持久化存储已配置 StorageClassElasticsearch 数据目录 /usr/share/elasticsearch/data 通过 PVC 挂载预留足够存储空间节点配置满足业务需求已配置资源 requests/limits使用 ConfigMap 挂载配置文件Secret 加密存储密码已安装 Helm v3.x 或使用原生 YAML 清单部署K8s 版本 v1.32.13对接原理Elasticsearch 容器化部署是将 Elasticsearch 以 Pod 形式运行在 K8s 集群中通过 PVCPersistentVolumeClaim实现数据持久化确保 Pod 重建或迁移后数据不丢失。Elasticsearch 容器通过 ConfigMap 挂载配置文件实现配置与镜像分离通过 Secret 加密存储账号密码。Service 提供稳定的访问入口ClusterIP 或 NodePort业务 Pod 通过 Service 域名访问 Elasticsearch。StatefulSet 管理 Elasticsearch Pod 生命周期配合节点亲和性nodeAffinity将 Elasticsearch 固定在特定节点避免 Pod 漂移导致性能波动。探针livenessProbe/readinessProbe确保服务健康状态自动检测和恢复。详细步骤1. 创建命名空间和持久化存储PVC# 创建命名空间 kubectl create namespace middleware ​ # 查看可用 StorageClass kubectl get storageclass ​ # 创建 PVC cat /tmp/elasticsearch-pvc.yaml EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: elasticsearch-data-pvc namespace: middleware spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi storageClassName: local-storage EOF kubectl apply -f /tmp/elasticsearch-pvc.yaml kubectl get pvc -n middleware2. 创建 ConfigMap 挂载 Elasticsearch 配置文件# 创建 ConfigMap cat /tmp/elasticsearch-configmap.yaml EOF apiVersion: v1 kind: ConfigMap metadata: name: elasticsearch-config namespace: middleware data: elasticsearch.yml: | # Elasticsearch 配置文件 # 根据业务需求调整参数 EOF kubectl apply -f /tmp/elasticsearch-configmap.yaml kubectl get configmap -n middleware3. 创建 Secret 加密存储密码# 创建 Secret echo -n Root123456 /tmp/password kubectl create secret generic elasticsearch-secret --namespacemiddleware --from-filepassword/tmp/password rm -f /tmp/password kubectl get secret -n middleware4. 创建 Service 提供访问入口# 创建 Service cat /tmp/elasticsearch-service.yaml EOF apiVersion: v1 kind: Service metadata: name: elasticsearch-service namespace: middleware labels: app: elasticsearch spec: type: ClusterIP ports: - port: 9200 targetPort: 9200 protocol: TCP name: elasticsearch selector: app: elasticsearch EOF kubectl apply -f /tmp/elasticsearch-service.yaml kubectl get svc -n middleware5. 创建 StatefulSet 部署 Elasticsearch# 创建 StatefulSet cat /tmp/elasticsearch-deploy.yaml EOF apiVersion: apps/v1 kind: StatefulSet metadata: name: elasticsearch namespace: middleware labels: app: elasticsearch spec: serviceName: elasticsearch-service selector: matchLabels: app: elasticsearch template: metadata: labels: app: elasticsearch spec: containers: - name: elasticsearch image: elasticsearch:8.11 imagePullPolicy: IfNotPresent ports: - containerPort: 9200 env: - name: PASSWORD valueFrom: secretKeyRef: name: elasticsearch-secret key: password resources: requests: cpu: 1 memory: 2Gi limits: cpu: 4 memory: 8Gi volumeMounts: - name: data mountPath: /usr/share/elasticsearch/data - name: config mountPath: /usr/share/elasticsearch/config/elasticsearch.yml subPath: elasticsearch.yml livenessProbe: tcpSocket: port: 9200 initialDelaySeconds: 60 periodSeconds: 10 readinessProbe: tcpSocket: port: 9200 initialDelaySeconds: 30 periodSeconds: 5 volumes: - name: data persistentVolumeClaim: claimName: elasticsearch-data-pvc - name: config configMap: name: elasticsearch-config EOF kubectl apply -f /tmp/elasticsearch-deploy.yaml kubectl get pods -n middleware -w6. 验证连接和初始化# 查看 Pod 状态 kubectl get pods -n middleware -l appelasticsearch ​ # 查看日志 kubectl logs -f $(kubectl get pods -n middleware -l appelasticsearch -o jsonpath{.items[0].metadata.name}) -n middleware ​ # 集群内通过 Service 访问测试 kubectl run elasticsearch-client --imageelasticsearch:8.11 -n middleware --rm -it --restartNever -- sh -c echo 连接测试成功 ​ # 验证持久化 kubectl get pvc elasticsearch-data-pvc -n middleware验证流程# 1. Pod 运行状态 kubectl get pods -n middleware -l appelasticsearch # 预期STATUSRunning, READY1/1 ​ # 2. PVC 绑定状态 kubectl get pvc elasticsearch-data-pvc -n middleware # 预期STATUSBound ​ # 3. Service 访问入口 kubectl get svc elasticsearch-service -n middleware # 预期TYPEClusterIP, PORT(S)9200/TCP ​ # 4. ConfigMap 和 Secret kubectl get configmap,secret -n middleware | grep elasticsearch # 预期均存在 ​ # 5. 连通性测试 kubectl exec -it $(kubectl get pods -n middleware -l appelasticsearch -o jsonpath{.items[0].metadata.name}) -n middleware -- sh -c echo test # 预期命令执行成功 ​ # 6. 持久化验证删除 Pod 后数据保留 kubectl delete pod $(kubectl get pods -n middleware -l appelasticsearch -o jsonpath{.items[0].metadata.name}) -n middleware sleep 30 kubectl get pods -n middleware -l appelasticsearch # 预期Pod 重建后 Running数据未丢失排错方案集群启动失败检查 discovery.seed_hosts、cluster.initial_master_nodes、网络配置分片未分配检查节点资源、磁盘水位、分片分配策略、节点标签查询慢检查索引设计、分片数、查询语句、缓存配置、JVM 堆JVM OOM检查堆内存配置、fielddata、聚合查询、索引缓存磁盘爆满检查索引保留策略、ILM、分片大小、存储配置脑裂风险检查 minimum_master_nodes/discovery.zen.minimum_master_nodes节点离线检查资源限制、探针配置、网络稳定性、JVM GC索引膨胀检查 mapping 设计、字段类型、doc_values、_source
返回列表