1. 为什么要在K8S中使用YAML安装ECK
在Kubernetes环境中部署Elastic Cloud on Kubernetes(ECK)时,YAML文件是最常用的配置方式。这主要基于以下几个技术考量:
声明式配置优势:YAML文件采用声明式语法,可以清晰描述ECK集群的期望状态,K8S控制器会自动将当前状态调整为声明状态。相比命令式操作,这种方式更易于版本控制和变更管理。
基础设施即代码:YAML文件可以被纳入Git版本控制系统,实现ECK部署的代码化管理。这对于生产环境的配置审计和回滚特别重要。
可重复部署:相同的YAML配置可以在不同环境(开发、测试、生产)中重复使用,确保环境一致性。
2. ECK安装前的环境准备
2.1 基础环境要求
在开始安装ECK之前,需要确保Kubernetes集群满足以下要求:
- Kubernetes版本不低于1.18
- 集群具有足够的资源(建议至少4核CPU和8GB内存)
- 配置了正确的StorageClass
- 已安装kubectl命令行工具并配置好集群访问权限
2.2 必要的组件检查
使用以下命令检查集群状态:
kubectl get nodes kubectl get storageclass kubectl get pods -A3. 编写ECK安装的YAML配置文件
3.1 基本YAML结构
一个典型的ECK安装YAML文件包含以下主要部分:
apiVersion: operator.k8s.elastic.co/v1 kind: Elasticsearch metadata: name: quickstart spec: version: 8.8.1 nodeSets: - name: default count: 1 config: node.store.allow_mmap: false3.2 关键配置参数解析
版本控制:
version: 8.8.1必须明确指定Elasticsearch版本,ECK不支持自动版本升级。
节点配置:
nodeSets: - name: default count: 3 config: node.roles: ["master", "data"]可以定义多个节点组,每个组可以配置不同的角色和资源。
存储配置:
volumeClaimTemplates: - metadata: name: elasticsearch-data spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 30Gi
4. 部署和验证ECK集群
4.1 应用YAML配置
使用kubectl应用YAML文件:
kubectl apply -f eck-install.yaml4.2 部署状态监控
查看ECK操作器日志:
kubectl logs -f -n elastic-system statefulset.apps/elastic-operator检查Elasticsearch集群状态:
kubectl get elasticsearch4.3 访问集群
获取访问凭证:
kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode创建端口转发:
kubectl port-forward service/quickstart-es-http 92005. 生产环境配置建议
5.1 高可用配置
对于生产环境,建议至少配置3个master节点和2个data节点:
nodeSets: - name: master count: 3 config: node.roles: ["master"] - name: data count: 2 config: node.roles: ["data"]5.2 资源限制
为Pod设置合理的资源限制:
resources: limits: cpu: "2" memory: 4Gi requests: cpu: "1" memory: 2Gi5.3 持久化存储
使用持久卷确保数据安全:
volumeClaimTemplates: - metadata: name: elasticsearch-data spec: accessModes: ["ReadWriteOnce"] storageClassName: "standard" resources: requests: storage: 100Gi6. 常见问题排查
6.1 Pod启动失败
可能原因:
- 资源不足
- 镜像拉取失败
- 存储配置错误
排查步骤:
kubectl describe pod <pod-name> kubectl logs <pod-name>6.2 集群健康状态异常
检查集群健康状态:
kubectl get elasticsearch quickstart -o=jsonpath='{.status.health}'常见修复方法:
- 增加节点资源
- 检查网络连接
- 验证存储配置
6.3 性能优化建议
JVM堆内存设置:
config: xpack.ml.enabled: false xpack.security.enabled: true禁用不必要的功能模块
7. 升级和运维
7.1 版本升级
ECK支持滚动升级,修改YAML中的version字段即可:
version: 8.9.0然后重新应用配置:
kubectl apply -f eck-install.yaml7.2 备份恢复
配置快照仓库:
spec: snapshotRepositories: - name: my-backup type: gcs settings: bucket: "my-es-backups"7.3 监控告警
集成Prometheus监控:
monitoring: metrics: enabled: true logs: enabled: true8. 安全配置
8.1 网络策略
限制Pod间通信:
spec: podTemplate: spec: networkPolicy: ingress: - from: - podSelector: matchLabels: role: elasticsearch8.2 TLS加密
启用传输层加密:
spec: http: tls: selfSignedCertificate: disabled: false8.3 访问控制
配置RBAC规则:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: elasticsearch-reader rules: - apiGroups: [""] resources: ["pods", "pods/log"] verbs: ["get", "list", "watch"]9. 性能调优实战
9.1 JVM参数优化
config: es.logger.level: INFO thread_pool.search.size: 20 thread_pool.search.queue_size: 10009.2 索引管理策略
通过ILM管理索引生命周期:
spec: indexLifecyclePolicies: - name: hot-warm-cold phases: hot: actions: rollover: max_size: "50gb" warm: min_age: "7d" actions: shrink: number_of_shards: 19.3 查询性能优化
配置查询缓存:
config: indices.queries.cache.size: "10%" indices.fielddata.cache.size: "30%"10. 扩展与集成
10.1 与Kibana集成
部署Kibana实例:
apiVersion: kibana.k8s.elastic.co/v1 kind: Kibana metadata: name: quickstart spec: version: 8.8.1 count: 1 elasticsearchRef: name: quickstart10.2 与APM集成
配置APM服务器:
apiVersion: apm.k8s.elastic.co/v1 kind: ApmServer metadata: name: quickstart spec: version: 8.8.1 count: 1 elasticsearchRef: name: quickstart10.3 自定义插件安装
通过init容器安装插件:
podTemplate: spec: initContainers: - name: install-plugins image: docker.elastic.co/elasticsearch/elasticsearch:8.8.1 command: ["sh", "-c", "bin/elasticsearch-plugin install analysis-icu"]