最近家人工作意外摔斷了腿,我在醫院幫忙照料,通常都半夜才開始寫文章整理相關的資料,如果文章或是資料有錯誤的地方還請大大們不要吝嗇幫忙點出,我會盡快做修正,謝謝。
昨天向大家提到了三個在部署叢集式的 Elasticsearch 會遇到的問題,今天會介紹Production mode、Elasticsearch 角色以及永久性儲存這些問題如在Kubernetes部署叢集式的 Elasticsearch 是如何處理的。
按照Elasticsearch Production mode的建議說明指出若是要將此環境設計為 Production mode 需要調整 Linux Kernel 中的 max_map_count 參數。
Kubernetes 上可以透過兩種方式來修改 Linux Kernel 中的 max_map_count 參數。
...
initContainers:
- image: alpine:3.6
command: ["/sbin/sysctl", "-w", "vm.max_map_count=262144"]
name: elasticsearch-logging-init
securityContext:
privileged: true
...
...
lifecycle:
postStart:
exec:
command: ["/bin/bash", "-c", "sysctl -w vm.max_map_count=262144;"]
ports:
- containerPort: 9200
protocol: TCP
- containerPort: 9300
protocol: TCP
...
我們可以選擇其中一種方式來調整 Linux Kernel 中的 max_map_count 參數,本篇文章使用的是第一種 init container 的方式。
Elasticsearch 系統節點可以分為兩個角色分別是 Master Node 以及 Data Node,那如何將 Elasticsearch Pod 設定為Master Node 或是 Data Node 呢?
設定 Elasticsearch Container 的環境變數可以指定該 Pod 是什麼角色,例如可以在環境變數設置 node.master=true 、 node.data=false 、 node.ingest=flase ,在 Container 啟動時會讀取這些環境變數進而使該節點為特定的角色, Yaml 設定檔如下所示。
...
containers:
- name: elasticsearch-master
image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.3
ports:
- containerPort: 9200
protocol: TCP
- containerPort: 9300
protocol: TCP
env:
- name: "cluster.name"
value: "elasticsearch-cluster"
- name: "node.master"
value: "true"
- name: "node.data"
value: "false"
- name: "node.ingest"
value: "false"
...
其次我們可以利用 Kubernetes Deployment 的特性啟動多個 Elasticsearch Master 角色達到高可用性(High-ability,HA)以及附載均衡(Load Balance)的功能,不過在部署多個 Elasticsearch Master 角色時會出現腦裂問題,關於這個問題我後續會說明如何解決。
因為 Kubernetes 系統架構中 Pod 元件是具有臨時且不可回復的特性一旦因外在因素或是不預期情況服務中斷,儲存於 Pod 上的資料也會跟著 Pod 一起被刪除。若重新啟動新的 Pod 以取代r舊的 Pod ,新啟動的 Pod 仍然無法得知舊的 Pod 儲存了什麼資料,所以也無法回覆舊 Pod 的已儲存的資訊。
為了避免 Elasticsearch Pod 故障(搬遷、實際節點損壞、污染...現實生活中有很多可怕的情況)導致資料遺失,我在這邊採用 NFS 將 Elasticsearch 的資料儲存於 NFV 上, 因為我們要可以隨時擴展 Elasticsearch 節點,所以要生成很多的 (Persistent Volumes,PV) 與 (Persistent Volumes Claim,PVC),這個需求我們可以依賴Storage Classes的幫忙可以減少很多麻煩,Yaml 設定檔如下所示。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: log
provisioner: fuseim.pri/ifs
今天大致講述了如何解決在 Kubernetes 上部署 Elasticsearch 會遇到的問題,但扔然有相關的問題需要處理。例如在部署多個 Elasticsearch Master 角色時會出現腦裂問題以及如何整合永久性儲存、角色與Production mode要設定的東西。明天繼續加油,了解這些東西要如何放到一個yaml檔做設定完成 Elasticsearch Cluster 在 Kubernetes 的部署。