拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在 MicroK8S 上通过 Helm 部署三节点 Elasticsearch 8.1.0 集群:KnowStreaming 环境示例的完整实战指南

在 MicroK8S 上通过 Helm 部署三节点 Elasticsearch 8.1.0 集群:KnowStreaming 环境示例的完整实战指南 后端消息队列运维可观测性【免费下载链接】KnowStreaming一站式云原生实时流数据平台通过0侵入、插件化构建企业级Kafka服务极大降低操作、存储和管理实时流数据门槛项目地址https://gitcode.com/gh_mirrors/kn/KnowStreaming点击查看免费下载本文基于 KnowStreaming 开源仓库内置的 Elasticsearch Helm Chart 及其 MicroK8S 部署示例km-dist/helm/charts/elasticsearch/examples/microk8s/README.md系统讲解如何在本地 MicroK8S 环境快速拉起一个三节点 Elasticsearch 8.1.0 集群。读者将掌握 MicroK8S 所需 Addons 的启用方法、针对本地资源受限场景定制的values.yaml配置逐项解读以及make install一键部署、kubectl port-forward访问验证与helm test回归测试的完整操作链路。背景为什么 KnowStreaming 仓库内置 Elasticsearch 示例KnowStreaming 是一站式云原生实时流数据平台其 Manager 服务依赖 Elasticsearch 存储采集到的 Kafka 集群指标数据。仓库中同时内置了 Elasticsearch Helm Chartkm-dist/helm/charts/elasticsearch/以及一套针对不同本地 Kubernetes 发行版的部署示例其中microk8s示例就是专门面向 MicroK8S 这一轻量级发行版的定制方案。在生产环境中该 Chart 面向多节点、大内存、持久化存储的规模化集群设计直接照搬默认配置默认要求 3 个 K8s 节点、1GB JVM 堆内存在本地单机环境往往难以跑通因此仓库维护者提供了这一套瘦身示例这也是本文要深入剖析的核心。前置条件需要启用的三个 MicroK8S AddonsMicroK8S 通过 Addons 机制提供 DNS、存储、包管理等功能。部署本例前需要先启用以下三个 AddonsAddon作用启用命令dns为集群内 Service 提供 DNS 解析是 Pod 间相互发现包括 Elasticsearch 节点发现的前提microk8s enable dnshelm内置 Helm 客户端用于执行helm upgrade --install部署 Chartmicrok8s enable helmstorage提供默认存储类本例为microk8s-hostpath支撑 StatefulSet 的持久化卷声明microk8s enable storage说明MicroK8S 还支持microk8s enable helm3直接启用 Helm 3实际以当前 MicroK8S 版本支持的 Addon 名为准。启用storage后集群中会注册名为microk8s-hostpath的 StorageClass正是后续values.yaml中volumeClaimTemplate.storageClassName所引用的对象。使用步骤从一键部署到 API 验证第一步执行 Makefile 完成部署在仓库根目录定位到示例目录直接调用 Makefile 中的install目标即可完成 Chart 部署cd km-dist/helm/charts/elasticsearch/examples/microk8s make install对应的 Makefile 实际执行的核心命令是helm upgrade --wait --timeout1200s --install --values values.yaml helm-es-microk8s ../../各参数含义如下参数值说明--wait-等待所有资源就绪StatefulSet 下所有 Pod 进入 Ready 且通过就绪探针后再返回--timeout1200s部署超时上限为 20 分钟避免本地环境拉镜像慢导致误判失败--install-若 Release 不存在则创建存在则执行升级--valuesvalues.yaml指定本示例的定制配置Release 名helm-es-microk8s便于后续helm test、helm del引用Chart 路径../../指向 Chart 根目录km-dist/helm/charts/elasticsearch/第二步配置端口转发并查询 ES API部署完成后通过kubectl port-forward将 Elasticsearch 的 9200 端口转发到本机再使用curl验证集群是否正常工作kubectl port-forward svc/elasticsearch-master 9200 curl localhost:9200/_cat/indicessvc/elasticsearch-master是 Chart 为 master 节点组创建的常规 Service名称遵循$clusterName-$nodeGroup命名规则此处即elasticsearch-master只有 Ready 状态的 Pod 才会被纳入该 Service 的 Endpoints因此转发到它即能访问到健康节点首次启动时_cat/indices会返回空列表此时可先访问curl localhost:9200/_cluster/health观察集群状态待三节点全部加入、集群状态变为 green 后再查询索引。第三步使用 Makefile 执行回归测试可选make test该目标会先执行install随后运行helm test helm-es-microk8s即执行 Chart 内置的测试 Pod。测试逻辑定义在 tests 目录中用于验证集群健康检查接口对应 Chart 中clusterHealthCheckParams的wait_for_statusgreen逻辑。清理集群make purge实际执行helm del helm-es-microk8s删除该 Release 及其管理的全部 Kubernetes 资源。配置解读面向本地环境的 values.yaml 逐项剖析MicroK8S 示例的核心竞争力在于 values.yaml它通过 6 项关键配置把 Chart 默认的生产级参数压缩到本地单机可运行的规格。以下逐项展开并附 Chart 默认值 values.yaml 作为对照1. 关闭特权 init 容器sysctlInitContainer.enabled: falsesysctlInitContainer: enabled: falseElasticsearch 依赖宿主机内核参数vm.max_map_countChart 默认值262144官方 Chart 默认通过一个特权 init 容器来设置该参数对应 Chart 中的sysctlVmMaxMapCount: 262144与sysctlInitContainer: enabled: true默认配置。但特权容器在 MicroK8S 等受限环境可能无法创建受安全策略限制因此示例选择关闭它改用下述的node.store.allow_mmap: false从 Elasticsearch 自身规避对 mmap 的依赖。2. 关闭内存映射node.store.allow_mmap: falseesConfig: elasticsearch.yml: | node.store.allow_mmap: falseesConfig允许向/usr/share/elasticsearch/config/注入任意配置文件如elasticsearch.yml、log4j2.properties。这里将node.store.allow_mmap设为false使 Lucene 不再使用mmap文件系统来访问索引文件。这一设置与第 1 项配置是配套关系既然无法通过特权容器提升vm.max_map_count就关闭 mmap 以避免触发 JVM 崩溃或索引无法创建的错误。其代价是索引访问走堆外缓冲、性能略有下降但对本地测试场景完全可接受。3. 软反亲和antiAffinity: softantiAffinity: softChart 默认以及官方 README 推荐的antiAffinity为hard即强制要求每个 Pod 调度到不同 Kubernetes 节点这需要至少 3 个节点。MicroK8S 单机部署只有一个节点若保持hard会导致 Pod 永远无法全部调度成功。改为soft后反亲和变成尽力而为best effort调度器优先尝试分散 Pod但允许共置。注释中 Permit co-located instances for solitary minikube virtual machines 直接点明了设计意图——为单机虚拟机场景放行共置实例。4. 缩小 JVM 堆esJavaOpts: -Xmx128m -Xms128mesJavaOpts: -Xmx128m -Xms128mChart 通过esJavaOpts向 Elasticsearch 传入 JVM 参数默认值为空字符串。官方 README 明确要求部署时核对 JVM 堆大小默认配置需 1GB 堆内存本地环境往往无法满足。本示例将堆内存收缩到 128MB-Xmx与-Xms相等避免了运行时动态扩缩堆带来的停顿。需要注意堆大小必须与下一条的容器resources.memory匹配堆过大可能导致容器被 OOM Kill。5. 缩减容器资源配额resources: requests: cpu: 100m memory: 512M limits: cpu: 1000m memory: 512MChart 默认不设置resources注释中预留了1Gi的示例生产环境建议按实际负载设置。本示例为每个 Pod 申请 100m CPU0.1 核与 512MB 内存上限为 1 核 CPU 与 512MB 内存。其中内存 request 与 limit 相同512M配合 128MB 的 JVM 堆为堆外内存、文件缓存等预留了充足余量CPU 上限 1000m 保证单 Pod 在突发负载时仍能获得一个完整核的算力。6. 缩小持久卷volumeClaimTemplatevolumeClaimTemplate: accessModes: [ ReadWriteOnce ] storageClassName: microk8s-hostpath resources: requests: storage: 100MChart 默认的持久卷容量为30Gi见 Chart values.yaml 中volumeClaimTemplate的storage: 30Gi生产场景合理但对本地测试是巨大的磁盘浪费。本示例将其缩减为 100MB并显式指定存储类为microk8s-hostpath——这正是microk8s enable storage提供的默认 StorageClass。accessModes: ReadWriteOnce表示卷同一时刻只能被单个节点读写与 StatefulSet 的每 Pod 一卷模型匹配。StorageClass 必须显式指定否则 Chart 会使用集群默认存储类在部分 MicroK8S 环境可能无法命中预期的本地路径卷。深入原理Chart 内部如何落实这些配置StatefulSet 双 Service 的集群发现机制Chart 为每个节点组创建一个 StatefulSet默认replicas: 3、nodeGroup: master并生成两个 Service$clusterName-$nodeGroup与$clusterName-$nodeGroup-headless。前者只收录 Ready 的 Pod端口转发正是使用它后者收录全部 Pod供节点间通过 transport 端口默认 9300互相发现。三节点通过discovery.zen.ping.unicast.hosts汇聚到 master Service 完成集群组建因此本地验证时观察到的三个 Pod 最终会形成一个 green 状态的集群。就绪探针与集群健康联动Chart 的就绪探针readinessProbe配合clusterHealthCheckParams: wait_for_statusgreentimeout1s工作Pod 只有在 Elasticsearch 集群健康状态满足条件时才被标记为 Ready进而被纳入非 headless Service。这正是helm install --wait会等待较长时间本例--timeout1200s的原因——三个节点需要全部就绪且集群变绿部署命令才会返回成功。与 KnowStreaming 生产部署的衔接在 KnowStreaming 的 docker-compose 部署方案 中Elasticsearch 以单节点模式discovery.type: single-node通过SERVER_ES_ADDRESS: elasticsearch-single:9200提供给 Manager而 MicroK8S 示例则展示了同一 ES 能力在 Kubernetes 环境下的三节点形态。无论哪种形态Manager 侧均通过es.client.address见 application.yml连接 ES 完成指标读写。因此本地验证 Elasticsearch 部署时只需保证svc/elasticsearch-master:9200可访问即可模拟生产环境中 Manager 与 ES 的连接方式。注意事项与适用边界仅限测试用途原文档明确指出 this configuration should be used for test only and isnt recommended for production。128MB 堆、100MB 存储卷、关闭 mmap 等均为资源妥协不适合承载真实业务数据版本一致性Chart 声明版本为 7.6.0Chart.yaml而本示例部署的镜像是 8.1.0通过helm install --set imageTag8.1.0或 Chart 8.x 版本传入验证命令与配置应以上述 8.1.0 行为为准Kubernetes 版本要求Chart 官方要求 Kubernetes 1.14、Helm 2.17.0建议直接使用 Helm 3部署前请确认 MicroK8S 版本满足要求存储与 DNS 依赖microk8s-hostpath存储类与集群内 DNS 解析分别由storage、dns两个 Addon 提供未启用会导致 StatefulSet 的 PVC 无法创建或节点发现失败。结语本文以 KnowStreaming 仓库内置的 microk8s 示例 为主线完成了从 Addons 准备、make install部署、kubectl port-forward验证到values.yaml六项关键配置的逐层拆解并借助 Chart 源码阐明了 StatefulSet、双 Service、就绪探针等底层机制。这套关闭特权容器 禁用 mmap 软反亲和 小堆 小卷的组合拳是任何想在本地单机 Kubernetes 环境快速获得一个可用的多节点 Elasticsearch 集群时可复用的通用模板——它同时适用于 KnowStreaming 的本地联调以及各类 Elasticsearch 功能验证场景。赞分享后端消息队列运维可观测性【免费下载链接】KnowStreaming一站式云原生实时流数据平台通过0侵入、插件化构建企业级Kafka服务极大降低操作、存储和管理实时流数据门槛项目地址https://gitcode.com/gh_mirrors/kn/KnowStreaming点击查看免费下载相关推荐在 OpenShift 上通过 Helm 部署 KnowStreaming 依赖的 Elasticsearch 集群官方 Chart 的 OpenShift 示例深度解析在 OpenShift 上通过 Helm 部署 KnowStreaming 依赖的 Elasticsearch 集群官方 Chart 的 OpenShift后端消息队列运维可观测性KnowStreaming 内置 Elasticsearch Helm Chart 默认示例3 节点集群一键部署与 Goss 集成验证指南KnowStreaming 内置 Elasticsearch Helm Chart 默认示例3 节点集群一键部署与 Goss 集成验证指南 本文以开源仓库 K后端消息队列运维可观测性在 Kind 上快速部署 Elasticsearch 集群KnowStreaming 仓库内置 Helm Chart 实战指南在 Kind 上快速部署 Elasticsearch 集群KnowStreaming 仓库内置 Helm Chart 实战指南 本篇技术指南聚焦于 KnowS后端消息队列运维可观测性上一篇RealtimeSTT 实时语音转文字实战从麦克风到实时字幕5 行代码跑起来下一篇猫抓当浏览器成为你的个人视频档案馆创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表