歡迎光臨
每天分享高質量文章

K8S上的ELK和應用日誌上報實戰

本次實戰的基礎結構如下圖所示: 

一共有兩個Pod:ELK和web應用;

ELK的Pod會暴露兩個服務,一個暴露logstash的5044端口,給filebeat用,另一個暴露kibana的5601端口,給搜索日誌的用戶訪問的時候用;

web應用暴露一個服務,給用戶通過瀏覽器訪問;

實戰步驟簡介

部署ELK的pod和服務;

部署web應用的pod和服務;

web應用的pod從一個擴展為三個;

體驗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,如下:

[email protected]:/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這兩個服務,如下:

[email protected]:/usr/local/work/elkk8s# kubectl create -f elkhost-svc.yaml && kubectl create -f elkkibana-svc.yaml

service “elkhost” created

service “elkkibana” created

[email protected]:/usr/local/work/elkk8s# kubectl get service

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE

elkhost      ClusterIP   10.43.103.244           5044/TCP         9s

elkkibana    NodePort    10.43.219.137           5601:30001/TCP   9s

kubernetes   ClusterIP   10.43.0.1               443/TCP          16d

 

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

[email protected]:/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,如下:

[email protected]:/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,如下:

[email protected]:/usr/local/work/elkk8s# kubectl get service

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE

elkhost      ClusterIP   10.43.103.244           5044/TCP         6m

elkkibana    NodePort    10.43.219.137           5601:30001/TCP   6m

kubernetes   ClusterIP   10.43.0.1               443/TCP          16d

 

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

[email protected]:/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. 打開瀏覽器,輸入http://192.168.31.89:30002/hello/tom,即可訪問到web服務,如下圖: 

設置kibana

再次打開kibana頁面,如下圖所示,點擊紅框中的“Discover”,發現已經搜集到了上報的日誌,如綠框所示: 

如下圖設置: 

繼續設置,如下圖: 

再此點擊左上角的”Discover”,既可開始搜索web應用日誌,如下圖: 

web應用擴容

現在我們模擬生產環境的在線擴容: 

1. 將web應用從一個擴展到三個,執行以下命令:

kubectl scale deployment elkwebdemo --replicas=3

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

 

[email protected]:~# kubectl scale deployment elkwebdemo –replicas=3

deployment “elkwebdemo” scaled

[email protected]:~# 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是一樣的:

    赞(0)

    分享創造快樂