K8S 中使用 YAML 安装 ECK
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 陡峭,但一旦掌握,你将获得更精细的集群管理能力。
更多推荐

所有评论(0)