K8S 中使用 YAML 安装 ECK

作为运维或开发人员,你可能已经习惯了在 Kubernetes 上管理应用,但当涉及到 Elasticsearch、Kibana 这些重量级组件时,手动搭建集群、配置存储、维护版本更新往往让人头疼。这时候,ECK(Elastic Cloud on Kubernetes) 就派上用场了。它让你能用熟悉的 YAML 声明式地管理整个 Elastic 生态。今天,我将带你一步步通过纯 YAML 文件在 K8S 上安装 ECK。整个过程不依赖 Helm,也不借助 Operator Lifecycle Manager,适合对 K8S 深层次控制有需求的场景。## 为什么选择 YAML 安装 ECK?ECK 本质上是一个 Kubernetes Operator。官方推荐使用 Helm 安装,但 YAML 方式有它独特的优势:- 完全透明:你能看到每一个 CRD、ServiceAccount、ClusterRole 的细节。- 离线部署友好:在有网络隔离的环境中,预下载 YAML 文件即可部署。- 精确控制:可以微调 Operator 的 Deployment 参数,比如资源限制、节点亲和性。当然,YAML 方式也意味着你需要手动处理更多细节,但正因如此,你会对 ECK 的工作原理有更深的理解。## 准备工作:理解 ECK 的核心组件在开始写 YAML 之前,我们先搞清楚 ECK 安装后到底会部署什么:1. Operator:一个运行在 K8S 中的 Pod,它监听 Elasticsearch、Kibana 等自定义资源。2. CRD:自定义资源定义,告诉 K8S 什么是 Elasticsearch、Kibana 等。3. RBAC:权限控制,让 Operator 有权限管理 Pod、Service、PVC 等资源。我们的 YAML 安装过程,本质上就是创建这些基础组件。## 第一步:下载并应用 ECK 的 CRD 和 OperatorECK 官方提供了完整的 YAML 文件。我们使用最新稳定版本 2.12.0(以实际为准)。首先,创建所有必要的自定义资源定义。yaml# eck-crds.yaml# 此文件包含了所有 ECK 支持的 CRD,如 Elasticsearch、Kibana、ApmServer 等apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: annotations: controller-gen.kubebuilder.io/version: v0.11.2 name: elasticsearches.elasticsearch.k8s.elastic.cospec: group: elasticsearch.k8s.elastic.co names: kind: Elasticsearch listKind: ElasticsearchList plural: elasticsearches singular: elasticsearch scope: Namespaced versions: - name: v1 schema: openAPIV3Schema: description: Elasticsearch 是 Elasticsearch 集群的 Schema properties: apiVersion: type: string kind: type: string metadata: type: object spec: type: object x-kubernetes-preserve-unknown-fields: true status: type: object x-kubernetes-preserve-unknown-fields: true type: object served: true storage: true subresources: status: {}> 注意:完整 CRD 文件很长,包含多个资源定义。实际部署时建议从 ECK 官方 GitHub 仓库 下载完整 crds.yaml。## 第二步:创建 Operator 的 RBAC 权限Operator 需要权限来管理 Pod、Service、ConfigMap 等资源。我们创建一个专用的 ServiceAccount 并绑定必要的 ClusterRole。yaml# eck-rbac.yaml# 为 ECK Operator 创建 ServiceAccount 和必要的 RBAC 权限---apiVersion: v1kind: ServiceAccountmetadata: name: elastic-operator namespace: elastic-system # 我们将在 elastic-system 命名空间部署 Operator---# 集群级别的角色:允许 Operator 管理跨命名空间资源apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: elastic-operatorrules:- apiGroups: [""] resources: ["pods", "services", "configmaps", "secrets"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]- apiGroups: ["apps"] resources: ["statefulsets", "deployments"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]- apiGroups: ["batch"] resources: ["jobs"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]- apiGroups: ["elasticsearch.k8s.elastic.co"] resources: ["elasticsearches", "kibanas"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]---# 将 ServiceAccount 绑定到 ClusterRoleapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: elastic-operatorroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: elastic-operatorsubjects:- kind: ServiceAccount name: elastic-operator namespace: elastic-system## 第三步:部署 ECK Operator现在,我们创建 Operator 的 Deployment。这个 Deployment 会启动一个 Pod,持续监听 Elasticsearch 等资源的变化。yaml# eck-operator.yaml# ECK Operator 的 Deployment 配置apiVersion: apps/v1kind: Deploymentmetadata: name: elastic-operator namespace: elastic-system labels: control-plane: elastic-operatorspec: selector: matchLabels: control-plane: elastic-operator replicas: 1 # 生产环境建议至少 2 个副本 template: metadata: labels: control-plane: elastic-operator spec: serviceAccountName: elastic-operator containers: - name: manager image: docker.elastic.co/eck/eck-operator:2.12.0 # 使用指定版本 args: - manager - --leader-elect=true # 多副本时启用选举 env: - name: OPERATOR_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace ports: - containerPort: 9443 name: webhook-server protocol: TCP livenessProbe: httpGet: path: /healthz port: 8081 initialDelaySeconds: 15 periodSeconds: 20 readinessProbe: httpGet: path: /readyz port: 8081 initialDelaySeconds: 5 periodSeconds: 10 resources: limits: cpu: 500m memory: 512Mi requests: cpu: 200m memory: 256Mi## 第四步:应用所有 YAML 并验证将上面三个 YAML 文件保存后,按顺序应用:bash# 1. 创建命名空间kubectl create namespace elastic-system# 2. 应用 CRD(先下载完整 crds.yaml)kubectl apply -f eck-crds.yaml# 3. 应用 RBACkubectl apply -f eck-rbac.yaml# 4. 部署 Operatorkubectl apply -f eck-operator.yaml验证 Operator 是否正常运行:bashkubectl get pods -n elastic-system# 输出示例:# NAME READY STATUS RESTARTS AGE# elastic-operator-6d9f8c9b7c-abc12 1/1 Running 0 2mkubectl logs -n elastic-system deployment/elastic-operator# 查看日志,确认没有错误## 第五步:用 YAML 创建第一个 Elasticsearch 集群Operator 启动后,我们就可以用自定义资源来创建 Elasticsearch 集群了。下面是一个最小化配置:yaml# quickstart-es.yaml# 创建一个简单的 Elasticsearch 集群,单节点,用于测试apiVersion: elasticsearch.k8s.elastic.co/v1kind: Elasticsearchmetadata: name: quickstart namespace: default # 可以部署在任何命名空间spec: version: 8.12.0 # 指定 Elasticsearch 版本 nodeSets: - name: default count: 1 # 生产环境建议至少 3 个节点 config: node.store.allow_mmap: false # 在某些环境下需要禁用 mmap podTemplate: spec: containers: - name: elasticsearch resources: limits: memory: 2Gi cpu: 1 requests: memory: 1Gi cpu: 500m volumes: - name: elasticsearch-data emptyDir: {} # 测试用,生产环境使用 PVC应用这个 YAML:bashkubectl apply -f quickstart-es.yaml查看 Elasticsearch 集群启动状态:bashkubectl get elasticsearch# 输出示例:# NAME HEALTH NODES VERSION PHASE AGE# quickstart green 1 8.12.0 Ready 1mkubectl get pods -l elasticsearch.k8s.elastic.co/cluster-name=quickstart# 应该看到名为 quickstart-es-default-0 的 Pod## 常见问题与排错1. Operator 无法启动:检查 elastic-system 命名空间是否存在,RBAC 是否绑定正确。2. Elasticsearch Pod 处于 CrashLoopBackOff:查看 Pod 日志,通常是因为 vm.max_map_count 设置不足。在节点上执行 sysctl -w vm.max_map_count=262144。3. 存储问题:如果使用 PVC,确保有默认 StorageClass 可用。## 总结通过纯 YAML 方式安装 ECK,我们不仅完成了 Operator 的部署,更重要的是理解了它的架构:CRD 定义资源模型,RBAC 控制权限,Deployment 运行监控逻辑。这种方式让你在面对特殊环境(如离线集群、自定义网络策略)时更有掌控力。安装只是起点,接下来你可以用同样的 YAML 方式管理 Kibana、APM Server 等组件。当你的 Elasticsearch 集群需要升级版本、扩缩容时,只需修改 YAML 中的 version 或 count 字段,Operator 会自动完成滚动更新。这就是声明式运维的魅力——你描述想要的状态,剩下的交给 Operator。建议你从单节点测试开始,逐步尝试多节点集群、配置 TLS、集成 Kibana。ECK 的 YAML 学习曲线虽然比 Helm 陡峭,但一旦掌握,你将获得更精细的集群管理能力。

更多推荐