在現代的微服務架構中,日志管理是一個至關重要的環節。隨著應用規模的擴大,日志數據的量也隨之增加,如何高效地收集、存儲和查詢這些日志數據成為了一個挑戰。EFK(Elasticsearch、Fluentd、Kibana)是一個流行的日志管理解決方案,能夠幫助開發者和運維人員更好地管理和分析日志數據。
本文將詳細介紹如何在 Kubernetes 1.6.2 集群中部署 EFK 插件,幫助您構建一個高效的日志管理系統。
EFK 插件由三個核心組件組成:
這三個組件協同工作,能夠實現日志的集中管理、實時查詢和可視化分析。
在開始部署 EFK 插件之前,您需要確保以下條件已經滿足:
kubectl
工具,并且能夠正常訪問 Kubernetes 集群。Elasticsearch 是 EFK 插件的核心組件,負責存儲和索引日志數據。在 Kubernetes 中,我們可以通過 StatefulSet 來部署 Elasticsearch,以確保其數據的持久化和高可用性。
首先,創建一個名為 elasticsearch.yaml
的配置文件,內容如下:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
labels:
app: elasticsearch
spec:
serviceName: elasticsearch
replicas: 3
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:6.8.0
ports:
- containerPort: 9200
name: http
- containerPort: 9300
name: transport
env:
- name: discovery.zen.minimum_master_nodes
value: "2"
- name: discovery.zen.ping.unicast.hosts
value: "elasticsearch-0.elasticsearch,elasticsearch-1.elasticsearch,elasticsearch-2.elasticsearch"
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data
volumes:
- name: data
persistentVolumeClaim:
claimName: elasticsearch-data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
接下來,創建一個名為 elasticsearch-service.yaml
的 Service 配置文件,內容如下:
apiVersion: v1
kind: Service
metadata:
name: elasticsearch
labels:
app: elasticsearch
spec:
ports:
- port: 9200
name: http
- port: 9300
name: transport
clusterIP: None
selector:
app: elasticsearch
使用 kubectl
命令部署 Elasticsearch:
kubectl apply -f elasticsearch.yaml
kubectl apply -f elasticsearch-service.yaml
等待一段時間后,使用以下命令驗證 Elasticsearch 是否成功部署:
kubectl get pods -l app=elasticsearch
如果看到三個 elasticsearch
Pod 處于 Running
狀態,說明 Elasticsearch 已經成功部署。
Fluentd 是 EFK 插件中的日志收集器,負責從 Kubernetes 集群中的各個節點收集日志,并將其發送到 Elasticsearch。
首先,創建一個名為 fluentd-config.yaml
的配置文件,內容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
labels:
app: fluentd
data:
fluent.conf: |
<source>
@type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
format json
time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ
</source>
<match kubernetes.**>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
logstash_prefix kubernetes
include_tag_key true
type_name _doc
buffer_chunk_limit 2M
buffer_queue_limit 32
flush_interval 5s
retry_limit 17
retry_wait 1.0
max_retry_wait 30
disable_retry_limit false
num_threads 1
</match>
接下來,創建一個名為 fluentd-daemonset.yaml
的 DaemonSet 配置文件,內容如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
labels:
app: fluentd
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1.11.5-debian-elasticsearch7-1.0
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
- name: FLUENT_ELASTICSEARCH_SCHEME
value: "http"
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: fluentd-config
mountPath: /fluentd/etc/fluent.conf
subPath: fluent.conf
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: fluentd-config
configMap:
name: fluentd-config
使用 kubectl
命令部署 Fluentd:
kubectl apply -f fluentd-config.yaml
kubectl apply -f fluentd-daemonset.yaml
等待一段時間后,使用以下命令驗證 Fluentd 是否成功部署:
kubectl get pods -l app=fluentd
如果看到每個節點上都有一個 fluentd
Pod 處于 Running
狀態,說明 Fluentd 已經成功部署。
Kibana 是 EFK 插件中的數據可視化工具,用于查詢和展示 Elasticsearch 中的日志數據。
首先,創建一個名為 kibana.yaml
的配置文件,內容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
labels:
app: kibana
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: docker.elastic.co/kibana/kibana:6.8.0
ports:
- containerPort: 5601
env:
- name: ELASTICSEARCH_URL
value: "http://elasticsearch:9200"
接下來,創建一個名為 kibana-service.yaml
的 Service 配置文件,內容如下:
apiVersion: v1
kind: Service
metadata:
name: kibana
labels:
app: kibana
spec:
ports:
- port: 5601
targetPort: 5601
selector:
app: kibana
type: LoadBalancer
使用 kubectl
命令部署 Kibana:
kubectl apply -f kibana.yaml
kubectl apply -f kibana-service.yaml
等待一段時間后,使用以下命令驗證 Kibana 是否成功部署:
kubectl get pods -l app=kibana
如果看到 kibana
Pod 處于 Running
狀態,說明 Kibana 已經成功部署。
在完成 Elasticsearch、Fluentd 和 Kibana 的部署后,您可以通過以下步驟驗證 EFK 插件的整體功能。
首先,獲取 Kibana 的訪問地址:
kubectl get svc kibana
在瀏覽器中訪問 Kibana 的地址,您應該能夠看到 Kibana 的登錄界面。
在 Kibana 中,點擊左側菜單中的 “Management”,然后選擇 “Index Patterns”。在 “Index pattern” 輸入框中輸入 kubernetes-*
,然后點擊 “Next step”。在 “Time Filter field name” 中選擇 @timestamp
,然后點擊 “Create index pattern”。
在 Kibana 中,點擊左側菜單中的 “Discover”,您應該能夠看到從 Kubernetes 集群中收集的日志數據。您可以使用 Kibana 的查詢功能來搜索和分析日志。
問題描述:Elasticsearch Pod 無法啟動,日志中顯示 discovery.zen.minimum_master_nodes
配置錯誤。
解決方案:確保 discovery.zen.minimum_master_nodes
的值設置為 (number_of_master_nodes / 2) + 1
。例如,如果您有 3 個 Elasticsearch 節點,則應設置為 2
。
問題描述:Fluentd Pod 日志中顯示無法連接到 Elasticsearch。
解決方案:檢查 Fluentd 的配置文件中 FLUENT_ELASTICSEARCH_HOST
和 FLUENT_ELASTICSEARCH_PORT
的值是否正確,并確保 Elasticsearch 服務已經成功部署。
問題描述:Kibana 無法訪問 Elasticsearch,日志中顯示連接錯誤。
解決方案:檢查 Kibana 的配置文件中 ELASTICSEARCH_URL
的值是否正確,并確保 Elasticsearch 服務已經成功部署。
通過本文的介紹,您已經學會了如何在 Kubernetes 1.6.2 集群中部署 EFK 插件。EFK 插件能夠幫助您高效地收集、存儲和查詢日志數據,為您的應用提供強大的日志管理能力。希望本文能夠幫助您順利部署 EFK 插件,并在實際應用中發揮其強大的功能。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。