文章轉載自:http://www.mydlq.club/article/13/
系統環境:
- helm 版本:v3.2.1
- Kubernetes 版本:1.18.3
- ElasticSearch Chart 版本:7.7.1
- Kibana & ElasticSearch 版本:7.7.1
一、簡介
- Helm: Helm3(注意:helm 2.0 版本與 3.0 有很大區別)是與 kubernetes 的 kube-apiserver 進行交互,通過 Kubernetes API 控制應用啟動、更新與刪除的客戶端。
- Elasticsearch: ElasticSearch 是一個分布式的搜索和分析引擎,可以用於全文檢索、結構化檢索和分析,並能將這三者結合起來。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便,輕松擴展服務節點,更能用於日志收集快速檢索等等一些列功能。
- Kibana: Kibana 是一個為 ElasticSearch 平台分析和可視化的開源平台,使用 Kibana 能夠搜索、展示存儲在 ElasticSearch 中的索引數據。使用它可以很方便用圖表、表格、地圖展示和分析數據。
二、環境配置
Kubernetes 節點信息
Elastic 棧 Chart 版本說明
ElasticSearch 安裝資源要求
ElasticSearch 集群環境信息
Kibana 環境信息
三、配置 StorageClass
配置一個 SotrageClass,用於創建 Kubernetes 存儲用的 PV、PVC,因為 ElasticSearch 部署的是 StatefulSet 類型資源,涉及到自動卷分配,需要一個存儲卷分配服務。例如,使用 NFS 存儲就需要 NFS 共享網絡卷的 NFS-Provisioner 服務,能夠幫我們自動創建存儲空間及 PV 與 PVC,請確認 Kubernetes 集群中存在這樣的卷分配服務。
例如,本人使用的是 NFS 存儲卷,且存在 NFS Provisioner 服務,則可以按以下配置 StorageClass,如下:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: nfs-storage
provisioner: nfs-client ## 需要和 NFS-Provisioner 服務提供者提供的配置的保持一致
allowVolumeExpansion: true
reclaimPolicy: Delete
其他存儲卷系統請自行查詢如何配置 StorageClass,當然也可以提前設置 PVC,然后在 Heml 配置參數文件 values.yaml 中指定要用的 PVC 名稱。
實踐操作時使用rook-ceph提供的cephfs
四、提前下載鏡像
提前將要部署的應用的鏡像下載,避免安裝時因為鏡像下載過慢而導致安裝失敗。這里我們主要用到的兩個鏡像,下載操作如下:
## 拉取 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、添加證書到 Kubernetes
# 添加證書
$ kubectl create secret -n mydlqcloud generic elastic-certificates --from-file=elastic-certificates.p12
# 設置集群用戶名密碼,用戶名不建議修改
$ kubectl create secret -n mydlqcloud generic elastic-credentials \
--from-literal=username=elastic --from-literal=password=mydlq123
六、配置應用參數
通過 Helm 安裝 ElasticSearch、Kibana 需要事先創建一個帶有配置參數的 values.yaml 文件。然后再執行 Helm install 安裝命令時,指定使用此文件。
1、創建 ElasticSearch Master 安裝的配置文件
創建 es-master-values.yaml 文件
$ vi 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
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 5Gi
# ============安全配置============
## 設置協議,可配置為 http、https
protocol: http
## 證書掛載配置,這里我們掛入上面創建的證書
secretMounts:
- name: elastic-certificates
secretName: elastic-certificates
path: /usr/share/elasticsearch/config/certs
## 允許您在/usr/share/elasticsearch/config/中添加任何自定義配置文件,例如 elasticsearch.yml
## ElasticSearch 7.x 默認安裝了 x-pack 插件,部分功能免費,這里我們配置下
## 下面注掉的部分為配置 https 證書,配置此部分還需要配置 helm 參數 protocol 值改為 https
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
# 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_USERNAME
valueFrom:
secretKeyRef:
name: elastic-credentials
key: username
- name: ELASTIC_PASSWORD
valueFrom:
secretKeyRef:
name: elastic-credentials
key: password
# ============調度配置============
## 設置調度策略
## - hard:只有當有足夠的節點時 Pod 才會被調度,並且它們永遠不會出現在同一個節點上
## - soft:盡最大努力調度
antiAffinity: "hard"
## 容忍配置(一般 kubernetes master 或其它設置污點的節點,只有指定容忍才能進行調度,如果測試環境只有三個節點,則可以開啟在 master 節點安裝應用)
#tolerations:
# - operator: "Exists" ##容忍全部污點
2、創建 ElasticSearch Data 安裝的配置文件
創建 es-data-values.yaml 文件
$ vi 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
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 50Gi
# ============安全配置============
## 設置協議,可配置為 http、https
protocol: http
## 證書掛載配置,這里我們掛入上面創建的證書
secretMounts:
- name: elastic-certificates
secretName: elastic-certificates
path: /usr/share/elasticsearch/config/certs
## 允許您在/usr/share/elasticsearch/config/中添加任何自定義配置文件,例如 elasticsearch.yml
## ElasticSearch 7.x 默認安裝了 x-pack 插件,部分功能免費,這里我們配置下
## 下面注掉的部分為配置 https 證書,配置此部分還需要配置 helm 參數 protocol 值改為 https
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
# 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_USERNAME
valueFrom:
secretKeyRef:
name: elastic-credentials
key: username
- name: ELASTIC_PASSWORD
valueFrom:
secretKeyRef:
name: elastic-credentials
key: password
# ============調度配置============
## 設置調度策略
## - hard:只有當有足夠的節點時 Pod 才會被調度,並且它們永遠不會出現在同一個節點上
## - soft:盡最大努力調度
antiAffinity: "hard"
## 容忍配置(一般 kubernetes master 或其它設置污點的節點,只有指定容忍才能進行調度,如果測試環境只有三個節點,則可以開啟在 master 節點安裝應用)
#tolerations:
# - operator: "Exists" ##容忍全部污點
3、創建 ElasticSearch Client 安裝的配置文件
創建 es-data-values.yaml 文件
$ vi 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、https
protocol: http
## 證書掛載配置,這里我們掛入上面創建的證書
secretMounts:
- name: elastic-certificates
secretName: elastic-certificates
path: /usr/share/elasticsearch/config/certs
## 允許您在/usr/share/elasticsearch/config/中添加任何自定義配置文件,例如 elasticsearch.yml
## ElasticSearch 7.x 默認安裝了 x-pack 插件,部分功能免費,這里我們配置下
## 下面注掉的部分為配置 https 證書,配置此部分還需要配置 helm 參數 protocol 值改為 https
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
# 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_USERNAME
valueFrom:
secretKeyRef:
name: elastic-credentials
key: username
- name: ELASTIC_PASSWORD
valueFrom:
secretKeyRef:
name: elastic-credentials
key: password
# ============Service 配置============
service:
type: NodePort
nodePort: "30200"
4、創建 Kibana 安裝的配置文件
創建 kibana-values.yaml 文件
$ vi 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-credentials
key: username
- name: 'ELASTICSEARCH_PASSWORD'
valueFrom:
secretKeyRef:
name: elastic-credentials
key: password
# ============資源配置============
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "500m"
memory: "1Gi"
# ============配置 Kibana 參數============
## kibana 配置中添加語言配置,設置 kibana 為中文
kibanaConfig:
kibana.yml: |
i18n.locale: "zh-CN"
# ============Service 配置============
service:
type: NodePort
nodePort: "30601"
七、Helm 安裝 ElasticSearch、Kibana
ElasticSearch 與 Kibana 的 Helm Chart 模板是 ES 官方 Github 獲取的,它的 Github 地址為 https://github.com/elastic/helm-charts 可以訪問該地址了解更多信息。
這里我們只介紹下如何使用 Helm 安裝 ElasticSearch 與 Kibana 應用,操作如下:
1、Helm 增加 Elastic 倉庫
$ helm repo add elastic https://helm.elastic.co
2、Helm 安裝 ElasticSearch
ElaticSearch 安裝需要安裝三次,分別安裝 ElasticSearch Master、ElasticSearch Data、ElasticSearch Client 三組,安裝的第一組 ElasticSearch 作為 Master 角色節點,負責集群間的管理工作;安裝的第二組 ElasticSearch 作為 Data 節點,負責存儲數據;安裝的第三組 ElasticSearch 作為 Client 節點,負責代理 ElasticSearch Cluster 集群,負載均衡。
ElasticSearch 安裝部署如下:
- -f:指定部署配置文件
- --version:指定使用的 Helm Chart 版本號
- --namespace:指定部署應用的 Namespace 空間
在安裝 Master 節點后 Pod 啟動時候會拋出異常,就緒探針探活失敗,這是個正常現象。在執行安裝 Data 節點后 Master 節點 Pod 就會恢復正常。
## 安裝 ElasticSearch Master 節點
$ helm install elasticsearch-master -f es-master-values.yaml --namespace mydlqcloud --version 7.7.1 elastic/elasticsearch
## 安裝 ElasticSearch Data 節點
$ helm install elasticsearch-data -f es-data-values.yaml --namespace mydlqcloud --version 7.7.1 elastic/elasticsearch
## 安裝 ElasticSearch Client 節點
$ helm install elasticsearch-client -f es-client-values.yaml --namespace mydlqcloud --version 7.7.1 elastic/elasticsearch
3、Helm 安裝 Kibana
$ helm install kibana -f kibana-values.yaml --namespace mydlqcloud --version 7.7.1 elastic/kibana
八、查看安裝的應用資源
查看部署完成后各個組件的列表與狀態:
$ kubectl get service,pod -n mydlqcloud | grep -E 'elasticsearch|kibana'
service/elasticsearch-client NodePort 10.111.34.166 <none> 9200:30200/TCP,9300:30022/TCP
service/elasticsearch-client-headless ClusterIP None <none> 9200/TCP,9300/TCP
service/elasticsearch-data ClusterIP 10.101.38.61 <none> 9200/TCP,9300/TCP
service/elasticsearch-data-headless ClusterIP None <none> 9200/TCP,9300/TCP
service/elasticsearch-master ClusterIP 10.98.230.101 <none> 9200/TCP,9300/TCP
service/elasticsearch-master-headless ClusterIP None <none> 9200/TCP,9300/TCP
service/kibana-kibana NodePort 10.106.53.52 <none> 5601:30601/TCP
pod/elasticsearch-client-0 1/1 Running 0
pod/elasticsearch-data-0 1/1 Running 0
pod/elasticsearch-master-0 1/1 Running 0
pod/elasticsearch-master-1 1/1 Running 0
pod/elasticsearch-master-2 1/1 Running 0
pod/kibana-kibana-5658b7b899-x5265 1/1 Running 0
Pod 信息描述:
- elasticsearch-master:ES 主節點 Pod;
- elasticsearch-data:ES 數據節點 Pod;
- elasticsearch-client: ES 客戶端節點 Pod;
- kibana-kibana:Kibana Pod;
九、訪問 Kibana 瀏覽 ElasticSearch 數據
由上面我們指定了 Kibana 的 NodePort 端口為 30601 而我的 Kubernetes 集群地址為 192.168.2.11,所以這里我們輸入地址: http://192.168.2.11:30601 訪問 Kibana 界面。
然后我們可以看到,會出現登錄框,讓我們輸出用戶名、密碼,這里我們輸入上面配置的用戶名、密碼 elastic/mydlq123 進行登錄:
登錄成功后就跳轉到 Kibana 主界面: