1. 程式人生 > >Docker下ELK三部曲之三:K8S上的ELK和應用日誌上報

Docker下ELK三部曲之三:K8S上的ELK和應用日誌上報

本章是《Docker下ELK三部曲》系列的終篇,前面章節已經詳述了ELK環境的搭建以及如何製作自動上報日誌的應用映象,今天我們把ELK和web應用釋出到K8S環境下,模擬多個後臺server同時上報日誌的場景;

前文連結

關於K8S

基礎結構

本次實戰的基礎結構如下圖所示:
這裡寫圖片描述

  1. 一共有兩個Pod:ELK和web應用;
  2. ELK的Pod會暴露兩個服務,一個暴露logstash的5044埠,給filebeat用,另一個暴露kibana的5601埠,給搜尋日誌的使用者訪問的時候用;
  3. web應用暴露一個服務,給使用者通過瀏覽器訪問;

實戰步驟簡介

  1. 部署ELK的pod和服務;
  2. 部署web應用的pod和服務;
  3. web應用的pod從一個擴充套件為三個;
  4. 體驗ELK;

部署ELK

我們從ELK Sever開始部署吧:
1. ssh登入到可以執行kubectl命令的機器上去;
2. 建立elk的部署指令碼elkhost.yaml,內容如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: elkhost
spec:
  replicas: 1
  template:
    metadata:
     labels:
       name: elkhost
    spec:
     containers:
     - name: elkhost
       image: sebp/elk:622
tty: true ports: [{ "containerPort": 5601 },{ "containerPort": 5044 }]

如上所示,暴露了兩個埠:kibana的5601和logstash的5044;

3. 在elkhost.yaml所在目錄執行命令kubectl create -f elkhost.yaml,即可建立elk對應的pod,如下:

root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl get pods
NAME
READY STATUS RESTARTS AGE elkhost-54c9bbd8d5-ffq68 1/1 Running 0 3m


4. 將kibana的5601埠以NodePort的方式對外暴露,這樣外部就可以通過節點IP地址來訪問kibana服務了,建立部署指令碼elkkibana-svc.yaml,kibana的服務通過node節點的30001埠對外暴露,內容如下:

apiVersion: v1
kind: Service
metadata:
  name: elkkibana
spec:
  type: NodePort
  ports:
       - port: 5601
         nodePort: 30001
  selector:
    name: elkhost


5. 將logstash的5044埠以ClusterIP的方式對外暴露,這樣其他pod的filebeat就可以通過服務名加5044埠來訪問logstash服務了,建立部署指令碼elkhost-svc.yaml,logstash的服務通過5044埠對K8S內部的pod暴露,內容如下:

apiVersion: v1
kind: Service
metadata:
  name: elkhost
spec:
  type: ClusterIP
  ports:
       - port: 5044
         targetPort: 5044
  selector:
    name: elkhost


6. 在elkhost-svc.yaml所在目錄執行命令kubectl create -f elkhost-svc.yaml && kubectl create -f elkkibana-svc.yaml,即可建立elkhost和elkkibana這兩個服務,如下:

root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl create -f elkhost-svc.yaml && kubectl create -f elkkibana-svc.yaml
service "elkhost" created
service "elkkibana" created
root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
elkhost      ClusterIP   10.43.103.244   <none>        5044/TCP         9s
elkkibana    NodePort    10.43.219.137   <none>        5601:30001/TCP   9s
kubernetes   ClusterIP   10.43.0.1       <none>        443/TCP          16d


7. 執行命令檢視elkhost的pod部署在K8S的哪個node節點上:

[email protected]3267:/usr/local/work/elkk8s# kubectl describe pod elk
Name:           elkhost-54c9bbd8d5-ffq68
Namespace:      default
Node:           willzhao-vostro-3267/192.168.31.89
Start Time:     Mon, 30 Apr 2018 16:22:04 +0800
Labels:         name=elkhost
                pod-template-hash=1075668481
Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"default","name":"elkhost-54c9bbd8d5","uid":"9096cde8-4c4f-11e8-a776-024f8a041a1a"...
Status:         Running
...

如上所示,Node: willzhao-vostro-3267/192.168.31.89顯示了這個pod部署的節點IP是192.168.31.89;

8. 開啟瀏覽器,輸入192.168.31.89:30001,即可訪問到Kibana服務,如下圖:
這裡寫圖片描述

部署應用

ELK Sever已經OK,接下來部署web應用:
1. 建立elkwebdemo的部署指令碼elkwebdemo.yaml,內容如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: elkwebdemo
spec:
  replicas: 1
  template:
    metadata:
     labels:
       name: elkwebdemo
    spec:
     containers:
     - name: elkwebdemo
       image: bolingcavalry/elkdemo:0.0.1-SNAPSHOT
       tty: true
       ports:
       - containerPort: 8080


2. 在elkwebdemo.yaml所在目錄執行命令kubectl create -f elkwebdemo.yaml,即可建立elk對應的pod,如下:

root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl get pod
NAME                         READY     STATUS    RESTARTS   AGE
elkhost-944bcbcd4-8vpbs      1/1       Running   0          4m
elkwebdemo-dddbcfc6f-x4pk6   1/1       Running   0          9s


3. 建立elk對外服務的部署指令碼elkwebdemo-svc.yaml,web的服務通過node節點的30002埠對外暴露,內容如下:

apiVersion: v1
kind: Service
metadata:
  name: elkwebdemo
spec:
  type: NodePort
  ports:
       - port: 8080
         nodePort: 30002 
  selector:
    name: elkwebdemo


5. 在elkwebdemo-svc.yaml所在目錄執行命令kubectl create -f elkwebdemo-svc.yaml,即可建立elkwebdemo對應的pod,如下:

root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
elkhost      ClusterIP   10.43.103.244   <none>        5044/TCP         6m
elkkibana    NodePort    10.43.219.137   <none>        5601:30001/TCP   6m
kubernetes   ClusterIP   10.43.0.1       <none>        443/TCP          16d


6. 執行命令檢視elkwebdemo的pod部署在K8S的哪個node節點上:

root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl describe pod elkwebdemo
Name:           elkwebdemo-dddbcfc6f-8bbrb
Namespace:      default
Node:           willzhao-vostro-3267/192.168.31.89
Start Time:     Mon, 30 Apr 2018 16:28:37 +0800
Labels:         name=elkwebdemo
                pod-template-hash=888679729
Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"default","name":"elkwebdemo-dddbcfc6f","uid":"7a9364d1-4c50-11e8-a776-024f8a041a1...
Status:         Running
...

如上所示,Node: willzhao-vostro-3267/192.168.31.89顯示了這個pod部署的節點IP是192.168.31.89;

7. 開啟瀏覽器,輸入,即可訪問到web服務,如下圖:
這裡寫圖片描述

設定kibana

  1. 再次開啟kibana頁面,如下圖所示,點選紅框中的“Discover”,發現已經蒐集到了上報的日誌,如綠框所示:
    這裡寫圖片描述

  2. 如下圖設定:
    這裡寫圖片描述

  3. 繼續設定,如下圖:
    這裡寫圖片描述

  4. 再此點選左上角的”Discover”,既可開始搜尋web應用日誌,如下圖:
    這裡寫圖片描述

web應用擴容

現在我們模擬生產環境的線上擴容:
1. 將web應用從一個擴充套件到三個,執行以下命令:

kubectl scale deployment elkwebdemo --replicas=3


2. 可以看到web應用對應的pod已經擴充套件了,如下所示:

root@willzhao-Vostro-3267:~# kubectl scale deployment elkwebdemo --replicas=3
deployment "elkwebdemo" scaled
root@willzhao-Vostro-3267:~# kubectl get pod
NAME                         READY     STATUS    RESTARTS   AGE
elkhost-944bcbcd4-8vpbs      1/1       Running   0          1h
elkwebdemo-dddbcfc6f-crzcp   1/1       Running   0          11s
elkwebdemo-dddbcfc6f-tsppk   1/1       Running   0          11s
elkwebdemo-dddbcfc6f-x4pk6   1/1       Running   0          1h


3. 為了能多上報一些日誌,在瀏覽器上多重新整理幾次這個地址:http://192.168.31.89:30002/hello/tom
4. 回到kibana頁面,如下圖,點選紅框中的“host”,展開的資訊顯示,這些日誌來自三個host:
這裡寫圖片描述
5. 開啟K8S的dashboard頁面看一下容器資訊,如下圖,可以見到三個web容器的hostname和kibana中的host是一樣的:
這裡寫圖片描述

6. 在K8S上體驗ELK的日誌服務已經完成;

至此,《Docker下ELK三部曲》三部曲就全部完成了,希望您在實踐容器化的ELK服務時,該系列文章能夠對您有所幫助。

相關推薦

DockerELK三部曲K8SELK應用日誌上報

本章是《Docker下ELK三部曲》系列的終篇,前面章節已經詳述了ELK環境的搭建以及如何製作自動上報日誌的應用映象,今天我們把ELK和web應用釋出到K8S環境下,模擬多個後臺server同時上報日誌的場景; 前文連結 關於K8S 基礎結

DockerMySQL主從三部曲binlog日誌引數實戰

本章是《Docker下MySQL主從三部曲》的終篇,前面的章節我們能夠製作映象來搭建主從同步環境,本章我們來觀察binlog引數MASTER_LOG_POS;關於從庫同步的設定在設定從庫同步的時候一般會使用以下SQL:CHANGE MASTER TO MASTER_HOST=

maven構建docker映象三部曲推送到遠端倉庫(內網阿里雲)

在上一章《maven構建docker映象三部曲之二:編碼和構建映象》的實戰中,我們將spring boot的web工程構建成docker映象並在本地啟動容器成功,今天我們把docker-maven-plugin外掛的推送功能也用上,這樣編譯、構建、推送都能一

Kubernetesweb服務的效能測試三部曲橫向擴容

本章是《Kubernetes下web服務的效能測試三部曲》系列的終篇,之前我們用AB和JMeter兩種工具壓測了k8s環境下的Tomcat,並通過調整記憶體和CPU來驗證縱向擴容的效果,本章我們來驗證橫向擴容對吞吐量的影響; 本文地址:http://blog.

Docker搭建disconf環境,三部曲細說搭建過程

Docker下的disconf實戰全文連結 《Docker搭建disconf環境,三部曲之一:極速搭建disconf》; 《Docker搭建disconf環境,三部曲之二:本地快速構建disconf映象》; 《Docker搭建disconf環境,三部曲之三:細說搭建過程》; 《Docker下使用discon

自定義spring boot starter三部曲原始碼分析spring.factories載入過程

本文是《自定義spring boot starter三部曲》系列的終篇,前文中我們開發了一個starter並做了驗證,發現關鍵點在於spring.factories的自動載入能力,讓應用只要依賴starter的jar包即可,今天我們來分析Spring和Spring boot原始碼,瞭解s

DockerRabbitMQ四部曲細說RabbitMQ映象製作

本章是《Docker下RabbitMQ四部曲》系列的第二篇,將詳細簡述Docker下製作RabbitMQ映象的技術細節,包括以下內容: 1. 列舉製作RabbitMQ映象時用到的所有材料; 2. 編寫Dockerfile; 3. 編寫容器啟動時執行的指令碼

elasticsearch實戰三部曲搜尋操作

本文是《elasticsearch實戰三部曲》的終篇,作為elasticsearch的核心功能,搜尋的重要性不言而喻,今天的實戰都會圍繞搜尋展開; 系列文章連結 《elasticsearch實戰三部曲之一:索引操作》; 《elasticsearch實戰三部曲之二:文

spring4.1.8初始化原始碼學習三部曲AbstractApplicationContext.refresh方法

本章是《spring4.1.8初始化原始碼學習三部曲》系列的終篇,重點是學習AbstractApplicationContext類的refresh()方法; 我們先回顧ClassPathXmlApplicationContext類的初始化過程如下程式碼:

CDH5部署三部曲問題總結

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ###

Flink on Yarn三部曲提交Flink任務

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; 本文是

CDH+Kylin三部曲Kylin官方demo

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; 本文是《

CoProcessFunction實戰三部曲定時器側輸出

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ###

libevent學習簡單的伺服器客戶端

1.伺服器#include <stdio.h> #include <time.h> #include <event2/bufferevent.h> #include <event2/buffer.h> #include <

虛擬機器安裝XP系統圖解安裝VM Tools共享資料夾

     上一篇演示了新建虛擬機器和xp系統的安裝,本篇將是這個系列的結尾階段:安裝VM Tools 和共享資料夾。      安裝VM Tools能夠使的虛擬機器和實體機之間能夠自由拖動檔案,最重要

K8SELK應用日誌上報實戰

com 其他 aml ssh ide 1.8 再次 svc 瀏覽器 來源:DevOps ID:Idevops168 本次實戰的基礎結構如下圖所示: 一共有兩個Pod:ELK和web應用; ELK的Pod會暴露兩個服務,一個暴露logstash的50

Docker學習Docker在linux簡單安裝使用

Docker學習之三:Docker在linux下簡單安裝使用 講解的Docker安裝是基於CentOS7系統下進行的,因為Docker只支援CentOS6.5以後的版本。 前置要求:         系統要求,核心版本至少是3.1.0版本。 &

DockerJava檔案傳服務三部曲服務端開發

本章是《Docker下Java檔案上傳服務三部曲》的第二篇,上一章《Docker下Java檔案上傳服務三部曲之一:準備環境》我們把客戶端準備好了,Tomcat容器也部署好了,今天就來開發和部署檔案服務的後臺應用吧; 本章實戰內容概要 本章要建立三個w

[團隊協作發 + 自動化部署 Git + Gitlab + Jenkins + K8S + Docker]Git進階編

文件地址:https://download.csdn.net/download/panpan2018/10329739下期更新至:[團隊協作發 + 自動化部署 Git + Gitlab + Jenkins + K8S + Docker]之四:Git高階編

Docker的Spring Cloud三部曲細說Spring Cloud開發

本文是《Docker下的Spring Cloud三部曲》系列的第二篇,詳細講解上一篇例項中用到的eureka、provider、consumer等三個應用的開發過程; 環境資訊 回顧一下實戰環境,如下圖: 原始碼地址 上圖的eureka、