我們先創(chuàng)建elasticsearch-storageclass.yaml
然后我們創(chuàng)建pvc來(lái)對(duì)應(yīng)這個(gè)storageclass
elasticsearch-pvc.yaml
最后我們創(chuàng)建這個(gè)statefulset
elasticsearch-statefulset.yaml
然后我們使用kubectl創(chuàng)建
kubectl apply -f elasticsearch-storageclass.yaml
kubectl apply -f elasticsearch-pvc.yaml
kubectl apply -f elasticsearch-statefulset.yaml
然后我們查看pod的運(yùn)行情況
Pods 部署完成后,我們可以通過(guò)請(qǐng)求一個(gè) REST API 來(lái)檢查 Elasticsearch 集群是否正常運(yùn)行。使用下面的命令將本地端口9200轉(zhuǎn)發(fā)到 Elasticsearch 節(jié)點(diǎn)(如es-cluster-0)對(duì)應(yīng)的端口:
然后我們開另一個(gè)窗口
正常來(lái)說(shuō),應(yīng)該會(huì)有這樣的信息。
看到上面的信息就表明我們名為 k8s-logs 的 Elasticsearch 集群成功創(chuàng)建了3個(gè)節(jié)點(diǎn):es-cluster-0,es-cluster-1,和es-cluster-2,當(dāng)前主節(jié)點(diǎn)是 es-cluster-0。
2.創(chuàng)建 Kibana 服務(wù)
Elasticsearch 集群?jiǎn)?dòng)成功了,接下來(lái)我們可以來(lái)部署 Kibana 服務(wù),新建一個(gè)名為 kibana.yaml 的文件,對(duì)應(yīng)的文件內(nèi)容如下:
上面我們定義了兩個(gè)資源對(duì)象,一個(gè) Service 和 Deployment,為了測(cè)試方便,我們將 Service 設(shè)置為了 NodePort 類型,Kibana Pod 中配置都比較簡(jiǎn)單,唯一需要注意的是我們使用 ELASTICSEARCH_URL 這個(gè)環(huán)境變量來(lái)設(shè)置Elasticsearch 集群的端點(diǎn)和端口,直接使用 Kubernetes DNS 即可,此端點(diǎn)對(duì)應(yīng)服務(wù)名稱為 elasticsearch,由于是一個(gè) headless service,所以該域?qū)⒔馕鰹?個(gè) Elasticsearch Pod 的 IP 地址列表。
然后我們創(chuàng)建這個(gè)服務(wù)
kubectl apply -f kibana.yaml
過(guò)了一會(huì),我們的kibana的服務(wù)就起來(lái)了。
如果 Pod 已經(jīng)是 Running 狀態(tài)了,證明應(yīng)用已經(jīng)部署成功了,然后可以通過(guò) NodePort 來(lái)訪問 Kibana 這個(gè)服務(wù),在瀏覽器中打開http://<任意節(jié)點(diǎn)IP>:30245即可,如果看到如下歡迎界面證明 Kibana 已經(jīng)成功部署到了 Kubernetes集群之中。
3.部署 Fluentd
Fluentd 是一個(gè)高效的日志聚合器,是用 Ruby 編寫的,并且可以很好地?cái)U(kuò)展。對(duì)于大部分企業(yè)來(lái)說(shuō),F(xiàn)luentd 足夠高效并且消耗的資源相對(duì)較少,另外一個(gè)工具Fluent-bit更輕量級(jí),占用資源更少,但是插件相對(duì) Fluentd 來(lái)說(shuō)不夠豐富,所以整體來(lái)說(shuō),F(xiàn)luentd 更加成熟,使用更加廣泛,所以我們這里也同樣使用 Fluentd 來(lái)作為日志收集工具。
工作原理
Fluentd 通過(guò)一組給定的數(shù)據(jù)源抓取日志數(shù)據(jù),處理后(轉(zhuǎn)換成結(jié)構(gòu)化的數(shù)據(jù)格式)將它們轉(zhuǎn)發(fā)給其他服務(wù),比如 Elasticsearch、對(duì)象存儲(chǔ)等等。Fluentd 支持超過(guò)300個(gè)日志存儲(chǔ)和分析服務(wù),所以在這方面是非常靈活的。主要運(yùn)行步驟如下:
首先 Fluentd 從多個(gè)日志源獲取數(shù)據(jù)
結(jié)構(gòu)化并且標(biāo)記這些數(shù)據(jù)
然后根據(jù)匹配的標(biāo)簽將數(shù)據(jù)發(fā)送到多個(gè)目標(biāo)服務(wù)去
日志源配置
比如我們這里為了收集 Kubernetes 節(jié)點(diǎn)上的所有容器日志,就需要做如下的日志源配置:
路由配置
上面是日志源的配置,接下來(lái)看看如何將日志數(shù)據(jù)發(fā)送到 Elasticsearch:
match:標(biāo)識(shí)一個(gè)目標(biāo)標(biāo)簽,后面是一個(gè)匹配日志源的正則表達(dá)式,我們這里想要捕獲所有的日志并將它們發(fā)送給 Elasticsearch,所以需要配置成**。
id:目標(biāo)的一個(gè)唯一標(biāo)識(shí)符。
type:支持的輸出插件標(biāo)識(shí)符,我們這里要輸出到 Elasticsearch,所以配置成 elasticsearch,這是 Fluentd 的一個(gè)內(nèi)置插件。
log_level:指定要捕獲的日志級(jí)別,我們這里配置成info,表示任何該級(jí)別或者該級(jí)別以上(INFO、WARNING、ERROR)的日志都將被路由到 Elsasticsearch。
host/port:定義 Elasticsearch 的地址,也可以配置認(rèn)證信息,我們的 Elasticsearch 不需要認(rèn)證,所以這里直接指定 host 和 port 即可。
logstash_format:Elasticsearch 服務(wù)對(duì)日志數(shù)據(jù)構(gòu)建反向索引進(jìn)行搜索,將 logstash_format 設(shè)置為true,F(xiàn)luentd 將會(huì)以 logstash 格式來(lái)轉(zhuǎn)發(fā)結(jié)構(gòu)化的日志數(shù)據(jù)。
Buffer: Fluentd 允許在目標(biāo)不可用時(shí)進(jìn)行緩存,比如,如果網(wǎng)絡(luò)出現(xiàn)故障或者 Elasticsearch 不可用的時(shí)候。緩沖區(qū)配置也有助于降低磁盤的 IO。
4.安裝
要收集 Kubernetes 集群的日志,直接用 DasemonSet 控制器來(lái)部署 Fluentd 應(yīng)用,這樣,它就可以從 Kubernetes 節(jié)點(diǎn)上采集日志,確保在集群中的每個(gè)節(jié)點(diǎn)上始終運(yùn)行一個(gè) Fluentd 容器。當(dāng)然可以直接使用 Helm 來(lái)進(jìn)行一鍵安裝,為了能夠了解更多實(shí)現(xiàn)細(xì)節(jié),我們這里還是采用手動(dòng)方法來(lái)進(jìn)行安裝。
首先,我們通過(guò) ConfigMap 對(duì)象來(lái)指定 Fluentd 配置文件,新建 fluentd-configmap.yaml 文件,文件內(nèi)容如下:
上面配置文件中我們配置了 docker 容器日志目錄以及 docker、kubelet 應(yīng)用的日志的收集,收集到數(shù)據(jù)經(jīng)過(guò)處理后發(fā)送到 elasticsearch:9200 服務(wù)。
然后新建一個(gè) fluentd-daemonset.yaml 的文件,文件內(nèi)容如下:
我們將上面創(chuàng)建的 fluentd-config 這個(gè) ConfigMap 對(duì)象通過(guò) volumes 掛載到了 Fluentd 容器中,另外為了能夠靈活控制哪些節(jié)點(diǎn)的日志可以被收集,所以我們這里還添加了一個(gè) nodSelector 屬性:
另外由于我們的集群使用的是 kubeadm 搭建的,默認(rèn)情況下 master 節(jié)點(diǎn)有污點(diǎn),所以要想也收集 master 節(jié)點(diǎn)的日志,則需要添加上容忍:
然后我們創(chuàng)建上面的configmap對(duì)象和daemonset服務(wù)
我們查看可以看到pod已經(jīng)正常運(yùn)行了。
然后我們進(jìn)入kibana的頁(yè)面,點(diǎn)擊discover
在這里可以配置我們需要的 Elasticsearch 索引,前面 Fluentd 配置文件中我們采集的日志使用的是 logstash 格式,這里只需要在文本框中輸入logstash-*即可匹配到 Elasticsearch 集群中的所有日志數(shù)據(jù),然后點(diǎn)擊下一步,進(jìn)入以下頁(yè)面:
在該頁(yè)面中配置使用哪個(gè)字段按時(shí)間過(guò)濾日志數(shù)據(jù),在下拉列表中,選擇@timestamp字段,然后點(diǎn)擊Create index pattern,創(chuàng)建完成后,點(diǎn)擊左側(cè)導(dǎo)航菜單中的Discover,然后就可以看到一些直方圖和最近采集到的日志數(shù)據(jù)了:
更多關(guān)于云服務(wù)器,域名注冊(cè),虛擬主機(jī)的問題,請(qǐng)?jiān)L問三五互聯(lián)官網(wǎng):m.shinetop.cn