一、简介
Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便,轻松扩展服务节点,更能用于日志收集快速检索等等一些列功能。Kibana 是一个为 Elasticsearch 平台分析和可视化的开源平台,使用 Kibana 能够搜索、展示存储在 Elasticsearch 中的索引数据。使用它可以很方便用图表、表格、地图展示和分析数据。Helm:Helm(注意:helm 2.0 版本与 3.0 有很大区别)是与 kubernetes 的 kube-apiserver 进行交互,通过 Kubernetes API 控制应用启动、更新与删除的客户端。二、资源准备
ElasticSearch 安装有最低安装要求,如果执行 Helm 安装命令后 Pod 无法正常启动,请检查是否符合最低要求的配置。
1、资源要求
2、ElasticSearch 集群环境
3、Kibana 环境信息
三、配置 StorageClass
配置一个 SotrageClass,用于创建 Kubernetes 存储用的 PV、PVC,因为 ElasticSearch 部署的是 StatefulSet 类型资源,涉及到自动卷分配,需要一个存储卷分配服务。例如,使用 NFS 存储就需要 NFS 共享网络卷的 NFS-Provisioner 服务,能够帮我们自动创建存储空间及 PV 与 PVC,请确认 Kubernetes 集群中存在这样的卷分配服务。这里使用的是 NFS 存储卷,且存在 NFS Provisioner 服务,使用之前创建的 StorageClass,如下:
$ kubectl get StorageClassNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODEALLOWVOLUMEEXPANSION AGEnfs-storage-new (default) nfs-client DeleteImmediate false 6d4h
四 、提前下载镜像
提前将要部署的应用的镜像下载,避免安装时因为镜像下载过慢而导致安装失败。这里我们主要用到的两个镜像,下载操作如下:
## 拉取 elasticsearch 镜像docker pull elasticsearch:7.7.1## 拉取 kibana 镜像docker pull kibana:7.7.1
五、创建集群证书
ElasticSearch 7.x 版本默认安装了X-Pack
插件,并且部分功能免费,这里我们配置安全证书文件。
1、生成证书文件
# 运行容器生成证书docker run --name elastic-charts-certs -i -w /app elasticsearch:7.7.1 /bin/sh -c \"elasticsearch-certutil ca --out /app/elastic-stack-ca.p12 --pass '' && \elasticsearch-certutil cert --name security-master --dns \security-master --ca /app/elastic-stack-ca.p12 --pass '' --ca-pass '' --out /app/elastic-certificates.p12"# 从容器中将生成的证书拷贝出来docker cp elastic-charts-certs:/app/elastic-certificates.p12 ./ # 删除容器docker rm -f elastic-charts-certs# 将 pcks12 中的信息分离出来,写入文件openssl pkcs12 -nodes -passin pass:'' -in elastic-certificates.p12 -out elastic-certificate.pem
2、添加证书到集群
# 添加证书kubectl create secret generic elastic-certificates --from-file=elastic-certificates.p12kubectl create secret generic elastic-certificate-pem --from-file=elastic-certificate.pem# 设置集群用户名密码,用户名不建议修改kubectl create secret generic elastic-credentials \--from-literal=username=elastic --from-literal=password=admin@123
六、配置应用参数
通过 Helm 安装 需要事先创建一个带有配置参数的 values.yaml 文件。然后再执行 Helm install 安装命令时,指定使用此文件。
1、ElasticSearch Master
创建es-master-values.yaml
文件
# ============设置集群名称============## 设置集群名称clusterName: "elasticsearch"## 设置节点名称nodeGroup: "master"## 设置角色roles:master: "true"ingest: "false"data: "false"# ============镜像配置============## 指定镜像与镜像版本image: "docker.elastic.co/elasticsearch/elasticsearch"imageTag: "7.7.1"## 副本数replicas: 3# ============资源配置============## JVM 配置参数esJavaOpts: "-Xmx1g -Xms1g"## 部署资源配置(生成环境一定要设置大些)resources:requests:cpu: "2000m"memory: "2Gi"limits:cpu: "2000m"memory: "2Gi"## 数据持久卷配置persistence:enabled: true## 存储数据大小配置volumeClaimTemplate:storageClassName: nfs-storage-newaccessModes: [ "ReadWriteOnce" ]resources:requests:storage: 5Gi# ============安全配置============## 设置协议,可配置为 http、httpsprotocol: http## 证书挂载配置,这里我们挂入上面创建的证书secretMounts:- name: elastic-certificatessecretName: elastic-certificatespath: /usr/share/elasticsearch/config/certs## 允许您在/usr/share/elasticsearch/config/中添加任何自定义配置文件,例如 elasticsearch.yml## ElasticSearch 7.x 默认安装了 x-pack 插件,部分功能免费,这里我们配置下## 下面注掉的部分为配置 https 证书,配置此部分还需要配置 helm 参数 protocol 值改为 httpsesConfig:elasticsearch.yml: |xpack.security.enabled: truexpack.security.transport.ssl.enabled: truexpack.security.transport.ssl.verification_mode: certificatexpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12# xpack.security.http.ssl.enabled: true# xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12# xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12## 环境变量配置,这里引入上面设置的用户名、密码 secret 文件extraEnvs:- name: ELASTIC_USERNAMEvalueFrom:secretKeyRef:name: elastic-credentialskey: username- name: ELASTIC_PASSWORDvalueFrom:secretKeyRef:name: elastic-credentialskey: password# ============调度配置============## 设置调度策略## - hard:只有当有足够的节点时 Pod 才会被调度,并且它们永远不会出现在同一个节点上## - soft:尽最大努力调度antiAffinity: "hard"## 容忍配置(一般 kubernetes master 或其它设置污点的节点,只有指定容忍才能进行调度,如果测试环境只有三个节点,则可以开启在 master 节点安装应用)#tolerations:# - operator: "Exists" ##容忍全部污点
2、ElasticSearch Data
创建es-data-values.yaml
文件
# ============设置集群名称============## 设置集群名称clusterName: "elasticsearch"## 设置节点名称nodeGroup: "data"## 设置角色roles:master: "false"ingest: "true"data: "true"# ============镜像配置============## 指定镜像与镜像版本image: "docker.elastic.co/elasticsearch/elasticsearch"imageTag: "7.7.1"## 副本数replicas: 3# ============资源配置============## JVM 配置参数esJavaOpts: "-Xmx1g -Xms1g"## 部署资源配置(生成环境一定要设置大些)resources:requests:cpu: "1000m"memory: "2Gi"limits:cpu: "1000m"memory: "2Gi"## 数据持久卷配置persistence:enabled: true## 存储数据大小配置volumeClaimTemplate:storageClassName: nfs-storage-newaccessModes: [ "ReadWriteOnce" ]resources:requests:storage: 50Gi# ============安全配置============## 设置协议,可配置为 http、httpsprotocol: http## 证书挂载配置,这里我们挂入上面创建的证书secretMounts:- name: elastic-certificatessecretName: elastic-certificatespath: /usr/share/elasticsearch/config/certs## 允许您在/usr/share/elasticsearch/config/中添加任何自定义配置文件,例如 elasticsearch.yml## ElasticSearch 7.x 默认安装了 x-pack 插件,部分功能免费,这里我们配置下## 下面注掉的部分为配置 https 证书,配置此部分还需要配置 helm 参数 protocol 值改为 httpsesConfig:elasticsearch.yml: |xpack.security.enabled: truexpack.security.transport.ssl.enabled: truexpack.security.transport.ssl.verification_mode: certificatexpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12# xpack.security.http.ssl.enabled: true# xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12# xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12## 环境变量配置,这里引入上面设置的用户名、密码 secret 文件extraEnvs:- name: ELASTIC_USERNAMEvalueFrom:secretKeyRef:name: elastic-credentialskey: username- name: ELASTIC_PASSWORDvalueFrom:secretKeyRef:name: elastic-credentialskey: password# ============调度配置============## 设置调度策略## - hard:只有当有足够的节点时 Pod 才会被调度,并且它们永远不会出现在同一个节点上## - soft:尽最大努力调度antiAffinity: "hard"## 容忍配置(一般 kubernetes master 或其它设置污点的节点,只有指定容忍才能进行调度,如果测试环境只有三个节点,则可以开启在 master 节点安装应用)#tolerations: # - operator: "Exists" ##容忍全部污点
3、ElasticSearch Client
创建es-client-values.yaml
文件
# ============设置集群名称============## 设置集群名称clusterName: "elasticsearch"## 设置节点名称nodeGroup: "client"## 设置角色roles:master: "false"ingest: "false"data: "false"# ============镜像配置============## 指定镜像与镜像版本image: "docker.elastic.co/elasticsearch/elasticsearch"imageTag: "7.7.1"## 副本数replicas: 2# ============资源配置============## JVM 配置参数esJavaOpts: "-Xmx1g -Xms1g"## 部署资源配置(生成环境一定要设置大些)resources:requests:cpu: "1000m"memory: "2Gi"limits:cpu: "1000m"memory: "2Gi"## 数据持久卷配置persistence:enabled: false# ============安全配置============## 设置协议,可配置为 http、httpsprotocol: http## 证书挂载配置,这里我们挂入上面创建的证书secretMounts:- name: elastic-certificatessecretName: elastic-certificatespath: /usr/share/elasticsearch/config/certs## 允许您在/usr/share/elasticsearch/config/中添加任何自定义配置文件,例如 elasticsearch.yml## ElasticSearch 7.x 默认安装了 x-pack 插件,部分功能免费,这里我们配置下## 下面注掉的部分为配置 https 证书,配置此部分还需要配置 helm 参数 protocol 值改为 httpsesConfig:elasticsearch.yml: |xpack.security.enabled: truexpack.security.transport.ssl.enabled: truexpack.security.transport.ssl.verification_mode: certificatexpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12# xpack.security.http.ssl.enabled: true# xpack.security.http.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12# xpack.security.http.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12## 环境变量配置,这里引入上面设置的用户名、密码 secret 文件extraEnvs:- name: ELASTIC_USERNAMEvalueFrom:secretKeyRef:name: elastic-credentialskey: username- name: ELASTIC_PASSWORDvalueFrom:secretKeyRef:name: elastic-credentialskey: password# ============Service 配置============service:type: NodePortnodePort: "30200"
4、Kibana 安装的配置文件
创建es-kibana-values.yaml
文件
# ============镜像配置============## 指定镜像与镜像版本image: "docker.elastic.co/kibana/kibana"imageTag: "7.7.1"## 配置 ElasticSearch 地址elasticsearchHosts: "http://elasticsearch-client:9200"# ============环境变量配置============## 环境变量配置,这里引入上面设置的用户名、密码 secret 文件extraEnvs:- name: 'ELASTICSEARCH_USERNAME'valueFrom:secretKeyRef:name: elastic-credentialskey: username- name: 'ELASTICSEARCH_PASSWORD'valueFrom:secretKeyRef:name: elastic-credentialskey: password# ============资源配置============resources:requests:cpu: "1000m"memory: "2Gi"limits:cpu: "1000m"memory: "2Gi"# ============配置 Kibana 参数============## kibana 配置中添加语言配置,设置 kibana 为中文kibanaConfig:kibana.yml: |i18n.locale: "zh-CN"# ============Service 配置============service:type: NodePortnodePort: "30601"
七、helm 安装
ElasticSearch 与 Kibana 的 Helm Chart 模板是 ES 官方 Github 获取的,它的 Github 地址为 /elastic/helm-charts 可以访问该地址了解更多信息。
1、Helm 安装 ElasticSearch
ElaticSearch 安装需要安装三次,分别安装 ElasticSearch Master、ElasticSearch Data、ElasticSearch Client 三组。
安装的第一组 ElasticSearch 作为 Master 角色节点,负责集群间的管理工作;安装的第二组 ElasticSearch 作为 Data 节点,负责存储数据;安装的第三组 ElasticSearch 作为 Client 节点,负责代理 ElasticSearch Cluster 集群,负载均衡。
ElasticSearch 安装部署如下:
-f
:指定部署配置文件–version
:指定使用的 Helm Chart 版本号
# 添加 Chart 仓库helm repo add elastic https://helm.elastic.cohelm repo update# 安装 ElasticSearch Master 节点helm install elasticsearch-master -f es-master-values.yaml --version 7.7.1 elastic/elasticsearch# 安装 ElasticSearch Data 节点helm install elasticsearch-data -f es-data-values.yaml --version 7.7.1 elastic/elasticsearch# 安装 ElasticSearch Client 节点helm install elasticsearch-client -f es-client-values.yaml --version 7.7.1 elastic/elasticsearch
⚠️注意:
❝
在安装 Master 节点后 Pod 启动时候会抛出异常,就绪探针探活失败,这是个正常现象。在执行安装 Data 节点后 Master 节点 Pod 就会恢复正常。
❞
2、Helm 安装 Kibana
helm install kibana -f es-kibana-values.yaml --version 7.7.1 elastic/kibana
八、查看安装的应用资源
查看部署完成后各个组件的列表与状态:
$ kubectl get service,pod | grep -E 'elasticsearch|kibana'service/elasticsearch-client NodePort 10.96.209.182 <none> 9200:30200/TCP,9300:30209/TCP 3m35sservice/elasticsearch-client-headless ClusterIP None <none> 9200/TCP,9300/TCP3m35sservice/elasticsearch-data ClusterIP 10.96.219.21 <none> 9200/TCP,9300/TCP4m12sservice/elasticsearch-data-headlessClusterIP None <none> 9200/TCP,9300/TCP4m12sservice/elasticsearch-master ClusterIP 10.96.37.135 <none> 9200/TCP,9300/TCP5m11sservice/elasticsearch-master-headless ClusterIP None <none> 9200/TCP,9300/TCP5m15sservice/kibana-kibana NodePort 10.96.107.176 <none> 5601:30601/TCP 90spod/elasticsearch-client-0 0/1Running 03m35spod/elasticsearch-client-1 0/1Running 03m35spod/elasticsearch-data-0 0/1Running 04m12spod/elasticsearch-data-1 0/1Running 04m12spod/elasticsearch-data-2 0/1Running 04m11spod/elasticsearch-master-0 0/1Running 05m11spod/elasticsearch-master-1 0/1Running 05m10spod/elasticsearch-master-2 0/1Running 05m9spod/kibana-kibana-6f785f69c9-gzc2p 0/1Running 088s
Pod 信息描述:
elasticsearch-master:ES 主节点 Pod;elasticsearch-data:ES 数据节点 Pod;elasticsearch-client:ES 客户端节点 Pod;kibana-kibana:Kibana Pod;
十、访问 Kibana 浏览 ElasticSearch 数据
由上面我们指定了 Kibana 的 NodePort 端口为 30601,所以这里我们输入地址:http://nodeIp:30601 访问 Kibana 界面。
然后我们可以看到,会出现登录框,让我们输出用户名、密码,这里我们输入上面配置的用户名、密码elastic/admin@123
进行登录:
登录
登录成功后就跳转到 Kibana 主界面:
Kibana 主界面
示例资料:
/zuozewei/blog-example/tree/master/Kubernetes/k8s-ek
参考链接:
Kubernetes Helm3 部署 ElasticSearch & Kibana 7 集群
如果觉得《Helm部署ElasticSearch Kibana 7 集群》对你有帮助,请点赞、收藏,并留下你的观点哦!