1. 为什么要在K8S中使用YAML部署ECK
在Kubernetes环境中部署Elastic Cloud on Kubernetes(ECK)时,YAML文件就像乐高说明书一样重要。我见过太多人直接用kubectl命令行操作,结果第二天就忘了自己部署过什么。YAML文件不仅记录了部署状态,更重要的是能实现版本控制和重复部署。
ECK 1.8版本之后对CRD(Custom Resource Definitions)做了重大调整,比如elasticsearch.k8s.elastic.co/v1这个API版本就废弃了老版本的某些字段。如果不用YAML记录配置,升级时绝对会踩坑。上周我就帮一个客户排查过因为apiVersion不兼容导致Operator无法启动的问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 部署前的关键准备工作
2.1 环境需求检查
先运行kubectl version确认集群版本,ECK 2.6+要求Kubernetes 1.21+。特别注意storageclass是否支持动态卷供应:
bash复制kubectl get storageclass
如果返回"No persistent volumes available",需要先配置NFS或Ceph之类的存储方案。我常用的是rook-ceph,它的性能比hostPath稳定得多。
2.2 必要的工具安装
除了基础的kubectl,还需要:
- yq 4.0+(处理YAML比sed优雅多了)
- helm(虽然我们用YAML直接部署,但有些依赖可能要用到)
bash复制brew install yq helm # Mac
或
snap install yq helm # Ubuntu
3. 核心YAML文件解析
3.1 Operator安装文件
创建eck-operator.yaml:
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.6.1
env:
- name: OPERATOR_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
resources:
limits:
memory: 1Gi
cpu: "1"
关键点说明:
- 一定要限制resources,否则Operator可能OOM杀死你的节点
- 生产环境建议replicas设为2并配置PodAntiAffinity
3.2 Elasticsearch集群配置
elasticsearch.yaml示例:
yaml复制apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 8.6.2
nodeSets:
- name: default
count: 3
config:
node.roles: ["master", "data", "ingest"]
podTemplate:
spec:
containers:
- name: elasticsearch
resources:
requests:
memory: 4Gi
cpu: 2
limits:
memory: 4Gi
cpu: 2
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 100Gi
血泪教训:
- 永远不要混用master/data角色,生产环境必须分离
- JVM堆内存不要超过物理内存的50%(这里设4G是因为Pod有8G)
- volumeClaimTemplates的storage大小不能后期修改
4. 部署实操与验证
4.1 分步执行命令
bash复制# 创建命名空间
kubectl create ns elastic-system
# 应用Operator
kubectl apply -f eck-operator.yaml
# 等待Operator就绪(约2分钟)
watch kubectl get pods -n elastic-system
# 部署Elasticsearch
kubectl apply -f elasticsearch.yaml
# 获取访问凭证
kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' -n elastic-system | base64 --decode
4.2 健康检查关键指标
bash复制# 查看集群健康状态
kubectl get elasticsearch quickstart -o=jsonpath='{.status.health}' -n elastic-system
# 检查所有Pod状态
kubectl get pods --selector='elasticsearch.k8s.elastic.co/cluster-name=quickstart' -n elastic-system
# 查看日志(重点关注init容器)
kubectl logs quickstart-es-default-0 -c elastic-internal-init-filesystem -n elastic-system
常见问题处理:
- 如果Pod卡在Init状态,通常是存储卷权限问题
- CrashLoopBackoff时先检查JVM内存设置
5. 生产环境优化建议
5.1 必须配置的调优参数
在spec中添加:
yaml复制 http:
service:
spec:
type: LoadBalancer
loadBalancerIP: 1.2.3.4 # 生产环境建议固定IP
updateStrategy:
changeBudget:
maxUnavailable: 1
5.2 监控与告警配置
集成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
6. 我踩过的坑及解决方案
-
证书过期问题:
ECK默认证书只有1年有效期,在spec中添加:yaml复制spec: secureSettings: - secretName: ca-certs tls: selfSignedCertificate: disabled: true -
脑裂问题处理:
当master节点失联时,在节点配置中添加:yaml复制config: discovery.zen.minimum_master_nodes: 2 cluster.initial_master_nodes: ["quickstart-es-default-0", "quickstart-es-default-1"] -
滚动升级卡住:
总是先检查Pending的Pod:bash复制
kubectl describe pod quickstart-es-default-2 -n elastic-system | grep -A10 Events
最后提醒:每次修改YAML后,建议用kubectl diff先检查变更内容,避免直接apply导致意外重启。保存所有YAML文件到Git仓库,这是恢复集群的最可靠方式。
