1. 介绍
Elasticsearch 是一个基于 Lucene 构建的开源搜索引擎。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 语言开发的,并且是 Apache 许可条款下的开源产品。
以下是 Elasticsearch 的一些关键特性:
分布式:Elasticsearch 设计为分布式,可以很容易地扩展到数百台服务器,处理 PB 级别的数据。
实时搜索:Elasticsearch 提供了实时搜索能力,这意味着从索引文档到搜索结果的延迟非常低。
高可用性:Elasticsearch 自动管理数据的复制和分片,确保了高可用性。
易用性:Elasticsearch 提供了一个简单的 RESTful API,使得它很容易与各种语言和平台集成。
多租户:Elasticsearch 支持多租户,允许多个用户在同一个集群上工作,而不会相互干扰。
扩展性:Elasticsearch 可以水平扩展,随着数据量的增长,可以简单地添加更多的节点到集群中。
丰富的查询语言:Elasticsearch 提供了强大的查询语言,支持复杂查询,包括结构化、非结构化、地理位置和度量数据。
分析和聚合:Elasticsearch 可以执行复杂的分析和聚合操作,帮助用户从数据中提取有价值的信息。
监控和告警:Elasticsearch 集成了监控和告警功能,帮助用户监控集群的健康状态。
与其他工具的集成:Elasticsearch 可以与 Kibana、Logstash 和 Beats 等工具集成,形成一个强大的数据处理和可视化平台。
Elasticsearch 广泛应用于日志分析、全文搜索、监控系统、信息安全等多个领域。
2. 版本介绍
目前主流2个版本:
- elasticsearch 7(本次使用此版本)
- elasticsearch 8
3. 生成 elastic 证书及密码
# 镜像地址
export ELASTICSEARCH_IMAGE=elasticsearch:7.17.3
# 容器名称
export ELASTIC_NAME="elastic"
# 证书存储目录
export WORK_DIR="$PWD/elastic-certs"
# 容器内的证书存储目录
export CERTS_DIR="/tmp/certs"
# 证书有效时间,单位:天
export DAYS=36500
# 创建目录
mkdir -p $WORK_DIR
# 运行容器,生成证书
docker run --rm -i --name ${ELASTIC_NAME} \
-e discovery.type=single-node \
-e xpack.security.enabled=true \
-v $WORK_DIR:$CERTS_DIR \
$ELASTICSEARCH_IMAGE /bin/sh <<EOF
#!/bin/bash
# 使用elasticsearch-certutil创建CA文件
bin/elasticsearch-certutil ca --out $CERTS_DIR/elastic-stack-ca.p12 --pass '' --days $DAYS
# 使用上面的CA来创建节点证书
bin/elasticsearch-certutil cert --name security-master --dns security-master --ca $CERTS_DIR/elastic-stack-ca.p12 --pass '' --ca-pass '' --out $CERTS_DIR/elastic-certificates.p12 --days $DAYS
EOF
# 将 pcks12 中的信息分离出来,写入文件
openssl pkcs12 -nodes -passin pass:'' -in $WORK_DIR/elastic-certificates.p12 -out $WORK_DIR/elastic-certificate.pem
# 查看证书有效期
openssl pkcs12 -in $WORK_DIR/elastic-certificates.p12 -nodes -passin pass:'' | openssl x509 -noout -dates
3.1. elastic 证书配置代码
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /path/to/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /path/to/elastic-stack-ca.p12
3.2. 添加到 secret 中
# 添加证书
cd $WORK_DIR
kubectl -n elastic create secret generic elastic-certificates --from-file=elastic-certificates.p12
kubectl -n elastic create secret generic elastic-certificate-pem --from-file=elastic-certificate.pem
3.3. 生成密码加入 secret
# 创建密码
ELASTIC_USER=elastic
ELASTIC_PASSWORD="强密码"
# 创建空间名
kubectl create ns elastic
# 创建 Secret
kubectl create secret generic elastic-credentials -n elastic \
--from-literal=username="${ELASTIC_USER}" \
--from-literal=password="${ELASTIC_PASSWORD}" \
--dry-run=client -o yaml | kubectl apply -f -
4. helm 配置
4.1. 添加 helm repo
helm repo add elastic https://helm.elastic.co
4.2. 下载 elastic
helm search repo elastic/elasticsearch --version=7.17.3
helm pull elastic/elasticsearch --version=7.17.3
4.3. 获取 values.yaml
helm show values elastic/elasticsearch --version=7.17.3 > values.yaml
5. elastic values 配置
集群名称 | 节点角色 | 副本数 | 网络模式 | 描述 |
---|---|---|---|---|
elastic-cluster | master | 3 | ClusterIP | 负责集群状态管理,包括索引创建、删除和集群元数据的变更 |
elastic-cluster | data | 3 | ClusterIP | 负责存储数据和执行数据相关的操作,如 CRUD(创建、读取、更新、删除)操作 |
elastic-cluster | client | 3 | ClusterIP | 主要用于处理客户端请求,转发请求到适当的节点更, 负载均衡 |
5.1. 配置 master values.yaml
- 负责集群状态管理,包括索引创建、删除和集群元数据的变更。
- 负责集群的选举过程和集群设置的变更。
helm show values elastic/elasticsearch --version=7.17.3 > elastic-master-values.yaml
# 集群名称,所以的配置统一名称
clusterName: "elastic-cluster"
# 标识名称
nodeGroup: "master"
# 角色设置,此为 master 角色
roles:
master: "true"
ingest: "false"
data: "false"
# 副本数
replicas: 3
# 设置最小 master 节点数
minimumMasterNodes: 2
# elastic config 配置证书
esConfig:
elasticsearch.yml: |
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
# 环境变量:帐号与密码
extraEnvs:
- name: ELASTIC_USERNAME
valueFrom:
secretKeyRef:
name: elastic-credentials
key: username
- name: ELASTIC_PASSWORD
valueFrom:
secretKeyRef:
name: elastic-credentials
key: password
# 自定义的 secret,即证书
secretMounts:
- name: elastic-certificates
secretName: elastic-certificates
path: /usr/share/elasticsearch/config/certs
defaultMode: 0755
# 镜像地址
# image: "docker.elastic.co/elasticsearch/elasticsearch"
image: "elasticsearch"
imageTag: "7.17.3"
imagePullPolicy: "IfNotPresent"
# 设置 JVM 堆内存
esJavaOpts: "-Xmx1g -Xms1g" # example: "-Xmx1g -Xms1g"
# 资源配置
resources:
requests:
cpu: "1000m"
memory: "2Gi"
limits:
cpu: "1000m"
memory: "2Gi"
# 持久化存储,storageClass
volumeClaimTemplate:
storageClassName: nfs
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 30Gi
# 开启持久化
persistence:
enabled: true
# 硬性反亲和
antiAffinity: "hard"
5.2. 配置 data values.yaml
- 负责存储数据和执行数据相关的操作,如 CRUD(创建、读取、更新、删除)操作。
- 管理分片的分配和恢复。
helm show values elastic/elasticsearch --version=7.17.3 > elastic-data-values.yaml
# 集群名称,所以的配置统一名称
clusterName: "elastic-cluster"
# 标识名称
nodeGroup: "data"
# 角色设置,此为 data 角色
roles:
master: "false"
ingest: "true"
data: "true"
# 副本数
replicas: 3
# elastic config 配置证书
esConfig:
elasticsearch.yml: |
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
# 环境变量:帐号与密码
extraEnvs:
- name: ELASTIC_USERNAME
valueFrom:
secretKeyRef:
name: elastic-credentials
key: username
- name: ELASTIC_PASSWORD
valueFrom:
secretKeyRef:
name: elastic-credentials
key: password
# 自定义的 secret,即证书
secretMounts:
- name: elastic-certificates
secretName: elastic-certificates
path: /usr/share/elasticsearch/config/certs
defaultMode: 0755
# 镜像地址
# image: "docker.elastic.co/elasticsearch/elasticsearch"
image: "elasticsearch"
imageTag: "7.17.3"
imagePullPolicy: "IfNotPresent"
# 设置 JVM 堆内存
esJavaOpts: "-Xmx1g -Xms1g" # example: "-Xmx1g -Xms1g"
# 资源配置
resources:
requests:
cpu: "1000m"
memory: "2Gi"
limits:
cpu: "1000m"
memory: "2Gi"
# 持久化存储,storageClass
volumeClaimTemplate:
storageClassName: nfs
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 30Gi
# 开启持久化
persistence:
enabled: true
# 硬性反亲和
antiAffinity: "hard"
5.3. 配置 client values.yaml
- 主要用于处理客户端请求,转发请求到适当的节点。
- 不存储数据,不参与分片的分配。
helm show values elastic/elasticsearch --version=7.17.3 > elastic-client-values.yaml
# 集群名称,所以的配置统一名称
clusterName: "elastic-cluster"
# 标识名称
nodeGroup: "client"
# 角色设置,此为 client 角色
roles:
master: "false"
ingest: "false"
data: "false"
# 副本数
replicas: 3
# elastic config 配置证书
esConfig:
elasticsearch.yml: |
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
# 环境变量:帐号与密码
extraEnvs:
- name: ELASTIC_USERNAME
valueFrom:
secretKeyRef:
name: elastic-credentials
key: username
- name: ELASTIC_PASSWORD
valueFrom:
secretKeyRef:
name: elastic-credentials
key: password
# 自定义的 secret,即证书
secretMounts:
- name: elastic-certificates
secretName: elastic-certificates
path: /usr/share/elasticsearch/config/certs
defaultMode: 0755
# 镜像地址
# image: "docker.elastic.co/elasticsearch/elasticsearch"
image: "elasticsearch"
imageTag: "7.17.3"
imagePullPolicy: "IfNotPresent"
# 设置 JVM 堆内存
esJavaOpts: "-Xmx1g -Xms1g" # example: "-Xmx1g -Xms1g"
# 资源配置
resources:
requests:
cpu: "1000m"
memory: "2Gi"
limits:
cpu: "1000m"
memory: "2Gi"
# 关闭持久化,客户端无存储需求
persistence:
enabled: false
# 硬性反亲和
antiAffinity: "hard"
6. 部署
# 先部署 master
helm upgrade --install elastic-cluster elastic/elasticsearch -n elasticsearch -f elastic-master-values.yaml
# 再部署 data
helm upgrade --install elastic-cluster elastic/elasticsearch -n elasticsearch -f elastic-data-values.yaml
# 再部署 client
helm upgrade --install elastic-cluster elastic/elasticsearch -n elasticsearch -f elastic-client-values.yaml
6.1. 观察
kubectl -n elasticsearch get pods
kubectl -n elasticsearch exec -it xxx /bin/bash
# 集群的健康状况信息
curl -X GET -u "elastic:$ELASTIC_PASSWORD" 'http://localhost:9200/_cluster/health?pretty'
# 请求集群健康状况信息
curl -X GET -u "elastic:$ELASTIC_PASSWORD" 'http://localhost:9200/_cat/health?v'
#求所有节点信息。
curl -X GET -u "elastic:$ELASTIC_PASSWORD" 'http://localhost:9200/_cat/nodes?v'
# 请求所有索引信息。
curl -X GET -u "elastic:$ELASTIC_PASSWORD" 'http://localhost:9200/_cat/indices?v'