您好,登錄后才能下訂單哦!
這篇文章給大家分享的是Kubernetes搭建Elasticsearch集群的教程。小編覺得挺實用的,因此分享給大家學習。如下資料是關于搭建Elasticsearch的內容。
Elasticsearch 是一個實時的、分布式的可擴展的搜索引擎,允許進行全文、結構化搜索,它通常用于索引和搜索大量日志數據,也可用于搜索許多不同類型的文檔。
Elasticsearch 通常與 Kibana 一起部署,Kibana 是 Elasticsearch 的一個功能強大的數據可視化 Dashboard,Kibana 允許你通過 web 界面來瀏覽 Elasticsearch 日志數據。
Fluentd是一個流行的開源數據收集器,我們將在 Kubernetes 集群節點上安裝 Fluentd,通過獲取容器日志文件、過濾和轉換日志數據,然后將數據傳遞到 Elasticsearch 集群,在該集群中對其進行索引和存儲。
我們先來配置啟動一個可擴展的 Elasticsearch 集群,然后在 Kubernetes 集群中創建一個 Kibana 應用,最后通過 DaemonSet 來運行 Fluentd,以便它在每個 Kubernetes 工作節點上都可以運行一個 Pod。
1.創建 Elasticsearch 集群
在創建 Elasticsearch 集群之前,我們先創建一個命名空間。
新建一個kube-efk.yaml
kubectl apply -f kube-efk.yaml
kubectl get ns 查看有沒有這個efk的命名空間
這里我們使用3個 Elasticsearch Pod 來避免高可用下多節點集群中出現的“腦裂”問題,當一個或多個節點無法與其他節點通信時會產生“腦裂”,可能會出現幾個主節點。
一個關鍵點是您應該設置參數discover.zen.minimum_master_nodes=N/2+1,其中N是 Elasticsearch 集群中符合主節點的節點數,比如我們這里3個節點,意味著N應該設置為2。這樣,如果一個節點暫時與集群斷開連接,則另外兩個節點可以選擇一個新的主節點,并且集群可以在最后一個節點嘗試重新加入時繼續運行,在擴展 Elasticsearch 集群時,一定要記住這個參數。
首先創建一個名為 elasticsearch 的無頭服務,新建文件 elasticsearch-svc.yaml,文件內容如下:
定義了一個名為 elasticsearch 的 Service,指定標簽app=elasticsearch,當我們將 Elasticsearch StatefulSet 與此服務關聯時,服務將返回帶有標簽app=elasticsearch的 Elasticsearch Pods 的 DNS A 記錄,然后設置clusterIP=None,將該服務設置成無頭服務。最后,我們分別定義端口9200、9300,分別用于與 REST API 交互,以及用于節點間通信。
然后我們創建這個無頭服務
kubectl apply -f elasticsearch-svc.yaml
現在我們已經為 Pod 設置了無頭服務和一個穩定的域名.elasticsearch.logging.svc.cluster.local,接下來我們通過 StatefulSet 來創建具體的 Elasticsearch 的 Pod 應用。
Kubernetes StatefulSet 允許我們為 Pod 分配一個穩定的標識和持久化存儲,Elasticsearch 需要穩定的存儲來保證 Pod 在重新調度或者重啟后的數據依然不變,所以需要使用 StatefulSet 來管理 Pod。
我們使用了一個名為 es-data-db 的 StorageClass 對象,所以我們需要提前創建該對象,我們這里使用的 NFS 作為存儲后端,所以需要安裝一個對應的 provisioner 驅動,
我們先創建elasticsearch-storageclass.yaml
然后我們創建pvc來對應這個storageclass
elasticsearch-pvc.yaml
最后我們創建這個statefulset
elasticsearch-statefulset.yaml
然后我們使用kubectl創建
kubectl apply -f elasticsearch-storageclass.yaml
kubectl apply -f elasticsearch-pvc.yaml
kubectl apply -f elasticsearch-statefulset.yaml
然后我們查看pod的運行情況
Pods 部署完成后,我們可以通過請求一個 REST API 來檢查 Elasticsearch 集群是否正常運行。使用下面的命令將本地端口9200轉發到 Elasticsearch 節點(如es-cluster-0)對應的端口:
然后我們開另一個窗口
正常來說,應該會有這樣的信息。
看到上面的信息就表明我們名為 k8s-logs 的 Elasticsearch 集群成功創建了3個節點:es-cluster-0,es-cluster-1,和es-cluster-2,當前主節點是 es-cluster-0。
2.創建 Kibana 服務
Elasticsearch 集群啟動成功了,接下來我們可以來部署 Kibana 服務,新建一個名為 kibana.yaml 的文件,對應的文件內容如下:
上面我們定義了兩個資源對象,一個 Service 和 Deployment,為了測試方便,我們將 Service 設置為了 NodePort 類型,Kibana Pod 中配置都比較簡單,唯一需要注意的是我們使用 ELASTICSEARCH_URL 這個環境變量來設置Elasticsearch 集群的端點和端口,直接使用 Kubernetes DNS 即可,此端點對應服務名稱為 elasticsearch,由于是一個 headless service,所以該域將解析為3個 Elasticsearch Pod 的 IP 地址列表。
然后我們創建這個服務
kubectl apply -f kibana.yaml
過了一會,我們的kibana的服務就起來了。
如果 Pod 已經是 Running 狀態了,證明應用已經部署成功了,然后可以通過 NodePort 來訪問 Kibana 這個服務,在瀏覽器中打開http://<任意節點IP>:30245即可,如果看到如下歡迎界面證明 Kibana 已經成功部署到了 Kubernetes集群之中。
3.部署 Fluentd
Fluentd 是一個高效的日志聚合器,是用 Ruby 編寫的,并且可以很好地擴展。對于大部分企業來說,Fluentd 足夠高效并且消耗的資源相對較少,另外一個工具Fluent-bit更輕量級,占用資源更少,但是插件相對 Fluentd 來說不夠豐富,所以整體來說,Fluentd 更加成熟,使用更加廣泛,所以我們這里也同樣使用 Fluentd 來作為日志收集工具。
工作原理
Fluentd 通過一組給定的數據源抓取日志數據,處理后(轉換成結構化的數據格式)將它們轉發給其他服務,比如 Elasticsearch、對象存儲等等。Fluentd 支持超過300個日志存儲和分析服務,所以在這方面是非常靈活的。主要運行步驟如下:
首先 Fluentd 從多個日志源獲取數據
結構化并且標記這些數據
然后根據匹配的標簽將數據發送到多個目標服務去
日志源配置
比如我們這里為了收集 Kubernetes 節點上的所有容器日志,就需要做如下的日志源配置:
路由配置
上面是日志源的配置,接下來看看如何將日志數據發送到 Elasticsearch:
match:標識一個目標標簽,后面是一個匹配日志源的正則表達式,我們這里想要捕獲所有的日志并將它們發送給 Elasticsearch,所以需要配置成**。
id:目標的一個唯一標識符。
type:支持的輸出插件標識符,我們這里要輸出到 Elasticsearch,所以配置成 elasticsearch,這是 Fluentd 的一個內置插件。
log_level:指定要捕獲的日志級別,我們這里配置成info,表示任何該級別或者該級別以上(INFO、WARNING、ERROR)的日志都將被路由到 Elsasticsearch。
host/port:定義 Elasticsearch 的地址,也可以配置認證信息,我們的 Elasticsearch 不需要認證,所以這里直接指定 host 和 port 即可。
logstash_format:Elasticsearch 服務對日志數據構建反向索引進行搜索,將 logstash_format 設置為true,Fluentd 將會以 logstash 格式來轉發結構化的日志數據。
Buffer: Fluentd 允許在目標不可用時進行緩存,比如,如果網絡出現故障或者 Elasticsearch 不可用的時候。緩沖區配置也有助于降低磁盤的 IO。
4.安裝
要收集 Kubernetes 集群的日志,直接用 DasemonSet 控制器來部署 Fluentd 應用,這樣,它就可以從 Kubernetes 節點上采集日志,確保在集群中的每個節點上始終運行一個 Fluentd 容器。當然可以直接使用 Helm 來進行一鍵安裝,為了能夠了解更多實現細節,我們這里還是采用手動方法來進行安裝。
首先,我們通過 ConfigMap 對象來指定 Fluentd 配置文件,新建 fluentd-configmap.yaml 文件,文件內容如下:
上面配置文件中我們配置了 docker 容器日志目錄以及 docker、kubelet 應用的日志的收集,收集到數據經過處理后發送到 elasticsearch:9200 服務。
然后新建一個 fluentd-daemonset.yaml 的文件,文件內容如下:
我們將上面創建的 fluentd-config 這個 ConfigMap 對象通過 volumes 掛載到了 Fluentd 容器中,另外為了能夠靈活控制哪些節點的日志可以被收集,所以我們這里還添加了一個 nodSelector 屬性:
另外由于我們的集群使用的是 kubeadm 搭建的,默認情況下 master 節點有污點,所以要想也收集 master 節點的日志,則需要添加上容忍:
然后我們創建上面的configmap對象和daemonset服務
我們查看可以看到pod已經正常運行了。
然后我們進入kibana的頁面,點擊discover
在這里可以配置我們需要的 Elasticsearch 索引,前面 Fluentd 配置文件中我們采集的日志使用的是 logstash 格式,這里只需要在文本框中輸入logstash-*即可匹配到 Elasticsearch 集群中的所有日志數據,然后點擊下一步,進入以下頁面:
在該頁面中配置使用哪個字段按時間過濾日志數據,在下拉列表中,選擇@timestamp字段,然后點擊Create index pattern,創建完成后,點擊左側導航菜單中的Discover,然后就可以看到一些直方圖和最近采集到的日志數據了:
更多相關知識文章:
關于在Kubernetes中搭建Elasticsearch集群的教程就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。