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 的確認,如果超過十分鐘沒有正常反應,動手除錯吧。


相關文章