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 就能够进行日志收集了

 

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