iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
0
自我挑戰組

從 RedHat OpenShift 社群版 OKD 看 Kubernetes系列 第 12

[偷一下未來的進度] Day 12 :Kubernetes 純手動部署與設定 EFK (2/4)

  • 分享至 

  • xImage
  •  

最近家人工作意外摔斷了腿,我在醫院幫忙照料,通常都半夜才開始寫文章整理相關的資料,如果文章或是資料有錯誤的地方還請大大們不要吝嗇幫忙點出,我會盡快做修正,謝謝。

昨天向大家提到了三個在部署叢集式的 Elasticsearch 會遇到的問題,今天會介紹Production modeElasticsearch 角色以及永久性儲存這些問題如在Kubernetes部署叢集式的 Elasticsearch 是如何處理的。

Production mode

按照Elasticsearch Production mode的建議說明指出若是要將此環境設計為 Production mode 需要調整 Linux Kernel 中的 max_map_count 參數。

Kubernetes 上可以透過兩種方式來修改 Linux Kernel 中的 max_map_count 參數。

  1. init-container
    透過 init-container 的方式調整 Linux Kernel 中的 max_map_count 參數,由於 Kubernetes 的 Pod 裡 Container 是共用 Namespace ,所以我們可以對 init-container 的進行設定, Yaml 設定檔如下所示。
...
      initContainers:
      - image: alpine:3.6
        command: ["/sbin/sysctl", "-w", "vm.max_map_count=262144"]
        name: elasticsearch-logging-init
        securityContext:
          privileged: true
...
  1. postStart
    透過 postStart 的方式在 Elasticsearch Pod 啟動前
    調整 Linux Kernel 中的 max_map_count 參數, Yaml 設定檔如下所示。
...
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 的方式。

issue02-角色問題

Elasticsearch 系統節點可以分為兩個角色分別是 Master Node 以及 Data Node,那如何將 Elasticsearch Pod 設定為Master Node 或是 Data Node 呢?

  1. 為特定角色建立資源

設定 Elasticsearch Container 的環境變數可以指定該 Pod 是什麼角色,例如可以在環境變數設置 node.master=truenode.data=falsenode.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 角色時會出現腦裂問題,關於這個問題我後續會說明如何解決。

issue03-永久性儲存問題

因為 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 的部署。


上一篇
[偷一下未來的進度] Day 11 :Kubernetes 純手動部署與設定 EFK (1/4)
下一篇
[偷一下未來進度]Day 13 :Kubernetes 純手動部署與設定 EFK (3/4)
系列文
從 RedHat OpenShift 社群版 OKD 看 Kubernetes17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言