尽管Elasticsearch已有关于在Docker环境中使用Elasticsearch的优质文档,但该文档主要关注Docker Compose在单实例之外的应用。之后,https://github.com/pires%E5%BC%80%E5%B1%95%E4%BA%86https://github.com/pires/kubernetes-elasticsearch-cluster%EF%BC%8C%E4%BD%BFElasticsearch%E8%83%BD%E4%B8%8EKubernetes%E8%89%AF%E5%A5%BD%E5%85%BC%E5%AE%B9%E3%80%82
本项目受https://github.com/pires%E7%9A%84https://github.com/pires/kubernetes-elasticsearch-cluster%E5%90%AF%E5%8F%91%EF%BC%8C%E5%85%81%E8%AE%B8%E5%9C%A8Kubernetes%E6%88%96OpenShift%E4%B8%8A%E8%BF%90%E8%A1%8C%E5%A4%A7%E8%A7%84%E6%A8%A1Elasticsearch%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%EF%BC%8C%E7%AE%80%E5%8C%96%E4%BA%86Kubernetes%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE%EF%BC%88%E5%8C%85%E6%8B%AC%E6%B6%88%E9%99%A4%E5%AF%B9%E7%89%B9%E6%9D%83%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AE%B9%E5%99%A8%E7%9A%84%E9%9C%80%E6%B1%82%EF%BC%89%EF%BC%8C%E5%B9%B6%E9%80%9A%E8%BF%87%E7%89%B9%E6%AE%8A%E5%A4%84%E7%90%86%E4%BD%BF%E4%B8%8D%E5%90%8C%E6%96%B0%E6%97%A7%E7%89%88%E6%9C%AC%EF%BC%88%E6%9C%80%E6%96%B0%E7%89%88%EF%BC%89%E7%9A%84Elasticsearch%E8%83%BD%E5%85%BC%E5%AE%B9%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E7%9A%84%E5%BC%95%E5%85%A5%E4%B8%8E%E5%BC%83%E7%94%A8%E3%80%82
下文将介绍如何构建和独立运行本项目的Docker镜像,以及如何使用附带的Kubernetes文件部署n规模集群(已在Kubernetes 1.10+和OpenShift 3.9上测试)。
截至本文撰写时(2019-04-08),这些Dockerfile已用于Elasticsearch 6.4.3、6.5.4、6.6.2和6.7.1版本。
构建和运行Docker镜像需要较新版本的Docker。本地独立运行时(无需处理大量请求),建议至少4G内存和1-2个CPU核心。
在Kubernetes上运行需Kubernetes集群,已在1.10、1.12版本及OpenShift 3.9附带的Kubernetes服务上测试。资源需求差异较大,示例配置:12节点集群(3个主节点、3个数据节点、3个摄入节点、3个客户端节点),总计约12核CPU、60GB内存和100GB存储。
关于存储:Elasticsearch数据在GlusterFS存储上存在已知严重问题。GlusterFS团队在https://github.com/gluster/glusterfs/issues/517%E8%B7%9F%E8%B8%AA%E8%BF%99%E4%BA%9B%E9%97%AE%E9%A2%98%EF%BC%8CRed Hat也在此处、此处和此处记录了相关问题。
若使用GlusterFS 4.1之前版本,必须使用https://github.com/gluster/gluster-kubernetes/blob/master/docs/design/gluster-block-provisioning.md%E5%AD%98%E5%82%A8%EF%BC%8C%E5%90%A6%E5%88%99%E4%BC%9A%E5%9B%A0ctime/mtime/utime%E5%B7%AE%E5%BC%82%E5%AF%BC%E8%87%B4%E9%94%81%E6%96%87%E4%BB%B6%E4%BF%AE%E6%94%B9%E9%97%AE%E9%A2%98%EF%BC%88%E8%AF%A6%E8%A7%81%E5%89%8D%E6%96%87%E9%93%BE%E6%8E%A5%EF%BC%89%E3%80%82%E8%8B%A5%E4%BD%BF%E7%94%A8GlusterFS 4.1及以上版本,需在数据卷上启用ctime特性。
内存设置说明:本配置假设JVM版本为1.8.0 R191或更高,这些版本支持+EnableContainerSupport、+InitialRAMPercentage和+MaxRAMPercentage特性,可根据Kubernetes YAML文件中Pod的内存分配动态为JVM提供堆内存,无需显式指定JVM内存大小。
最后,假设使用较新的现代操作系统环境,docker和kubectl命令已添加到PATH,且能使用cmd.exe、powershell、ksh或bash。
本项目基于最小Linux+OpenJDK镜像构建,提取标准Elasticsearch tar包,通过自定义setup.sh和run.sh脚本安装并启动。
Dockerfile继承自Red Hat的https://github.com/jboss-container-images/openjdk%E9%95%9C%E5%83%8F%E3%80%82%E7%90%86%E8%AE%BA%E4%B8%8A%EF%BC%8C%E4%BB%BB%E4%BD%95%E5%8C%85%E5%90%ABOpenJDK 8+(Elasticsearch 6.2+可运行于OpenJDK 9/10/11)及bash、curl命令的镜像均可运行,但Red Hat镜像的优势在于承诺持续更新,优于常规OpenJDK镜像的现状。
Red Hat的"OpenJDK生命周期和支持政策"文档指出:"问:生命周期日期是否适用于OpenShift中的OpenJDK镜像?答:是。OpenJDK 8的生命周期适用于Red Hat容器目录中的容器镜像,OpenJDK 11的生命周期将在其发布后适用。"
以下是独立Docker镜像的构建和运行步骤:
docker build -t someorg/elasticsearch .docker run -d -p 9200:9200 -p 9300:9300 --rm --name es someorg/elasticsearchdocker logs -f es(按<ctrl-c>停止查看)curl http://localhost:9200(返回基本信息JSON)清理步骤:
docker stop esdocker run带--rm时无需):docker container prunedocker volume prunedocker rmi someorg/elasticsearchdocker rmi registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift上述步骤运行的是默认配置的独立Elasticsearch节点,未使用环境变量自定义配置。通过修改环境变量和Docker设置,单个镜像可在Elasticsearch环境中承担不同角色,这是在Kubernetes环境中运行的关键。
kubernetes子目录包含Kubernetes环境中的资源配置YAML文件,包括四种资源类型:
这些资源分别对应服务配置的关键方面:外部访问方式(route)、内部通信端口(service)、需保持状态和身份的系统(statefulset)、可替换的无状态工作节点(deployment)。
Kubernetes目录中的YAML文件通过设置环境变量,将Docker镜像配置为Elasticsearch集群中的特定角色。部署步骤如下(需Kubernetes环境及kubectl命令):
kubectl create -f service-es-transport.yamlkubectl create -f service-es-http.yamlkubectl create -f route-es-http.yamlkubectl create -f statefulset-es-master.yamlkubectl create -f statefulset-es-data.yamlkubectl create -f deployment-es-ingest.yamlkubectl create -f deployment-es-client.yaml默认配置适用于中等规模生产环境(约60GiB内存、12核CPU)。测试环境可降低资源分配。注意:Pod内存分配通常需为JVM内存(-Xms和-Xmx)的两倍。此外,Kubernetes中的持久存储类名称可能与YAML文件中不同,可通过kubectl get sc查看可用存储类。
OpenShift v3及以上基于Kubernetes构建,增加了镜像构建、版本控制、认证和隔离等功能,详情见okd.io。
OpenShift保持与Kubernetes的兼容性,可通过oc login登录后,将上述kubectl命令替换为oc执行,例如:oc create -f service-es-transport.yaml。
Docker镜像可在构建和运行时通过参数(ARG)和环境变量(ENV)进行配置。ARG仅在构建时(docker build)生效,ENV在构建和运行时(docker run)均生效。
默认值:none
构建时用于curl获取 artifacts 的代理URL。示例值:http://proxy.example.com:8080。
默认值:none
指定不使用代理的IP地址和(部分)主机名列表(逗号分隔)。可部分匹配主机名(如.example.com匹配所有以.example.com结尾的主机)。示例值:localhost,127.0.0.1,.example.com。
默认值:/elasticsearch
Elasticsearch安装的主目录。请勿修改,否则会导致意外结果。
默认值:/elasticsearch/bin:$PATH
镜像的默认路径,前缀为Elasticsearch的bin目录。修改时需确保/elasticsearch/bin为首个条目。
默认值:true
Elasticsearch 6.5.0及以上版本可用,6.5.0之前版本无效。允许或禁止mmapfs作为索引后端。若无法将vm.max_map_count设置为至少262144(无root权限),可设为false,并确保ES_INDEX_STORE_TYPE设为niofs或simplefs。
当Elasticsearch检测到非本地主机运行时,会执行启动检查,包括vm.max_map_count是否至少262144。6.5.0之前版本即使index.store.type设为非mmapfs也无法跳过该检查(因index.store.type仅为默认值,可在索引创建时覆盖)。vm.max_map_count仅在index.store.type为mmapfs且node.store.allow_mmapfs为true(Linux和macOS上index.store.type为fs或mmapfs时的默认值)时相关。
默认值:-Xms1g -Xmx1g -XX:ParallelGCThreads=1
用于设置JVM参数。默认配置将最小和最大堆大小设为相等(禁用动态伸缩以避免性能损耗),并将ParallelGCThreads设为1(确保最多1个并发垃圾回收线程)。此设置针对jvm.options中配置的CMS(ConcurrentMarkSweep)垃圾收集器。
可在jvm.options文件中设置这些参数,但通过环境变量可按实例覆盖。
默认值:https://artifacts.elastic.co/downloads/elasticsearch
控制setup.sh获取安装包的地址。若ES_VERSION为快照版本,需设为https://snapshots.elastic.co/downloads/elasticsearch;稳定版本使用默认值即可。
默认值:46095ACC8548582C1A2699A9D27D666CD88E42B4
Elastic Co用于签名发布 artifacts 的公钥ID。setup.sh使用此ID和下载的哈希文件从PGP密钥服务器获取公钥,验证下载 artifacts 的有效性。
默认值:elasticsearch-default
Elasticsearch集群名称。
默认值:none
设置Elasticsearch配置中的discovery.zen.ping.unicast.hosts。Zen Discovery是Elasticsearch默认的集群节点发现模块。Kubernetes配置文件将此值设为es-transport(定义节点间传输端口9300的Kubernetes服务名称)。
注意:Elastic Co文档指出该值可为主机列表,Kubernetes服务名称的DNS条目可能解析为多个主机(DNS轮询)。
默认值:*
允许的跨域请求源(详见下文ES_HTTP_CORS_ENABLE)。若值前后添加/,将被视为正则表达式,例如/https?:\/\/localhost(:[0-9]+)?/支持HTTP和HTTPS。
默认值*存在安全风险(允许任何来源的跨域请求),建议修改。更多信息见Elastic Co的HTTP模块文档。
默认值:true
启用或禁用跨域资源共享(CORS),即允许其他源的客户端执行请求。详见跨域资源共享。
默认值:true
默认情况下,向不存在的索引POST文档会自动创建索引。可通过设为.kibana*,.logstash*,.management*,.monitoring*,.security*,.triggered_watches*,.watcher-history*,.watches*禁用自动创建(需显式创建索引)。注意:值不能为false,需为允许自动创建的索引白名单。
默认值:fs
默认由Elasticsearch选择索引存储类型实现(Linux和macOS为mmapfs,Windows为simplefs)。
此值仅指定默认索引存储类型,不限制索引创建时指定的存储类型。另见ES_ALLOW_MMAPFS。更多信息见存储模块文档。
默认值:1
限制可访问本地数据路径的Elasticsearch进程数,几乎所有情况下应设为1。若本地运行多个Elasticsearch进程且需访问同一数据路径,可增加此值。生产环境通常不应大于1。详见Elasticsearch参考指南的节点数据路径设置。
默认值:false
Elasticsearch参考指南:JVM执行 major GC 时会触及堆的每个页面,若页面被换出到磁盘,需换回内存,导致大量磁盘抖动,影响请求处理。
有多种方法配置系统禁止交换,其中一种是通过mlockall(Unix)或virtuallock(Windows)请求JVM锁定堆内存,通过Elasticsearch的bootstrap.memory_lock设置实现。
但有时设置后Elasticsearch可能无法锁定堆(如elasticsearch用户无memlock unlimited权限)。内存锁定检查用于验证bootstrap.memory_lock启用时JVM是否成功锁定堆。
默认false禁用检查,若确认有memlock unlimited权限,可设为true。
默认值:_site_
Elasticsearch绑定的主机名或IP地址,并向集群其他节点广播。接受IP地址、主机名、特殊值或其组合数组。
特殊值:_[networkInterface]_(网络接口地址,如_en0_)、_local_(系统回环地址,如127.0.0.1)、_site_(系统站点本地地址,如192.168.0.1、172.16.0.1、10.0.0.1)、_global_(系统全局地址,如8.8.8.8)。
默认值:true
是否作为数据节点。
默认值:true
是否作为摄入节点。
默认值:true
是否作为主节点。
默认值:1
设置discovery.zen.minimum_master_nodes,即新选举的主节点需加入的最小主节点数,以完成选举并确认主节点身份。
该设置还控制活动集群中需存在的最小活动主节点数,若不满足,活动主节点将退位并重新选举。
必须设为主节点数的法定人数(主节点数/2 + 1)。建议避免仅2个主节点(法定人数为2,任一节点故障导致集群不可用)。实践中,3个主节点且minimum_master_nodes=2是良好选择。详见[避免脑裂](https://
以下是 raaftech/elasticsearch 相关的常用 Docker 镜像,适用于 不同场景 等不同场景:
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。


探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务