1. 项目概述
在Kubernetes生态中部署Elasticsearch集群一直是个技术挑战,而ECK(Elastic Cloud on Kubernetes)的出现彻底改变了这个局面。作为Elastic官方推出的Kubernetes Operator,ECK让Elasticsearch、Kibana、APM等组件的部署和管理变得前所未有的简单。本文将详细演示如何通过YAML文件在K8S环境中快速部署生产级ECK集群。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置条件
2.1 基础环境要求
- Kubernetes集群版本不低于1.21
- 每个节点至少4GB可用内存
- 集群已配置默认StorageClass
- kubectl已配置正确上下文
重要提示:生产环境建议使用3个及以上工作节点,确保Elasticsearch节点可以分散部署
2.2 安装ECK Operator
首先部署ECK的Operator控制器:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: elastic-operator
namespace: elastic-system
spec:
replicas: 1
selector:
matchLabels:
control-plane: elastic-operator
template:
metadata:
labels:
control-plane: elastic-operator
spec:
containers:
- name: elastic-operator
image: docker.elastic.co/eck/operator:2.8.0
env:
- name: OPERATOR_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
resources:
limits:
memory: 1Gi
requests:
cpu: 100m
memory: 100Mi
应用该配置后,可以通过以下命令验证Operator状态:
bash复制kubectl -n elastic-system get pods
3. Elasticsearch集群部署实战
3.1 基础集群配置
创建elasticsearch.yaml文件定义集群规格:
yaml复制apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 8.11.4
nodeSets:
- name: default
count: 3
config:
node.roles: ["master", "data"]
podTemplate:
spec:
containers:
- name: elasticsearch
resources:
limits:
memory: 4Gi
requests:
cpu: 1
memory: 4Gi
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 50Gi
关键参数说明:
node.roles:定义节点角色(建议生产环境分离master和data节点)volumeClaimTemplates:配置持久化存储resources:根据实际负载调整资源限制
3.2 高级配置技巧
3.2.1 自定义JVM参数
在spec.nodeSets.config中添加:
yaml复制config:
xpack.ml.enabled: false
cluster.routing.allocation.disk.threshold_enabled: true
3.2.2 配置Ingress暴露服务
yaml复制apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: elasticsearch-ingress
annotations:
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
spec:
rules:
- host: elasticsearch.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: quickstart-es-http
port:
number: 9200
4. Kibana集成部署
4.1 基础部署配置
创建kibana.yaml文件:
yaml复制apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: quickstart
spec:
version: 8.11.4
count: 1
elasticsearchRef:
name: quickstart
podTemplate:
spec:
containers:
- name: kibana
resources:
limits:
memory: 1Gi
requests:
cpu: 0.5
memory: 1Gi
4.2 访问配置优化
通过Service暴露Kibana:
yaml复制apiVersion: v1
kind: Service
metadata:
name: kibana-external
spec:
type: LoadBalancer
ports:
- port: 5601
targetPort: 5601
selector:
kibana.k8s.elastic.co/name: quickstart
5. 运维与监控
5.1 健康状态检查
常用诊断命令:
bash复制# 查看集群健康状态
kubectl get elasticsearch
# 查看详细节点状态
kubectl describe elasticsearch quickstart
# 查看Pod日志
kubectl logs -f quickstart-es-default-0
5.2 自动扩缩容配置
通过HorizontalPodAutoscaler实现自动扩缩容:
yaml复制apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: elasticsearch-autoscaler
spec:
scaleTargetRef:
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
name: quickstart
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
6. 安全配置最佳实践
6.1 TLS证书配置
ECK默认会自动生成证书,如需自定义:
yaml复制spec:
http:
tls:
selfSignedCertificate:
disabled: true
certificate:
secretName: custom-certificate
6.2 基于角色的访问控制
配置Elasticsearch用户角色:
yaml复制apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: secure-cluster
spec:
auth:
roles:
- name: admin
cluster: ["all"]
indices:
- names: ["*"]
privileges: ["all"]
7. 故障排查与常见问题
7.1 Pod启动失败排查步骤
- 检查事件日志:
bash复制kubectl describe pod quickstart-es-default-0
- 查看初始化容器日志:
bash复制kubectl logs quickstart-es-default-0 -c elastic-internal-init-filesystem
- 验证存储卷状态:
bash复制kubectl get pvc
7.2 性能优化建议
- 数据节点JVM堆内存设置为不超过物理内存的50%
- 为热数据节点配置SSD存储类
- 定期执行_shrink API减少分片数量
8. 版本升级策略
ECK支持无缝升级Elasticsearch集群:
- 先升级Operator:
bash复制kubectl set image deployment/elastic-operator \
elastic-operator=docker.elastic.co/eck/operator:2.9.0 \
-n elastic-system
- 修改Elasticsearch资源中的version字段
- 观察滚动升级过程:
bash复制kubectl get pods -w
9. 备份与恢复方案
9.1 配置快照仓库
yaml复制apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
snapshotRepositories:
- name: backup-repo
type: gcs
settings:
bucket: my-backup-bucket
client: default
9.2 定期快照策略
通过CronJob创建定期快照:
yaml复制apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: es-snapshot
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: snapshotter
image: appropriate/curl
command:
- /bin/sh
- -c
- |
curl -X PUT "quickstart-es-http:9200/_snapshot/backup-repo/snapshot_$(date +%Y%m%d)?wait_for_completion=true"
restartPolicy: OnFailure
10. 生产环境部署建议
-
节点角色分离:
- 专用master节点(至少3个)
- 独立data节点
- 独立ingest节点
-
资源分配示例:
yaml复制nodeSets:
- name: master
count: 3
config:
node.roles: ["master"]
resources:
limits:
memory: 4Gi
requests:
cpu: 2
memory: 4Gi
- name: data
count: 5
config:
node.roles: ["data"]
resources:
limits:
memory: 16Gi
requests:
cpu: 4
memory: 16Gi
- 监控集成:
- 配置Metricbeat收集集群指标
- 使用Elastic APM监控应用性能
在K8S上运行ECK两年多来,最大的经验教训是一定要给Elasticsearch节点配置充足的内存资源,并确保持久化存储有足够的IOPS能力。当集群规模超过20个节点时,建议考虑引入专用协调节点来分担查询负载。
