k8s系列之 ELK 日誌收集

一:痛點

在部署完成後 雖然我們能正常的運行我們的服務了 。 但是我們查看日誌卻是一個很麻煩的事情 , 我們只能去容器當中查看已經打印好的日誌 。這很明顯非常的不友好 , 而且容器中的日誌肯定要定時刪除的 。 不利於我們日後去查找對應的日誌

二:解決方案

目前很主流的是elk的解決方案 , 但是 l 卻有很多不同 這裏我使用的是 aliyun的 log-pilot

log-pilot 官方文檔 這上面有很詳細的解釋 以及 log-pilot 的優點

三 :部署

新建 vi external-es.yaml

apiVersion: v1
kind: Service
metadata:
  name: external-es
  namespace: ms
spec:
  ports:
  - port: 80
---
apiVersion: v1
kind: Endpoints
metadata:
  # 和 svc 相同的名稱
  name: external-es
  namespace: ms
subsets:
  - addresses:
    # es 端口
    - ip: 192.168.233.129
    # 還要指定端口號
    ports:
    - port: 9200

新建 log-pilot.yml  這裏有幾個地方 需要注意  

 1 : apiVersion: apps/v1  這裏和 官方文檔有不同 是應爲我的 kubenates 的版本是v1.16.0  這裏需要注意自己的版本號

 2 : apps/v1 對應的 selector 是必填選項 。 所以在這裏需要配置一個 selector 這兩個地方和官方文檔的不一樣

3 :  # 請確保集羣到ES網絡可達 - name: "ELASTICSEARCH_HOSTS"  value: "192.168.233.129:9200" 在這個位置我使用的是 我另一臺服務器上的 es 單機 。 所以我需要一個 service 進行轉發 再一次使用到了  endpoint

所以 新建 vi external-es.yaml 在去新建 log-pilot.yml 

4 : 如果es 不會部署的 請參考 es 單機版部署

 

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-pilot
  labels:
    app: log-pilot
  # 設置期望部署的namespace
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: log-pilot
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: log-pilot
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
    spec:
      # 是否允許部署到Master節點上
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: log-pilot
        # 版本請參考https://github.com/AliyunContainerService/log-pilot/releases
        image: registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.7-filebeat
        resources:
          limits:
            memory: 500Mi
          requests:
            cpu: 200m
            memory: 200Mi
        env:
          - name: "NODE_NAME"
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: "LOGGING_OUTPUT"
            value: "elasticsearch"
          # 請確保集羣到ES網絡可達
          - name: "ELASTICSEARCH_HOSTS"
            value: "192.168.233.129:9200"
          # 配置ES訪問權限
          #- name: "ELASTICSEARCH_USER"
          #  value: "{es_username}"
          #- name: "ELASTICSEARCH_PASSWORD"
          #  value: "{es_password}"
        volumeMounts:
        - name: sock
          mountPath: /var/run/docker.sock
        - name: root
          mountPath: /host
          readOnly: true
        - name: varlib
          mountPath: /var/lib/filebeat
        - name: varlog
          mountPath: /var/log/filebeat
        - name: localtime
          mountPath: /etc/localtime
          readOnly: true
        livenessProbe:
          failureThreshold: 3
          exec:
            command:
            - /pilot/healthz
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 2
        securityContext:
          capabilities:
            add:
            - SYS_ADMIN
      terminationGracePeriodSeconds: 30
      volumes:
      - name: sock
        hostPath:
          path: /var/run/docker.sock
      - name: root
        hostPath:
          path: /
      - name: varlib
        hostPath:
          path: /var/lib/filebeat
          type: DirectoryOrCreate
      - name: varlog
        hostPath:
          path: /var/log/filebeat
          type: DirectoryOrCreate
      - name: localtime
        hostPath:
          path: /etc/localtime

啓動

kubectl apply -f log-pilot.yml
daemonset.extensions "log-pilot" created
kubectl -n kube-system get pod -o wide | grep log-pilot
log-pilot-892d5                           1/1     Running   0          11h   10.100.3.40       k8s-node2    <none>           <none>
log-pilot-krmcg                           1/1     Running   0          11h   10.100.4.65       k8s-node1    <none>           <none>
log-pilot-r5lnf                           1/1     Running   0          11h   10.100.11.199     k8s-master   <none>           <none>
log-pilot-wqm6p                           1/1     Running   0          11h   10.100.12.7       k8s-node3    <none>           <none>

這個時候 log-pilot 就部署完成了

這個時候我們以 cloud-auth項目爲例 對auth的資源清單進行修改

vi cloud-auth.yaml

apiVersion: v1
kind: Service
metadata:
  name: cloud-auth
  namespace: ms
spec:
  ports:
    - name: cloud-auth
      port: 8020
  selector:
    project: ms
    app: cloud-auth
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cloud-auth
  namespace: ms
spec:
  replicas: 1
  selector:
    matchLabels:
      project: ms
      app: cloud-auth
  template:
    metadata:
      labels:
        project: ms
        app: cloud-auth
    spec:
      volumes:
        - name: cloud-auth-log
          emptyDir: {}
      containers:
        - name: cloud-auth
          image: registry.cn-hangzhou.aliyuncs.com/sdongp-dkz/cloud-auth:1.0-SNAPSHOT
          env:
            # 1、stdout爲約定關鍵字,表示採集標準輸出日誌
            # 2、配置標準輸出日誌採集到ES的catalina索引下
            - name: aliyun_logs_catalina
              value: "stdout"
            # 1、配置採集容器內文件日誌,支持通配符
            # 2、配置該日誌採集到ES的access索引下
            - name: aliyun_logs_access
              value: "/home/cloud/cloud-auth/*.log"
          # 容器內文件日誌路徑需要配置emptyDir
          volumeMounts:
            - name: cloud-auth-log
              mountPath: /home/cloud/cloud-auth
          ports:
            - name: http
              containerPort: 8010

字段解釋

stdout :這是容器對日誌的一種輸出格式 不需要太去在意 , 有興趣的可以去搜索一下

aliyun_logs_catalina : 這是新建一個 catalina  的索引 待會部署完成後 去查看 es 就能看到

aliyun_logs_access :  這是新建一個 access的索引 待會部署完成後 去查看 es 就能看到

/home/cloud/cloud-auth/*.log : 因爲我在springboot 的項目中配置的日誌路徑 。實際上我們可以進入容器查看 。這裏的意思是拉取cloud-auth 文件夾下所有的 .log 的文件

# 進入容器
kubectl exec -ti cloud-auth-848c4ccdf7-kn4qz -n ms -- /bin/sh
# 查看
vi /home/cloud/cloud-auth/cloud-auth.log

通過這樣的部署我們的 E 和 L 部分就以及部署好了  使用 elasticHD 查看索引 這個時候已經有兩個索引了 。這就是 log-pilot 幫我們拉取是日誌索引   ElasticHD github 地址

 

接下來使用 kibana 去正式查看日誌 

kibana 下載地址  切記kibana一定要和 es 的版本一致   不然會啓動失敗

kibana windows 安裝教程 因爲去linux 安裝麻煩直接使用windows 版本了

kibana使用

 

新建  access-*  和 catalina-*   access-*是從你自己的項目打印的日誌的索引  catalina-*  是容器日誌的索引

 選擇對應的索引 查看日誌

這個時候使用 postman 訪問

 

這是在容器中 打印的日誌

 這是在 kibana中通過es 看到的日誌

 這個時候除了時間對應不上 其他的都是ok的這裏貌似pod的時間有一些問題 

這樣es 就能夠進行日誌收集了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章