1. ECK与Kubernetes集成概述
Elastic Cloud on Kubernetes(ECK)是Elastic官方提供的Kubernetes Operator,它极大简化了Elasticsearch、Kibana、APM等组件在K8S集群中的部署和管理工作。相比传统部署方式,ECK通过自定义资源定义(CRD)和控制器模式,实现了Elastic Stack组件的声明式配置和自动化运维。
在K8S环境中使用YAML部署ECK具有以下显著优势:
- 版本控制:所有配置变更都记录在YAML文件中,便于追踪和回滚
- 可重复性:相同的YAML文件在不同环境能产生一致的部署结果
- 自动化管理:ECK Operator会自动处理节点扩缩容、证书更新等运维操作
- 资源优化:通过YAML可以精确控制每个组件的资源配额
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与ECK Operator安装
2.1 前置条件检查
在开始安装前,需要确认K8S集群满足以下要求:
- Kubernetes 1.21+ 版本(推荐1.23+)
- 每个节点至少2核CPU和4GB内存
- 配置了默认StorageClass
- 集群具有互联网访问权限(用于下载镜像)
验证命令:
bash复制kubectl version --short
kubectl get nodes -o wide
kubectl get storageclass
2.2 安装ECK Operator
使用以下YAML文件部署ECK Operator(版本2.6.1):
yaml复制apiVersion: operator.k8s.io/v1
kind: Operator
metadata:
name: elastic-operator
namespace: elastic-system
spec:
channel: stable
packageName: elastic-operator
version: 2.6.1
应用配置:
bash复制kubectl apply -f eck-operator.yaml
验证安装:
bash复制kubectl -n elastic-system get pods
# 预期看到elastic-operator开头的Pod状态为Running
3. Elasticsearch集群部署配置
3.1 基础集群配置
以下YAML定义了一个3节点的Elasticsearch集群:
yaml复制apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 8.6.2
nodeSets:
- name: default
count: 3
config:
node.store.allow_mmap: false
podTemplate:
spec:
containers:
- name: elasticsearch
resources:
requests:
memory: 4Gi
cpu: 2
limits:
memory: 8Gi
cpu: 4
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard"
resources:
requests:
storage: 100Gi
关键参数说明:
version:指定Elasticsearch版本nodeSets.count:节点数量resources:资源配置请求和限制volumeClaimTemplates:持久化存储配置
3.2 安全配置
ECK默认启用安全功能,自动生成以下安全凭证:
- 默认用户
elastic的密码 - TLS证书
- 加密密钥
获取elastic用户密码:
bash复制kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}'
4. Kibana部署与集成
4.1 Kibana基础部署
对应Elasticsearch的Kibana部署YAML:
yaml复制apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: quickstart
spec:
version: 8.6.2
count: 1
elasticsearchRef:
name: quickstart
podTemplate:
spec:
containers:
- name: kibana
resources:
requests:
memory: 1Gi
cpu: 0.5
limits:
memory: 2Gi
cpu: 1
4.2 访问Kibana
获取访问地址:
bash复制kubectl get service quickstart-kb-http
使用之前获取的elastic用户密码登录。如果需要外部访问,可以创建Ingress:
yaml复制apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kibana-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: kibana.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: quickstart-kb-http
port:
number: 5601
5. 高级配置与调优
5.1 节点角色分配
生产环境建议分离主节点和数据节点:
yaml复制spec:
nodeSets:
- name: master
count: 3
config:
node.roles: ["master"]
podTemplate:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
elasticsearch.k8s.elastic.co/cluster-name: quickstart
elasticsearch.k8s.elastic.co/node-set-name: master
topologyKey: "kubernetes.io/hostname"
- name: data
count: 5
config:
node.roles: ["data"]
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
storageClassName: "fast-ssd"
resources:
requests:
storage: 500Gi
5.2 资源限制与JVM调优
JVM堆内存应设置为不超过容器内存限制的50%:
yaml复制 config:
node.store.allow_mmap: false
# JVM配置
ES_JAVA_OPTS: "-Xms4g -Xmx4g"
resources:
requests:
memory: "8Gi"
limits:
memory: "8Gi"
6. 运维与监控
6.1 集群健康检查
bash复制kubectl get elasticsearch
kubectl get pods -l elasticsearch.k8s.elastic.co/cluster-name=quickstart
6.2 日志收集配置
ECK内置了日志收集功能,可以通过以下配置启用:
yaml复制spec:
logging:
stdout:
enabled: true
file:
enabled: true
volumeMount:
name: elasticsearch-logs
mountPath: /usr/share/elasticsearch/logs
6.3 备份与恢复
配置快照仓库:
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"
创建快照策略:
yaml复制apiVersion: elasticsearch.k8s.elastic.co/v1
kind: ElasticsearchSnapshotLifecyclePolicy
metadata:
name: daily-snapshots
spec:
name: "<daily-snap-{now/d}>"
schedule: "0 30 1 * * ?"
repository: "backup-repo"
config:
indices: ["*"]
ignore_unavailable: true
include_global_state: false
7. 常见问题排查
7.1 Pod启动失败
检查顺序:
- 查看Pod事件:
kubectl describe pod <pod-name> - 检查Pod日志:
kubectl logs <pod-name> - 验证资源配额是否充足:
kubectl describe nodes
7.2 存储问题
常见错误及解决方案:
Pending状态:检查StorageClass配置和PV资源VolumeBinding失败:确认节点有足够存储空间- 性能问题:考虑使用本地SSD或高性能网络存储
7.3 网络连接问题
诊断方法:
bash复制kubectl run -it --rm --image=alpine network-test -- sh
# 在临时容器中测试
ping quickstart-es-http.elastic-system.svc
telnet quickstart-es-http.elastic-system.svc 9200
8. 版本升级与维护
ECK支持滚动升级,示例升级到8.7.0:
yaml复制apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 8.7.0
updateStrategy:
changeBudget:
maxSurge: 1
maxUnavailable: 0
升级注意事项:
- 先升级ECK Operator
- 测试环境验证新版本
- 生产环境分批次升级
- 确保有可用备份
