1. 项目概述:ECK在K8S中的部署价值
Elastic Cloud on Kubernetes(ECK)是Elastic官方提供的Kubernetes Operator,它彻底改变了在K8S集群中部署和管理Elasticsearch集群的方式。相比传统的手动部署,ECK通过声明式YAML配置实现了自动化生命周期管理,包括节点扩缩容、版本升级、证书轮换等复杂操作。
在实际生产环境中,我们团队经历过从Helm chart迁移到ECK的完整过程。最直观的体验是:当需要将Elasticsearch集群从6.8版本升级到7.14时,传统方式需要手动协调滚动重启、配置迁移等操作,而ECK只需修改YAML中的imageTag字段即可自动完成零停机升级。这种"基础设施即代码"的实践,特别适合需要同时管理多个Elasticsearch集群的场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置条件
2.1 基础环境要求
- Kubernetes集群版本不低于1.21(推荐1.23+)
- 每个节点至少2核CPU和4GB内存(生产环境建议8核16GB起)
- 已配置默认StorageClass(ECK依赖动态存储供应)
- kubectl和helm命令行工具已安装
重要提示:如果集群启用了Pod安全策略(PSP),需要预先创建允许ECK操作的ClusterRole。在PSP被弃用的新版本中,需改用PodSecurity Admission。
2.2 资源配额规划
对于测试环境,建议使用以下资源配置:
yaml复制resources:
requests:
memory: "4Gi"
cpu: "2"
limits:
memory: "8Gi"
cpu: "4"
生产环境则需要根据数据量估算:
- 计算存储需求:原始日志大小 × 副本数 × 压缩率(通常0.5)
- 内存配置:堆内存 = Min(32GB, 机器内存/2)
- 分片规划:每GB堆内存对应20-25个分片
3. ECK Operator安装详解
3.1 通过YAML快速部署
基础安装只需三个步骤:
- 添加Elastic Helm仓库:
bash复制helm repo add elastic https://helm.elastic.co
- 安装ECK Operator:
bash复制helm install elastic-operator elastic/eck-operator -n elastic-system --create-namespace
- 验证Operator状态:
bash复制kubectl -n elastic-system get pods
3.2 定制化安装配置
对于需要自定义配置的场景,推荐使用values.yaml覆盖默认参数。以下是关键配置示例:
yaml复制# values.yaml
global:
kibanaEnabled: true
logLevel: debug
podAnnotations:
monitoring.elastic.co/type: "operator"
resources:
limits:
cpu: 1
memory: 1Gi
然后通过helm upgrade应用配置:
bash复制helm upgrade -f values.yaml elastic-operator elastic/eck-operator -n elastic-system
4. Elasticsearch集群部署实战
4.1 最小化集群配置
创建基础Elasticsearch集群的YAML示例:
yaml复制apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 8.4.1
nodeSets:
- name: default
count: 3
config:
node.roles: ["master", "data", "ingest"]
podTemplate:
spec:
containers:
- name: elasticsearch
resources:
limits:
memory: 4Gi
cpu: 2
应用配置并检查状态:
bash复制kubectl apply -f elasticsearch.yaml
kubectl get elasticsearch
4.2 生产级集群配置要点
- 节点角色分离:
yaml复制nodeSets:
- name: master
count: 3
config:
node.roles: ["master"]
- name: data_hot
count: 5
config:
node.roles: ["data_hot"]
- name: ingest
count: 2
config:
node.roles: ["ingest"]
- 持久卷配置:
yaml复制volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "fast-ssd"
resources:
requests:
storage: 500Gi
- 安全加固配置:
yaml复制http:
tls:
selfSignedCertificate:
disabled: false
auth:
fileRealm:
- username: admin
password: "$2a$10$N9qo8uLOickgx2ZMRZoMy..."
5. Kibana与APM集成部署
5.1 Kibana基础部署
与Elasticsearch关联的Kibana部署示例:
yaml复制apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: quickstart-kb
spec:
version: 8.4.1
count: 2
elasticsearchRef:
name: quickstart
podTemplate:
spec:
containers:
- name: kibana
resources:
limits:
cpu: 1
memory: 1Gi
5.2 APM Server配置
实现应用性能监控的APM Server部署:
yaml复制apiVersion: apm.k8s.elastic.co/v1
kind: ApmServer
metadata:
name: apm-server
spec:
version: 8.4.1
count: 2
elasticsearchRef:
name: quickstart
http:
service:
spec:
type: LoadBalancer
6. 运维与监控实践
6.1 集群扩缩容操作
横向扩展data节点数量:
bash复制kubectl patch elasticsearch quickstart --type='json' -p='[{"op": "replace", "path": "/spec/nodeSets/0/count", "value": 5}]'
垂直调整资源配额:
yaml复制spec:
nodeSets:
- name: default
podTemplate:
spec:
containers:
- name: elasticsearch
resources:
limits:
cpu: 4
memory: 8Gi
6.2 监控与告警配置
- 启用内置监控:
yaml复制spec:
monitoring:
metrics:
elasticsearchRef:
name: monitoring
logs:
elasticsearchRef:
name: monitoring
- 对接Prometheus:
yaml复制apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: elasticsearch-monitor
spec:
endpoints:
- port: http
path: /_prometheus/metrics
selector:
matchLabels:
elasticsearch.k8s.elastic.co/cluster-name: quickstart
7. 故障排查与优化
7.1 常见问题处理
- Pod启动失败检查:
bash复制kubectl describe pod -n elastic-system elastic-operator-0
kubectl logs -n elastic-system elastic-operator-0
- 磁盘空间不足处理:
bash复制# 临时清理
kubectl exec elasticsearch-quickstart-es-default-0 -- curl -XPOST "localhost:9200/_all/_forcemerge?max_num_segments=1"
# 长期方案
kubectl patch elasticsearch quickstart --type='json' -p='[{"op": "add", "path": "/spec/nodeSets/0/volumeClaimTemplates/0/spec/resources/requests/storage", "value": "1Ti"}]'
7.2 性能调优建议
- JVM堆内存配置:
yaml复制config:
jvm:
options:
- "-Xms4g"
- "-Xmx4g"
- 索引生命周期管理:
yaml复制spec:
indexLifecyclePolicies:
hot-warm-cold:
phases:
hot:
actions:
rollover:
max_size: "50gb"
warm:
min_age: 7d
actions:
shrink:
number_of_shards: 1
8. 版本升级与备份策略
8.1 滚动升级流程
- 小版本升级(如8.3→8.4):
bash复制kubectl patch elasticsearch quickstart --type='json' -p='[{"op": "replace", "path": "/spec/version", "value": "8.4.1"}]'
- 大版本升级(如7.x→8.x):
yaml复制spec:
upgrade:
version: "8.4.1"
readinessProbe:
timeout: "24h"
8.2 数据备份方案
- 配置快照仓库:
yaml复制apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
snapshotRepositories:
- name: backup-repo
type: gcs
settings:
bucket: "my-backup-bucket"
- 创建定时快照策略:
yaml复制apiVersion: elasticsearch.k8s.elastic.co/v1
kind: SnapshotLifecyclePolicy
metadata:
name: daily-snapshots
spec:
name: "<daily-snap-{now/d}>"
schedule: "0 30 1 * * ?"
repository: "backup-repo"
config:
indices: ["*"]
在实施ECK部署过程中,我们发现最大的挑战往往来自存储配置和网络策略。特别是在多租户集群中,需要仔细规划StorageClass和NetworkPolicy以确保隔离性。一个实用的技巧是:在开发环境使用Local PV模拟生产环境的存储性能特征,这能提前发现很多IO相关的性能问题。
