項目背景: 此項目使用elk來展示分析k8s集群產生的日志。k8s集群是apache網站,將apache產生的日記信息通過filebeat傳遞給logstash -> elasticsearch -> kibana, 然后頁面展示及分析。此項目將apache制作的網站以及elasticsearch集群和kibana發布至公網。
項目最終實現的架構圖:

主機准備及配置:

Phase 1, 部署Harbor私有倉庫
為了簡潔,單獨一個隨筆:部署Harbor私有倉庫 - 小白白bai - 博客園 (cnblogs.com)
Phase 2, K8S集群環境部署
K8S集群環境部署 - 小白白bai - 博客園 (cnblogs.com)
Phase 3, Elasticsearch集群環境部署並發布
Elasticsearch集群環境部署並發布 - 小白白bai - 博客園 (cnblogs.com)
Phase 4, Kibana服務部署
Kibana是一款開源的數據分析和可視化平台,它是Elastic Stack成員之一。可以使用Kibana對Elasticsearch索引中的數據進行搜索、查看、交互操作。可利用圖表、表格等對數據進行多元化的分析和顯現。
1,安裝kibana軟件包
[root@kibana ~]# yum -y install kibana
2,更改kibana服務配置文件
[root@kibana ~]# vim /etc/kibana/kibana.yml
server.port: 5601 #2行,提供服務的端口。
server.host: "192.168.1.74" #7行,服務器監聽地址。
elasticsearch.hosts: ["http://192.168.1.71:9200"] #28行,用於查詢es實例主機地址,集群里面任選一個
即可。
3,啟動服務器並查看端口是否啟用
[root@knbana ~]# systemctl enable --now kibana
[root@kibana ~]# netstat -antpu | grep 5601
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 8840/node
4,將kibana服務器的5601端口發布出來;訪問kibana界面:http://公網IP:5601

Phase 5, 制作Apache和filebeat鏡像,並上傳至Harbor倉庫
制作Apache和filebeat鏡像,並上傳至Harbor倉庫 - 小白白bai - 博客園 (cnblogs.com)
Phase 6, 編寫apachelog.yaml資源清單文件 (一個pod包括兩個容器,並使用持久化存儲,hostpath)
從私有倉庫harbor中pull鏡像的時候,k8s集群使用類型為docker-registry的Secret進行認證。 現在創建一個Secret,名稱為regcred: master主機認證,登錄harbor [root@master ~]# kubectl create secret docker-registry regcred --docker-server=192.168.1.100:80 --docker-username=admin --docker-password=Harbor12345 查看regcred的詳細信息,其中.dockerconfigjson的值包含了登錄harbor的用戶名和密碼等信息 [root@master ~]# kubectl get secret regcred --output=yaml 通過以下命令進行查看: [root@master ~]# kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 -d
1,編寫apachelog.yaml資源清單文件
[root@master ~]# vim apachelog.yaml --- kind: Deployment apiVersion: apps/v1 metadata: name: weblog spec: selector: matchLabels: myapp: weblog replicas: 1 template: metadata: labels: myapp: weblog spec: volumes: #- name: empty-data # emptyDir: {} - name: log-data hostPath: path: /var/weblog type: DirectoryOrCreate containers: - name: apache image: 192.168.1.100:80/library/myos:httpd volumeMounts: #- name: empty-data # mountPath: /var/cache - name: log-data mountPath: /var/log/httpd ports: - protocol: TCP containerPort: 80 - name: filebeat-backend image: 192.168.1.100:80/library/myos:filebeat volumeMounts: - name: log-data mountPath: /var/weblog restartPolicy: Always imagePullSecrets: - name: regcred
2,創建資源
[root@master ~]# kubectl apply -f apachelog.yaml
3,查看在哪台機器上面啟動,就去哪台機器上面看日志
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
weblog-688dd9768c-vwkbs 1/1 Running 0 4m24s 10.244.3.4 node-0002 <none> <none>
[root@node-0002 ~]# ls /var/weblog/
access_log error_log
[root@node-0002 ~]# cat /var/weblog/access_log
Phase 7, 安裝部署logstash服務1.75並配置logstash配置文件
1,裝包
[root@logstash ~]# yum -y install logstash
2,配置logstash
[root@logstash ~]# vim /etc/logstash/logstash.conf
input{
stdin{ codec => "json" }
beats{
port => 5044
}
}
filter{
if [type] == "apache_log" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
}
output{
stdout{ codec => "rubydebug" }
if [type] == "apache_log" {
elasticsearch {
index => "apache"
hosts => ["es-0001:9200","es-0002:9200","es-0003:9200"]
}
}
}
3,啟服務
[root@logstash ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/logstash.conf
Phase 8, 驗證
