36.5.2. Elasticsearch
Elasticsearch(ES) 是一个存储所有日志的对象存储。
Elasticsearch 将日志数据整理到数据存储中,各自称为 索引。Elasticsearch 将每个索引分成多个部分,称为 分片(shards),它将分散到集群中的一组 Elasticsearch 节点上。您可以配置 Elasticsearch 来为分片制作拷贝(称为副本)。Elasticsearch 还会将副本分散到 Elactisearch 节点。分片和副本的组合旨在提供冗余和故障恢复能力。例如,如果您为一个副本为索引配置三个分片,Elasticsearch 会为该索引生成六个分片:三个主分片,三个副本作为备份。
OpenShift Container Platform 日志记录安装程序确保每个 Elasticsearch 节点都使用带有自身存储卷的唯一部署配置进行部署。您可以为 您添加到日志记录系统的每个 Elasticsearch 节点创建额外的部署配置。在安装过程中,您可以使用 openshift_logging_es_cluster_size
Ansible 变量来指定 Elasticsearch 节点的数量。
另外,您可以通过修改清单文件中的 openshift_logging_es_cluster_size
来扩展现有集群,并重新运行日志记录 playbook。可以修改其他集群参数,并在 指定日志记录 Ansible 变量 中所述。
如需有关选择存储和网络位置的注意事项,请参考 Elastic 文档,如下所示。
高可用性 Elasticsearch 环境 需要至少三个 Elasticsearch 节点,每个都在不同的主机上,并将 openshift_logging_es_number_of_replicas
Ansible 变量设置为 1
或更高版本来创建副本。
查看所有 Elasticsearch 部署
查看所有当前的 Elasticsearch 部署:
$ oc get dc --selector logging-infra=elasticsearch
配置 Elasticsearch 实现高可用性
高可用性 Elasticsearch 环境需要至少三个 Elasticsearch 节点,每个都在不同的主机上,并将 openshift_logging_es_number_of_replicas
Ansible 变量设置为 1
或更高版本来创建副本。
使用以下场景作为具有三个 Elasticsearch 节点的 OpenShift Container Platform 集群指南:
-
将
openshift_logging_es_number_of_replicas
设置为1
,两个节点具有集群中所有 Elasticsearch 数据的副本。这样可确保如果带有 Elasticsearch 数据的节点停机,另一个节点具有集群中所有 Elasticsearch 数据的副本。 将
openshift_logging_es_number_of_replicas
设置为3
,四节点具有集群中所有 Elasticsearch 数据的副本。这样可确保如果三个带有 Elasticsearch 数据的节点停机,则一个节点会拥有集群中所有 Elasticsearch 数据的副本。在这种情况下,如果有多个 Elasticsearch 节点停机,Elasticsearch 状态为 RED,新的 Elasticsearch 分片不会被分配。但是,由于高可用性,您不会丢失 Elasticsearch 数据。
请注意,高可用性和性能之间有一个利弊。例如,使 openshift_logging_es_number_of_replicas=2
和 openshift_logging_es_number_of_shards=3
需要 Elasticsearch 消耗大量资源在集群中复制分片数据。另外,使用数量较高的副本需要在每个节点上进行碎片或开序数据存储要求,因此在为 Elasticsearch 计划持久性存储时,您必须考虑这一点。
配置分片数量时的注意事项
对于 openshift_logging_es_number_of_shards
参数,请考虑:
-
要获得更高的性能,请增加分片的数量。例如,在三个节点集群中,设置
openshift_logging_es_number_of_shards=3
。这将导致每个索引分成三个部分(分片),处理索引的负载将分散到所有 3 个节点。 - 如果您有大量项目,如果集群中有超过几千个分片,则可能会看到性能下降。减少分片数量或减少策展时间。
-
如果您有少量非常大的索引,您可能需要配置
openshift_logging_es_number_of_shards=3
或更高版本。Elasticsearch 建议使用最多分片大小小于 50 GB。
Node Selector
由于 Elasticsearch 可以使用许多资源,集群的所有成员都应有相互低延迟网络连接和任何远程存储。使用节点选择器将实例定向到专用节点,或集群中专用区域来确保这一点。
要配置节点选择器,请在清单文件中指定 openshift_logging_es_nodeselector
配置选项。这适用于所有 Elasticsearch 部署 ; 如果需要分隔节点选择器,则必须在部署后手动编辑每个部署配置。节点选择器以 python 兼容 dict 字典的形式指定。例如,{"node-type":"infra", "region":"east"}
。
36.5.2.1. 持久性 Elasticsearch 存储
默认情况下,openshift_logging
Ansible 角色会创建一个临时部署,pod 中的所有数据在 pod 重启后会丢失。
对于生产环境,每个 Elasticsearch 部署配置都需要一个持久性存储卷。您可以指定现有的 持久性卷声明,或允许 OpenShift Container Platform 创建。
使用现有的 PVC。如果为部署创建自己的 PVC,OpenShift Container Platform 会使用这些 PVC。
将 PVC 命名为与
openshift_logging_es_pvc_prefix
设置匹配,该设置默认为logging-es
。为每个 PVC 分配一个名称,其中添加了一个序列号:logging-es-0
、logging-es-1
、logging-es-2
等。允许 OpenShift Container Platform 创建 PVC。如果 Elsaticsearch 的 PVC 不存在,OpenShift Container Platform 会根据 Ansible 清单文件 中的参数创建 PVC。
参数 描述 openshift_logging_es_pvc_size
指定 PVC 请求的大小。
openshift_logging_elasticsearch_storage_type
将存储类型指定为
pvc
。注意这是一个可选参数。如果将
openshift_logging_es_pvc_size
参数设置为大于 0 的值,则日志记录安装程序默认自动将此参数设置为pvc
。openshift_logging_es_pvc_prefix
另外,还可为 PVC 指定自定义前缀。
例如:
openshift_logging_elasticsearch_storage_type=pvc openshift_logging_es_pvc_size=104802308Ki openshift_logging_es_pvc_prefix=es-logging
如果使用动态置备 PV,OpenShift Container Platform 日志记录安装程序会创建一个使用默认存储类或通过 openshift_logging_elasticsearch_pvc_class_name
参数指定的 PVC 的 PVC。
如果使用 NFS 存储,OpenShift Container Platform 安装程序会根据 openshift_logging_storage_*
参数和 OpenShift Container Platform 日志记录安装程序创建持久性卷,使用 openshift_logging
_es_pvc_* 参数创建 PVC。务必指定正确的参数,以便将持久卷与 EFK 搭配使用。另外,在 Ansible 清单文件中设置 openshift_enable_unsupported_configurations=true
参数,因为日志记录安装程序默认阻止了带有核心基础架构的 NFS 安装。
使用 NFS 存储作为卷或持久性卷,或者 Elasticsearch 存储(如 Gluster)不支持使用 NAS,因为 Lucene 依赖于 NFS 不提供的文件系统行为。数据崩溃和其他问题可能会发生。
如果您的环境需要 NFS 存储,请使用以下方法之一:
36.5.2.1.1. 使用 NFS 作为持久性卷
您可以将 NFS 部署为 自动置备的持久性卷,也可以使用 预定义的 NFS 卷。
如需更多信息,请参阅 在两个持久性卷声明间共享 NFS 挂载,以利用共享存储来供两个独立的容器使用。
使用自动置备的 NFS
使用 NFS 作为自动置备 NFS 的持久性卷:
将以下行添加到 Ansible 清单文件,以创建 NFS 自动配置的存储类并动态置备后备存储:
openshift_logging_es_pvc_storage_class_name=$nfsclass openshift_logging_es_pvc_dynamic=true
使用以下命令,使用日志记录 playbook 部署 NFS 卷:
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml
使用以下步骤创建 PVC:
编辑 Ansible 清单文件以设置 PVC 大小:
openshift_logging_es_pvc_size=50Gi
注意日志记录 playbook 根据大小选择卷,如果其他持久性卷大小相同,则可能使用意外卷。
使用以下命令重新运行 Ansible deploy_cluster.yml playbook:
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
安装程序 playbook 根据
openshift_logging_storage
变量创建 NFS 卷。
使用预定义的 NFS 卷
使用现有 NFS 卷与 OpenShift Container Platform 集群部署日志:
编辑 Ansible 清单文件以配置 NFS 卷并设置 PVC 大小:
openshift_logging_storage_kind=nfs openshift_logging_storage_access_modes=['ReadWriteOnce'] openshift_logging_storage_nfs_directory=/share 1 openshift_logging_storage_nfs_options='*(rw,root_squash)' 2 openshift_logging_storage_labels={'storage': 'logging'} openshift_logging_elasticsearch_storage_type=pvc openshift_logging_es_pvc_size=10Gi openshift_logging_es_pvc_storage_class_name='' openshift_logging_es_pvc_dynamic=true openshift_logging_es_pvc_prefix=logging
使用以下命令重新部署 EFK 堆栈:
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
36.5.2.1.2. 使用 NFS 作为本地存储
您可以在 NFS 服务器上分配大型文件,并将该文件挂载到节点。然后,您可以使用该文件作为主机路径设备。
$ mount -F nfs nfserver:/nfs/storage/elasticsearch-1 /usr/local/es-storage $ chown 1000:1000 /usr/local/es-storage
然后,使用 /usr/local/es-storage 作为 host-mount,如下所述。使用不同的后备文件作为每个 Elasticsearch 节点的存储。
此回环必须在 OpenShift Container Platform 之外的节点上手动维护。您不能在容器中维护它。
每个节点主机上可以使用本地磁盘卷(如果可用)作为 Elasticsearch 副本的存储。这样做需要进行一些准备,如下所示:
必须授予相关的服务帐户来挂载和编辑本地卷:
$ oc adm policy add-scc-to-user privileged \ system:serviceaccount:openshift-logging:aggregated-logging-elasticsearch
注意如果您从早期版本的 OpenShift Container Platform 升级,集群日志记录可能已安装在
logging
项目中。您应该相应地调整服务帐户。每个 Elasticsearch 节点定义都必须补丁才能声明该权限,例如:
$ for dc in $(oc get deploymentconfig --selector component=es -o name); do oc scale $dc --replicas=0 oc patch $dc \ -p '{"spec":{"template":{"spec":{"containers":[{"name":"elasticsearch","securityContext":{"privileged": true}}]}}}}' done
- Elasticsearch 副本必须位于正确的节点上,才能使用本地存储,即使这些节点在一段时间内停机也是如此。这要求为每个 Elasticsearch 副本提供一个对管理员为其分配存储的节点的唯一节点选择器。要配置节点选择器,请编辑每个 Elasticsearch 部署配置,添加或编辑 nodeSelector 部分,以指定您为每个节点应用的唯一标签:
apiVersion: v1
kind: DeploymentConfig
spec:
template:
spec:
nodeSelector:
logging-es-node: "1" 1
- 1
- 此标签必须在本例中为
logging-es-node=1
的单个节点,并带有相应的节点。- 为每个所需节点创建节点选择器。
-
根据需要,使用
oc label
命令将标签应用到多个节点。
例如,如果您的部署有三个基础架构节点,您可以按如下方式为这些节点添加标签:
$ oc label node <nodename1> logging-es-node=0 $ oc label node <nodename2> logging-es-node=1 $ oc label node <nodename3> logging-es-node=2
有关向节点添加标签的详情,请参考 更新节点上的标签。
要自动应用节点选择器,您可以使用 oc patch
命令:
$ oc patch dc/logging-es-<suffix> \ -p '{"spec":{"template":{"spec":{"nodeSelector":{"logging-es-node":"0"}}}}}'
完成这些步骤后,您可以将本地主机挂载应用到每个副本。以下示例假设存储挂载到每个节点上的相同路径。
$ for dc in $(oc get deploymentconfig --selector component=es -o name); do oc set volume $dc \ --add --overwrite --name=elasticsearch-storage \ --type=hostPath --path=/usr/local/es-storage oc rollout latest $dc oc scale $dc --replicas=1 done
36.5.2.1.3. 为 Elasticsearch 配置 hostPath 存储
您可以为 Elasticsearch 使用 hostPath 存储来置备 OpenShift Container Platform 集群。
使用每个节点主机上的本地磁盘卷作为 Elasticsearch 副本的存储:
在每个基础架构节点上为本地 Elasticsearch 存储创建一个本地挂载点:
$ mkdir /usr/local/es-storage
在 Elasticsearch 卷上创建文件系统:
$ mkfs.ext4 /dev/xxx
挂载 elasticsearch 卷:
$ mount /dev/xxx /usr/local/es-storage
在
/etc/fstab
中添加以下行:$ /dev/xxx /usr/local/es-storage ext4
更改挂载点的所有权:
$ chown 1000:1000 /usr/local/es-storage
赋予将本地卷挂载到相关服务帐户的权限:
$ oc adm policy add-scc-to-user privileged \ system:serviceaccount:openshift-logging:aggregated-logging-elasticsearch
注意如果您从早期版本的 OpenShift Container Platform 升级,集群日志记录可能已安装在
logging
项目中。您应该相应地调整服务帐户。要声明该权限,请对每个 Elasticsearch 副本定义进行补丁,如下例所示,这为 Ops 集群指定
--selector component=es-ops
:$ for dc in $(oc get deploymentconfig --selector component=es -o name); do oc scale $dc --replicas=0 oc patch $dc \ -p '{"spec":{"template":{"spec":{"containers":[{"name":"elasticsearch","securityContext":{"privileged": true}}]}}}}' done
在正确的节点上找到 Elasticsearch 副本以使用本地存储,也不会移动它们,即使这些节点在一段时间内停机。要指定节点位置,请为每个 Elasticsearch 副本赋予一个唯一一个管理员为其分配存储的节点的节点选择器。
要配置节点选择器,请编辑每个 Elasticsearch 部署配置,添加或编辑
nodeSelector
部分,以指定您所需的每个节点应用的唯一标签:apiVersion: v1 kind: DeploymentConfig spec: template: spec: nodeSelector: logging-es-node: "1"
该标签必须唯一地识别一个带有标签的一个节点的副本,在本例中为
logging-es-node=1
。为每个所需节点创建节点选择器。根据需要,使用
oc label
命令将标签应用到多个节点。例如,如果您的部署有三个基础架构节点,您可以按如下方式为这些节点添加标签:
$ oc label node <nodename1> logging-es-node=0 $ oc label node <nodename2> logging-es-node=1 $ oc label node <nodename3> logging-es-node=2
要自动使用节点选择器的应用程序,请使用
oc patch
命令而不是oc label
命令,如下所示:$ oc patch dc/logging-es-<suffix> \ -p '{"spec":{"template":{"spec":{"nodeSelector":{"logging-es-node":"1"}}}}}'
完成这些步骤后,您可以将本地主机挂载应用到每个副本。以下示例假设存储挂载到每个节点的同一路径,并为 Ops 集群指定
--selector component=es-ops
。$ for dc in $(oc get deploymentconfig --selector component=es -o name); do oc set volume $dc \ --add --overwrite --name=elasticsearch-storage \ --type=hostPath --path=/usr/local/es-storage oc rollout latest $dc oc scale $dc --replicas=1 done
36.5.2.1.4. 更改 Elasticsearch 的扩展
如果需要扩展集群中的 Elasticsearch 节点数量,可以为要添加的每个 Elasticsearch 节点创建部署配置。
由于持久性卷的性质以及 Elasticsearch 配置为存储数据并恢复集群的方式,您无法简单地在 Elasticsearch 部署配置中增加节点。
更改 Elasticsearch 扩展的最简单方法是修改清单主机文件,并重新运行日志记录 playbook,如前面所述。如果您为部署提供了持久性存储,则这不应具有破坏性。
只有在新的 openshift_logging_es_cluster_size
值高于集群中当前 Elasticsearch 节点数量时,才可以使用日志记录 playbook 重新定义 Elasticsearch 集群大小。
36.5.2.1.5. 更改 Elasticsearch 副本的数量
您可以通过编辑清单主机文件中的 openshift_logging_es_number_of_replicas
值来更改 Elasticsearch 副本数量,并重新运行日志 playbook,如前面所述。
更改只适用于新索引。现有索引继续使用以前的副本数。例如,如果您将索引数量从 3 改为 2,您的集群会将 2 个副本用于新索引,并为现有索引使用 3 个副本。
您可以运行以下命令来修改现有索引的副本数:
$ oc exec -c elasticsearch $pod -- es_util --query=project.* -d '{"index":{"number_of_replicas":"2"}}' 1
- 1
- 指定现有索引的副本数。
36.5.2.1.6. 将 Elasticsearch 公开为路由
默认情况下,无法从日志记录集群外部访问部署了 OpenShift 聚合日志的 Elasticsearch。您可以为要访问 Elasticsearch 的工具启用对 Elasticsearch 的路由。
您可以使用 OpenShift 令牌访问 Elasticsearch,您可以在创建服务器证书时提供外部 Elasticsearch 和 Elasticsearch Ops 主机名(与 Kibana 相似)。
要将 Elasticsearch 作为重新加密路由访问,请定义以下变量:
openshift_logging_es_allow_external=True openshift_logging_es_hostname=elasticsearch.example.com
进入 playbook 目录并运行以下 Ansible playbook:
$ cd /usr/share/ansible/openshift-ansible $ ansible-playbook [-i </path/to/inventory>] \ playbooks/openshift-logging/config.yml
要远程登录到 Elasticsearch,请求必须包含三个 HTTP 标头:
Authorization: Bearer $token X-Proxy-Remote-User: $username X-Forwarded-For: $ip_address
您必须具有项目的访问权限,以便能访问其日志。例如:
$ oc login <user1> $ oc new-project <user1project> $ oc new-app <httpd-example>
您需要获取这个 ServiceAccount 的令牌,以便在请求中使用:
$ token=$(oc whoami -t)
使用之前配置的令牌,您应能够通过公开的路由访问 Elasticsearch:
$ curl -k -H "Authorization: Bearer $token" -H "X-Proxy-Remote-User: $(oc whoami)" -H "X-Forwarded-For: 127.0.0.1" https://es.example.test/project.my-project.*/_search?q=level:err | python -mjson.tool