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

ECK 自動部署與功能介紹
想在 Kubernetes(K8s)環境部署 ELK 軟體,可以分成手動設定和自動設定兩種方式。
所謂手動方式,是指管理員編輯資源配置檔內容,像是指定 StatefulSets 或 Deployment 來進行設定和管理,因為這些運營應用程式的知識都在管理員的腦子裡,也可能散見於 Shell Script 或 Ansible 腳本裡,很難被管控或重覆利用。
為了簡化這個流程,讓管理運營 Kubernetes 的知識能被轉化為軟體形式,一套稱為 Operator Framework 的開源工具集應運而生,它能用來管理 K8s 應用程式,其中也包括稱為 Operator 的原生應用程式。
在 Kubernetes 導入 Operator 之後,開始有了第二種自動設定的方式,透過 Elastic 官方釋出的 ECK 工具,我們就可以更方便地進行 ELK 的自動部署和管理。
ECK 是 Elastic Cloud on Kubernetes 的縮寫,有了它,就能在 Kubernetes 環境快速完成下列的常見工作:
- 管理和監控多個群集
- 安全地執行設定調整以完成滾動升級
- 橫向延展群集的資源和空間
- 設定群集的 TLS 憑證
- 設定「熱-暖-冷」資料節點的架構
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

接著,利用下列指令安裝 Operator 和 RBAC 規則:
$ kubectl apply -f https://download.elastic.co/downloads/eck/2.5.0/operator.yaml

值得注意的是,我們預設使用 elastic-system 命名空間來管理 ECK Operator,也建議針對工作環境選定 elastic-system 或 default 之外的命名空間。
$ kubectl -n elastic-system logs -f statefulset.apps/elastic-operator
以上指令可以觀察 Operator 的日誌訊息。

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

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



等到 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"


同樣建立一個 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


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

一切順利的話,就可以打開瀏覽器來存取 Kibana 的登入畫面。
結論
透過 ECK 在 K8S 環境部署 ELK 有下列好處和注意事項:
1. 想要清空部署環境的相關資源,可以使用 kubectl delete elasticsearch quickstart 之類的指令,將 ES 或 Kibana 當成資源單位,相當直覺。
2. 如果遇到錯誤訊息,同樣要透過 K8S 環境的除錯工具和步驟,可參考官網的說明文件。
3. ES 或 Kibana 的成功啟動需要合理時間的等待,特別是 ES 最後階段是 Readiness Probe 的確認,如果超過十分鐘沒有正常反應,動手除錯吧。