fbpx

Elastic Cloud on Kubernetes (ECK) 讓 ELK 部署變簡單 – 概念介紹與快速上手指南!

Marr 技術顧問 歐立威科技

ECK 自動部署與功能介紹

想在 Kubernetes(K8s)環境部署 ELK 軟體,可以分成手動設定和自動設定兩種方式。

所謂手動方式,是指管理員編輯資源配置檔內容,像是指定 StatefulSets 或 Deployment 來進行設定和管理,因為這些運營應用程式的知識都在管理員的腦子裡,也可能散見於 Shell Script 或 Ansible 腳本裡,很難被管控或重覆利用。

為了簡化這個流程,讓管理運營 Kubernetes 的知識能被轉化為軟體形式,一套稱為 Operator Framework 的開源工具集應運而生,它能用來管理 K8s 應用程式,其中也包括稱為 Operator 的原生應用程式。

在 Kubernetes 導入 Operator 之後,開始有了第二種自動設定的方式,透過 Elastic 官方釋出的 ECK 工具,我們就可以更方便地進行 ELK 的自動部署和管理。

EKLK/ECK 部署概念圖

ECK 是 Elastic Cloud on Kubernetes 的縮寫,有了它,就能在 Kubernetes 環境快速完成下列的常見工作: 

  1. 管理和監控多個群集
  2. 安全地執行設定調整以完成滾動升級
  3. 橫向延展群集的資源和空間
  4. 設定群集的 TLS 憑證
  5. 設定「熱-暖-冷」資料節點的架構

Operator 運作原理

雖然 Operator 和 ECK 處理掉許多複雜的工作,還是值得我們稍微理解它背後的原理。

在 Kubernetes 裡有個稱為控制器 (Controller) 的核心概念,控制器在 Master 節點裡是個不停執行的程式,並且針對特定物件進行監控。

例如,使用者指定 Deployment 新的 replica 數量為 3 之後,控制器在接收到更新通知,就會比對 Kubernetes 群集狀態,努力確保狀態和宣告的指定值能夠一致。

因為 Kubernetes 1.7 版本之後導入稱為客製化資源定義(Custom Resource Definition, CRD)的機制,讓開發者可以仿照控制器的原理,自行設定 Operator 來包裝管理應用程式,你可以想像 Operator 就是一種控制器,差別在於它是作用於應用程式的層級。

從 Operator 的視角,我們不再把應用程式看成是一堆 Pod、Deployment、Service、ConfigMap 的資源集合,而在邏輯上把應用程式看成單一物件,直覺地當成一按搞定的快速鍵。

本文要跟大家介紹的主角 ECK,就是一套由 Elastic 公司提供的 Operator 工具,它透過 CRD 定義了一系列新的物件類別,使用者能夠依照一致而直覺的操作介面來管理 ELK 元件。

舉例來說,我們也可以找到 MongoDB 的 Kubernetes Operator [1] 來用,而且它還分成社群版企業版兩種,使用者依照需要來決定哪一種。

ECK 事前準備

在實際動手前,應該要先確認手邊的作業環境是否完整被 ECK 版本所支援,以 ECK 2.5.0 為例,它在 2022 年 11 月釋出,相容的 Kubernetes 版本是 1.21 到 1.25。

如果使用的是 GKE 平台,要確認擁有 cluster-admin 權限,如果是用 Amazon EKS 平台,要確認 443 埠號能夠連通。

更多詳細的版本細節,可參考: https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s_supported_versions.html https://www.elastic.co/support/matrix#matrix_kubernetes

確保 Kubernetes 節點至少擁有 2GB 的記憶體剩餘空間,不然 Elasticsearch 的 Pod 容易卡在 Pending 狀態。

另外 Kibana 或 APM Server 都有各自合適的運算資源下限,請參考 https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-managing-compute-resources.html

ECK 快速上手

首先,利用下列指令來完成 CRD 安裝:

$ kubectl create -f https://download.elastic.co/downloads/eck/2.5.0/crds.yaml

順利的話,會看到螢幕回應成功建立 Elastic 資源的訊息。也可以執行下列指令來查看 crd 資訊:

$ kubectl get crd
CRD 資訊

接著,利用下列指令安裝 Operator 和 RBAC 規則:

$ kubectl apply -f https://download.elastic.co/downloads/eck/2.5.0/operator.yaml
Operator 和 RBAC 規則

值得注意的是,我們預設使用 elastic-system 命名空間來管理 ECK Operator,也建議針對工作環境選定 elastic-system 或 default 之外的命名空間。

$ kubectl -n elastic-system logs -f statefulset.apps/elastic-operator

以上指令可以觀察 Operator 的日誌訊息。

log 訊息

ECK 佈署 Elasticsearch

最簡單的起手式是建立單一節點的 Elasticsearch (ES) 群集,我們可以編輯 quickstart-es.yml 檔案,內容如下:

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 8.5.1
  nodeSets:
  - name: default
    count: 1
    config:
      node.store.allow_mmap: false

接著,執行下列指令讓上述的設定檔生效:

$ kubectl apply -f quickstart-es.yml

檢查 ECK 是否順利讓設定值生效:

$ kubectl get elasticsearch
apply es

上述指令可以簡化成 kubectl get es 形式。留意到指令輸出結果的 HEALTH 欄位,它會提示部署中的 Elasticsearch 健康狀態,如果不是 green 的話,可以再透過 kubectl describe pod quickstart-es-default-0 之類的指令來查看細節。

describe-es
readiness-probe
green-running

等到 ES 群集健康值顯示為 green,再透過下列的指令群,可以看到 ES 成功連線的訊息。

$ PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}')
$ kubectl port-forward service/quickstart-es-http 9200
$ curl -u "elastic:$PASSWORD" -k "https://localhost:9200"
es-http
curl-es

同樣建立一個 quickstart-kb.yml 檔案,編輯內容如下:

apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 8.5.1
  count: 1
  elasticsearchRef:
    name: quickstart

執行下列指令來完成 Kibana 佈署:

$ kubectl apply -f quickstart-kb.yml
$ kubectl port-forward service/quickstart-kb-http 5601
apply-kb
describe-kb

Kibana 登入 Elasticsearch 的帳號是 elastic 而密碼可由 Secret 資源內容取得:

secret-es

一切順利的話,就可以打開瀏覽器來存取 Kibana 的登入畫面。

結論

透過 ECK 在 K8S 環境部署 ELK 有下列好處和注意事項:

1. 想要清空部署環境的相關資源,可以使用 kubectl delete elasticsearch quickstart 之類的指令,將 ES 或 Kibana 當成資源單位,相當直覺。

2. 如果遇到錯誤訊息,同樣要透過 K8S 環境的除錯工具和步驟,可參考官網的說明文件。

3. ES 或 Kibana 的成功啟動需要合理時間的等待,特別是 ES 最後階段是 Readiness Probe 的確認,如果超過十分鐘沒有正常反應,動手除錯吧。