容器云平台No.9~kubernetes日志收集系统EFK
EFK介绍
EFK,全称Elasticsearch Fluentd Kibana ,是kubernetes中比较常用的日志收集方案,也是官方比较推荐的方案。
通过EFK,可以把集群的所有日志收集到Elasticsearch中,然后可以对日志做分析。一般用于故障排查,数据分析等。。。
数据流示意图

官方项目
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch
小技巧,如果只希望下载github项目的某一个目录,可以使用svn,这里就只下载fluentd-elasticsearch目录,
例如需要下载的子目录为:
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch
将/tree/master/换成trunk,然后使用svn下载即可
svn co https://github.com/kubernetes/kubernetes/trunk/cluster/addons/fluentd-elasticsearch
这里因为是学习,一步步安装,感兴趣的可以看官方项目
部署Elasticsearch
存储服务是基础,需要先部署,其他两个服务运行的时候需要连接es。
1、编写efk-es-statefulset.yaml
---
apiVersion: v1
kind: Namespace
metadata:
  name: efk
---
kind: Service
apiVersion: v1
metadata:
  name: elasticsearch-logging
  namespace: efk
  labels:
    app: elasticsearch-logging
spec:
  selector:
    app: elasticsearch-logging
  clusterIP: None
  ports:
    - port: 9200
      name: rest
    - port: 9300
      name: inter
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch-logging
  namespace: efk
spec:
  serviceName: elasticsearch-logging
  replicas: 3
  selector:
    matchLabels:
      app: elasticsearch-logging
  template:
    metadata:
      labels:
        app: elasticsearch-logging
    spec:
      initContainers:
      - name: increase-vm-max-map
        image: busybox
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      - name: increase-fd-ulimit
        image: busybox
        command: ["sh", "-c", "ulimit -n 65536"]
        securityContext:
          privileged: true
      containers:
      - name: elasticsearch-logging
        image: docker.elastic.co/elasticsearch/elasticsearch:7.9.1
        ports:
        - name: rest
          containerPort: 9200
        - name: inter
          containerPort: 9300
        resources:
          limits:
            cpu: 1000m
          requests:
            cpu: 1000m
        volumeMounts:
        - name: elasticsearch-logging
          mountPath: /usr/share/elasticsearch/data
        env:
        - name: cluster.name
          value: k8s-logs
        - name: node.name
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: cluster.initial_master_nodes
          value: "elasticsearch-logging-0,elasticsearch-logging-1,elasticsearch-logging-2"
        - name: discovery.zen.minimum_master_nodes
          value: "2"
        - name: discovery.seed_hosts
          value: "elasticsearch-logging"
        - name: ES_JAVA_OPTS
          value: "-Xms512m -Xmx512m"
        - name: network.host
          value: "0.0.0.0"
      volumes:
      - name: elasticsearch-logging
        emptyDir: {}
2、执行部署命令
这里需要注意,如果长时间下载不下来镜像,可以自行先将镜像下载,要不然可能会一直不成功
本文把服务都部署到命名空间:efk
[root@k8s-master001 EFK]# kubectl  apply -f efk-es-statefulset.yaml
[root@k8s-node001 EFK]# kubectl  get po -n efk
NAME                      READY   STATUS    RESTARTS   AGE
elasticsearch-logging-0   1/1     Running   0          10m
elasticsearch-logging-1   1/1     Running   0          10m
elasticsearch-logging-2   1/1     Running   0          9m42s
3、验证es是否正常运行
sh-4.2# curl http://localhost:9200/_cluster/state?pretty
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0{
  "cluster_name" : "k8s-logs",
  "cluster_uuid" : "OLzzi6sbSZG11bqBFM9z5Q",
  "version" : 38,
  "state_uuid" : "uFa1_QKgRAK_NJ33SArGDw",
  "master_node" : "XiShXS0DSGmx0Dxp1r9vEw",
  "blocks" : { },
  "nodes" : {
    "XN-vHccLRkaEgr9Q1cctNA" : {
      "name" : "elasticsearch-logging-2",
      "ephemeral_id" : "WBEY2tGNRzmc3cBDJAEP9Q",
      "transport_address" : "100.108.163.2:9300",
      "attributes" : {
        "ml.machine_memory" : "16630661120",
        "ml.max_open_jobs" : "20",
        "xpack.installed" : "true",
        "transform.node" : "true"
      }
    },
.................
以上, elasticsearch就部署好了,接下来部署kibana
部署kibana
1、编写efk-kibana.yaml
apiVersion: v1
kind: Service
metadata:
  name: kibana-logging
  namespace: efk
  labels:
    app: kibana-logging
spec:
  ports:
  - port: 5601
  type: NodePort
  selector:
    app: kibana-logging
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana-logging
  namespace: efk
  labels:
    app: kibana-logging
spec:
  selector:
    matchLabels:
      app: kibana-logging
  template:
    metadata:
      labels:
        app: kibana-logging
    spec:
      containers:
      - name: kibana-logging
        image: docker.elastic.co/kibana/kibana:7.9.1
        resources:
          limits:
            cpu: 1000m
          requests:
            cpu: 1000m
        env:
        - name: ELASTICSEARCH_HOSTS
          value: http://elasticsearch-logging:9200
        ports:
        - containerPort: 5601
2、执行部署命令
[root@k8s-node001 EFK]# kubectl  apply -f efk-kibana.yaml
service/kibana-logging created
deployment.apps/kibana-logging created
[root@k8s-node001 EFK]# kubectl  get po,svc -n efk
NAME                              READY   STATUS    RESTARTS   AGE
kibana-logging-6b5f984c44-7ljjn   1/1     Running   0          8m16s
NAME                            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
service/elasticsearch-logging   ClusterIP   None            <none>        9200/TCP,9300/TCP   28m
service/kibana-logging          NodePort    10.105.208.90   <none>        5601:32352/TCP      13m
3、验证kibana
服务以及通过NodePort暴露,通过IP+32352,可以访问到kibana web界面,如图所示

下一步,我们来部署日志收集客户端Fluentd
部署Fluentd
1、使用configmap创建fluentd配置文件
配置比较长,可以查看链接,这里就不贴出来了
https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/fluentd-elasticsearch/fluentd-es-configmap.yaml
2、执行部署
[root@k8s-node001 EFK]# kubectl  appply -f fluentd-es-configmap.yaml
3、创建fluentd-es-ds.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluentd-es
  namespace: efk
  labels:
    k8s-app: fluentd-es
    addonmanager.kubernetes.io/mode: Reconcile
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: fluentd-es
  labels:
    k8s-app: fluentd-es
    addonmanager.kubernetes.io/mode: Reconcile
rules:
- apiGroups:
  - ""
  resources:
  - "namespaces"
  - "pods"
  verbs:
  - "get"
  - "watch"
  - "list"
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: fluentd-es
  labels:
    k8s-app: fluentd-es
    addonmanager.kubernetes.io/mode: Reconcile
subjects:
- kind: ServiceAccount
  name: fluentd-es
  namespace: efk
  apiGroup: ""
roleRef:
  kind: ClusterRole
  name: fluentd-es
  apiGroup: ""
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-es-v3.0.2
  namespace: efk
  labels:
    k8s-app: fluentd-es
    version: v3.0.2
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  selector:
    matchLabels:
      k8s-app: fluentd-es
      version: v3.0.2
  template:
    metadata:
      labels:
        k8s-app: fluentd-es
        version: v3.0.2
    spec:
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      priorityClassName: system-node-critical
      serviceAccountName: fluentd-es
      containers:
      - name: fluentd-es
        image: registry.cn-qingdao.aliyuncs.com/up2cloud/fluentd:v3.0.2
        env:
        - name: FLUENTD_ARGS
          value: --no-supervisor -q
        resources:
          limits:
            memory: 500Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: config-volume
          mountPath: /etc/fluent/config.d
        ports:
        - containerPort: 24231
          name: prometheus
          protocol: TCP
        livenessProbe:
          tcpSocket:
            port: prometheus
          initialDelaySeconds: 5
          timeoutSeconds: 10
        readinessProbe:
          tcpSocket:
            port: prometheus
          initialDelaySeconds: 5
          timeoutSeconds: 10
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: config-volume
        configMap:
          name: fluentd-es-config-v0.2.0
4、执行部署
[root@k8s-node001 EFK]# kubectl apply -f fluentd-es-ds.yaml
5、查看部署结果
[root@k8s-node001 EFK]# kubectl  get po -n efk
NAME                              READY   STATUS    RESTARTS   AGE
elasticsearch-logging-0           1/1     Running   0          3h34m
elasticsearch-logging-1           1/1     Running   0          3h33m
elasticsearch-logging-2           1/1     Running   0          3h33m
fluentd-es-v3.0.2-24lbr           1/1     Running   0          26m
fluentd-es-v3.0.2-5qcsv           1/1     Running   0          26m
fluentd-es-v3.0.2-gnp58           1/1     Running   0          26m
fluentd-es-v3.0.2-gtx4s           1/1     Running   0          26m
fluentd-es-v3.0.2-mxz9t           1/1     Running   0          26m
kibana-logging-6b5f984c44-7ljjn   1/1     Running   0          3h19m
从输出信息可以看到,整套日志收集系统已经全部正常运行,现在就可以使用kibana查看收集到的日志了

至此日志收集系统搭建完毕,EFK更多用途后面会陆续介绍,也可以自行前往官网查看。

容器云平台No.9~kubernetes日志收集系统EFK的更多相关文章
- 容器云平台No.4~kubernetes 服务暴露之Ingress
		
这是容器云平台第四篇,接上一篇继续, 首先kubernetes服务暴露有如下几种方式: NodePort Loadbalance ClusterIP Ingress 本文紧贴第一篇架构图,只介绍Ing ...
 - 容器云平台No.8~kubernetes负载均衡之ingress-nginx
		
Ingress 是什么? Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由. 流量路由由 Ingress 资源上定义的规则控制. 可以将 Ingress 配置为服务提供外 ...
 - 容器云平台No.7~kubernetes监控系统prometheus-operator
		
简介 prometheus-operator Prometheus:一个非常优秀的监控工具或者说是监控方案.它提供了数据搜集.存储.处理.可视化和告警一套完整的解决方案.作为kubernetes官方推 ...
 - 容器云平台No.3~kubernetes使用
		
今天是是第三篇,接着上一篇继续 首先,通过kubectl可以看到,三个节点都正常运行 [root@k8s-master001 ~]# kubectl get no NAME STATUS ROLES ...
 - docker搭建日志收集系统EFK
		
EFK Elasticsearch是一个数据搜索引擎和分布式NoSQL数据库的组合,提过日志的存储和搜索功能. Fluentd是一个消息采集,转化,转发工具,目的是提供中心化的日志服务. Kibana ...
 - 026.[转] 基于Docker及Kubernetes技术构建容器云平台 (PaaS)
		
[编者的话] 目前很多的容器云平台通过Docker及Kubernetes等技术提供应用运行平台,从而实现运维自动化,快速部署应用.弹性伸缩和动态调整应用环境资源,提高研发运营效率. 本文简要介绍了与容 ...
 - 容器云平台No.1~基于Docker及Kubernetes构建的容器云平台
		
开篇 最近整理笔记,不知不觉发现关于kubernetes相关的笔记已经达99篇了,索性一起总结了.算是对这两年做容器云平台的一个总结,本文是开篇,先介绍下所有用到的组件.首先来看下架构图(实在画的太丑 ...
 - Kubernetes容器云平台建设实践
		
[51CTO.com原创稿件]Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理.伴随着云原生技术的迅速崛起,如今Kubernetes 事实上已经 ...
 - 容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD
		
什么是CI/CD 持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每 ...
 
随机推荐
- 4.oracle sql*plus常用命令
			
一.sys用户和system用户Oracle安装会自动的生成sys用户和system用户(1).sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户 ...
 - 1.Oracle数据库简介
			
Oracle数据库简介 Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracl ...
 - Hbase写入流程图
			
写入流程图
 - Docker 架构及工作原理
			
通过下图可以得知,Docker 在运行时分为 Docker 引擎(服务端守护进程) 和 客户端工具,我们日常使用各种 docker 命令,其实就是在使用 客户端工具 与 Docker 引擎 进行交互. ...
 - mxnet笔记
			
参考链接: https://mxnet.apache.org/api/faq/distributed_training https://mxnet.apache.org/api/faq/gradien ...
 - python爬虫之多线程、多进程+代码示例
			
python爬虫之多线程.多进程 使用多进程.多线程编写爬虫的代码能有效的提高爬虫爬取目标网站的效率. 一.什么是进程和线程 引用廖雪峰的官方网站关于进程和线程的讲解: 进程:对于操作系统来说,一个任 ...
 - Appium学习笔记
			
1.创建Maven项目 2.POM文件添加java-client依赖坐标 3.修改脚本,执行脚本 UIAutomator2(自动装置引擎) 4723:Appium服务器端口,用来监听脚本发送过来的指令 ...
 - 模拟IIC总线多设备挂载(12864OLED屏幕+GY30光照传感器)
			
最终效果展示 OLED屏幕和GY30光照传感器(BH1750FVI)都连接在一个IIC(I2C)总线上,所以只需要接4根线即可.获取到的光照强度可以在OLED上实时显示并通过串口打印.IIC是IO模拟 ...
 - IDEA创建MAVEN项目并使用tomcat启动
			
一.开发环境准备 1.JDK1.8,已经配置好环境变量 2.IDEA2019.2,目前稳定版里面个人认为还不错的 3.tomcat服务器,笔者使用的是apache-tomcat-8.5.57 4.使用 ...
 - 华师2019软件专硕复试机试题最后一题G:找数
			
G. 找数 单点时限: 1.0 sec 内存限制: 256 MB 问题描述 输入一个整数 n( 2≤n≤10 ) ,你需要找到一些 n 位数(允许有前置 0 ,见样例),这些 n 位数均 由 0 ~ ...