6-8-k8s实际应用-基于ELK实现容器日志收集与展示

熊 1 阅读 容器

自定义字段数据格式转换、排序、基于日志实现pod自愈、自动扩容等

收集日志的方法:

  1. 通过DaemonSet在宿主机启动日志收集客户端Fluentd、logstash、filebeat -v选项把宿主机的日志挂载容器里 , 在容器把日志收集到ES 。配置较多

  2. 手动安装日志收集客户端。手动配置

  3. 在pod内置一个filebeat。配置简单

    • 在容器里面启动一个filebeat进程

    • 在pod再启动一个filebeat容器

1. 镜像构建

1.1 基础镜像构建

对初始镜像进行基础软件安装,此镜像为nginx tomcat jdk的基本镜像 , 安装日志收集工具filebeat。

  • 构建目录文件

    [root@localhost7C centos]# ll
    -rw-r--r-- 1 root root      174 4月   7 2020 build-command.sh
    -rw-r--r-- 1 root root      503 4月   9 2020 Dockerfile
    -rw-r--r-- 1 root root 24694569 4月   7 2020 filebeat-7.6.1-x86_64.rpm
    ​
  • 构建镜像文件

    [root@localhost7C centos]# cat Dockerfile 
    #自定义Centos 基础镜像
    from from harbor.zzhz.com/baseimages/centos:7.6.1810 
    LABEL MAINTAINER="2973707860@qq.com"
    ADD filebeat-7.6.1-x86_64.rpm /tmp
    RUN yum install -y /tmp/filebeat-7.6.1-x86_64.rpm vim wget tree  lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel \ 
    openssl openssl-devel iproute net-tools iotop &&  rm -rf /etc/localtime /tmp/filebeat-7.6.1-x86_64.rpm \
    && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && useradd  nginx -u 2019 && useradd www -u 2020
    ​
  • 镜像构建脚本

    [root@localhost7C centos]# cat build-command.sh 
    #!/bin/bash
    docker build -t  harbor.zzhz.com/baseimages/magedu-centos-base:7.6.1810  .
    ​
    docker push harbor.zzhz.com/baseimages/magedu-centos-base:7.6.1810
  • 镜像构建

    [root@localhost7C centos]# chmod  +x build-command.sh 
    [root@localhost7C centos]# ./build-command.sh

1.2 jdk镜像构建

基于基础的centos镜像 harbor.zzhz.com/baseimages/magedu-centos-base:7.6.1810,制作公司内部基础镜像--jdk镜像

  • 构建目录文件

    [root@localhost7C jdk-1.8.212]# ll
    -rw-r--r-- 1 root root       138 3月  28 15:38 build-command.sh
    -rw-r--r-- 1 root root       388 3月  28 15:36 Dockerfile
    -rw-r--r-- 1 root root 195013152 4月   7 2020 jdk-8u212-linux-x64.tar.gz
    -rw-r--r-- 1 root root      2128 3月  28 15:39 profile
  • 镜像构建文件

    [root@localhost7C jdk-1.8.212]# cat Dockerfile 
    #JDK Base Image
    FROM harbor.zzhz.com/baseimages/magedu-centos-base:7.6.1810
    MAINTAINER zhangshijie "zhangshijie@magedu.net"
    ​
    ADD jdk-8u212-linux-x64.tar.gz /usr/local/src/
    RUN ln -sv /usr/local/src/jdk1.8.0_212 /usr/local/jdk 
    ADD profile /etc/profile
    ​
    ENV JAVA_HOME /usr/local/jdk
    ENV JRE_HOME $JAVA_HOME/jre
    ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
    ENV PATH $PATH:$JAVA_HOME/bin
  • 镜像构建脚本

    [root@localhost7C jdk-1.8.212]# cat build-command.sh 
    #!/bin/bash
    docker build -t harbor.zzhz.com/pub-images/jdk-base:v8.212  .
    sleep 1
    docker push  harbor.zzhz.com/pub-images/jdk-base:v8.212
    ​
  • profile文件的来源 : 使用docker 运行一个临时容器复制出来。

    [root@localhost7C jdk-1.8.212]# cat profile 
     ....
     ....
     ....
    unset i
    unset -f pathmunge
    export LANG=en_US.UTF-8
    export HISTTIMEFORMAT="%F %T `whoami` "
    #主要是这几行。
    export JAVA_HOME=/usr/local/jdk
    export TOMCAT_HOME=/apps/tomcat
    export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOME/bin:$PATH
    export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
  • 镜像开始执行构建

    #执行构造
    [root@localhost7C jdk-1.8.212]# chmod  +x build-command.sh 
    [root@localhost7C jdk-1.8.212]# ./build-command.sh
  • 测试

    [root@localhost7C jdk-1.8.212]# docker run  -it --rm  harbor.zzhz.com/pub-images/jdk-base:v8.212 bash
    [root@5cd43e965b82 /]# java  -version
    java version "1.8.0_212"
    Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)

1.3 基于jdk镜像制作tomcat基础镜像

  • 基本目录信息

    [root@localhost7C tomcat-base-8.5.43]# ll
    -rw-r--r-- 1 root root 9717059 4月   7 2020 apache-tomcat-8.5.43.tar.gz
    -rw-r--r-- 1 root root     146 3月  28 15:48 build-command.sh
    -rw-r--r-- 1 root root     341 3月  28 15:48 Dockerfile
  • 镜像构建文件

    [root@localhost7C tomcat-base-8.5.43]# cat Dockerfile 
    #Tomcat 8.5.43基础镜像
    FROM harbor.zzhz.com/pub-images/jdk-base:v8.212 
    MAINTAINER zhangshijie "zhangshijie@magedu.net"
    RUN mkdir /apps /data/tomcat/webapps /data/tomcat/logs -pv 
    ADD apache-tomcat-8.5.43.tar.gz  /apps
    RUN useradd tomcat -u 2021 && ln -sv /apps/apache-tomcat-8.5.43 /apps/tomcat && chown -R nginx.nginx /apps /data -R
  • 镜像构建脚本

    [root@localhost7C tomcat-base-8.5.43]# cat build-command.sh 
    #!/bin/bash
    docker build -t harbor.zzhz.com/pub-images/tomcat-base:v8.5.43  .
    sleep 3
    docker push  harbor.zzhz.com/pub-images/tomcat-base:v8.5.43
  • 执行镜像构建脚本

    [root@localhost7C tomcat-base-8.5.43]# chmod +x build-command.sh 
    [root@localhost7C tomcat-base-8.5.43]# ./build-command.sh 
  • 测试访问tomcat基础镜像启动为容器

    [root@localhost7C tomcat-base-8.5.43]# docker run -it --rm -p 8801:8080  harbor.zzhz.com/pub-images/tomcat-base:v8.5.43  bash
    [root@cfb5972b39ac /]# /apps/tomcat/bin/catalina.sh  start
    Using CATALINA_BASE:   /apps/tomcat
    Using CATALINA_HOME:   /apps/tomcat
    Using CATALINA_TMPDIR: /apps/tomcat/temp
    Using JRE_HOME:        /usr/local/jdk/jre
    Using CLASSPATH:       /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar
    Tomcat started.
    
    [root@cfb5972b39ac /]# ps aux
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root          1  0.0  0.1  11824  1924 pts/0    Ss   15:52   0:00 bash
    root         23 63.4  4.9 3999372 91544 pts/0   Sl   15:53   0:03 /usr/local/jdk/jre/bin/java -Djava.util.logging.config.file=/apps/tomcat/conf/logging.properties -Djava.util.logging.manage
    root         73  0.0  0.0  51748  1732 pts/0    R+   15:53   0:00 ps aux
  • 测试

    [root@localhost7K ~]# curl 192.168.80.120:8801

1.4 tomcat 业务镜像

tomcat业务镜像app1制作 , 后期按此步骤制作app2、appN镜像

  • 镜像文件

    [root@localhost7C linux39]# cd tomcat-app1/
    [root@localhost7C tomcat-app1]# ll
    -rwxr-xr-x 1 root root   165 4月   7 2020 build-command.sh
    -rwxr-xr-x 1 root root 23611 4月   7 2020 catalina.sh  
    -rw-r--r-- 1 root root   548 4月   9 2020 Dockerfile
    -rw-r--r-- 1 root root   416 4月   9 2020 filebeat.yml
    -rw-r--r-- 1 root root    12 4月   7 2020 index.html
    -rw-r--r-- 1 root root   266 4月   9 2020 myapp.tar.gz
    -rwxr-xr-x 1 root root   556 4月   9 2020 run_tomcat.sh
    -rw-r--r-- 1 root root  6460 4月   7 2020 server.xml 
  • 镜像构建文件

    [root@localhost7C tomcat-app1]# cat Dockerfile 
    #tomcat web1
    FROM harbor.zzhz.com/pub-images/tomcat-base:v8.5.43 
    ADD catalina.sh /apps/tomcat/bin/catalina.sh
    ADD server.xml /apps/tomcat/conf/server.xml
    #ADD myapp/* /data/tomcat/webapps/myapp/
    ADD myapp.tar.gz /data/tomcat/webapps/myapp/
    ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
    ADD filebeat.yml /etc/filebeat/filebeat.yml 
    RUN mkdir /data/tomcat/webapps/myapp/images  /data/tomcat/webapps/myapp/static -p
    RUN chown  -R nginx.nginx /data/ /apps/ 
    EXPOSE 8080 8443
    CMD ["/apps/tomcat/bin/run_tomcat.sh"]
  • index.html文件内容

    [root@localhost7C tomcat-app1]# cat index.html 
    tomcat app1
  • 收集工具配置文件

    [root@localhost7C tomcat-app1]# cat filebeat.yml 
    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /apps/tomcat/logs/catalina.out
      fields:
        type: k8s-tomcat-catalina
    
    filebeat.config.modules:
      path: ${path.config}/modules.d/*.yml
      reload.enabled: false
    setup.template.settings:
      index.number_of_shards: 1
    
    output.redis:
      hosts: ["srv-devops-redis.magedu.svc.zzhz.local:6379"]  #redis地址
      key: "k8s-linux39-myapp"
      db: 1
      timeout: 5
      password: "123456"
  • 启动文件

    [root@localhost7C tomcat-app1]# cat run_tomcat.sh 
    #!/bin/bash
    /usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat &
    su - nginx -c "/apps/tomcat/bin/catalina.sh start"
    tail -f /etc/hosts
  • server.xml文件

    [root@localhost7C tomcat-app1]# cat server.xml 
    其它省略
    <Host name="localhost"  appBase="/data/tomcat/webapps"  unpackWARs="true" autoDeploy="true">
  • 镜像构建脚本

    [root@localhost7C tomcat-app1]# cat build-command.sh 
    #!/bin/bash
    TAG=$1
    docker build -t  harbor.zzhz.com/linux39/tomcat-app1:${TAG} .
    sleep 3
    docker push  harbor.zzhz.com/linux39/tomcat-app1:${TAG}
  • 所有脚本要有执行权限

    [root@localhost7C tomcat-app1]# chmod +x *.sh
    [root@localhost7C tomcat-app1]# ./build-command.sh  2022-02-22
  • 测试访问tomcat基础镜像启动为容器:

    [root@localhost7C tomcat-app1]#docker run -it --rm -p 8801:8080 harbor.zzhz.com/linux39/tomcat-app1:2022-02-22
    
    [root@localhost7K ~]# curl  192.168.80.120:8801/myapp/index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>马哥教育</title>
    </head>
    <body>
        <h1>linux39 myapp v1</h1>
        <h1>linux39 myapp v2</h1>
    </body>
    </html>

2. k8s环境创建tomcat 业务pod

  • tomcat环境配置文件

    [root@localhost7C tomcat-app1]# cat tomcat-app1.yaml 
    kind: Deployment
    #apiVersion: extensions/v1beta1
    apiVersion: apps/v1
    metadata:
      labels:
        app: linux39-tomcat-app1-deployment-label
      name: linux39-tomcat-app1-deployment
      namespace: linux39
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: linux39-tomcat-app1-selector
      template:
        metadata:
          labels:
            app: linux39-tomcat-app1-selector
        spec:
          containers:
          - name: linux39-tomcat-app1-container
            image: harbor.zzhz.com/linux39/tomcat-app1:2022-04-14
            #command: ["/apps/tomcat/bin/run_tomcat.sh"]
            #imagePullPolicy: IfNotPresent
            imagePullPolicy: Always
            ports:
            - containerPort: 8080
              protocol: TCP
              name: http
            env:
            - name: "password"
              value: "123456"
            - name: "age"
              value: "18"
            resources:
              limits:
                cpu: 1
                memory: "512Mi"
              requests:
                cpu: 500m
                memory: "512Mi"
            volumeMounts:
            - name: linux39-images
              mountPath: /data/tomcat/webapps/myapp/images
              readOnly: false
            - name: linux39-static
              mountPath: /data/tomcat/webapps/myapp/static
              readOnly: false
          volumes:
          - name: linux39-images
            nfs:
              server: 192.168.80.110
              path: /data/linux39/images
          - name: linux39-static
            nfs:
              server: 192.168.80.110
              path: /data/linux39/static
          #nodeSelector:
          #  project: linux39
    ---
    kind: Service
    apiVersion: v1
    metadata:
      labels:
        app: linux39-tomcat-app1-service-label
      name: linux39-tomcat-app1-service
      namespace: linux39
    spec:
      type: NodePort
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 8080
        nodePort: 30003
      selector:
        app: linux39-tomcat-app1-selector
  • 启用资源配置文件

    [root@localhost7C tomcat-app1]# kubectl apply  -f tomcat-app1.yaml 

3. 测试

  • tomcat产生数据库

    kubernetes-applyation-tomcat-1

4. logstash 服务配置文件

[root@localhost7I ]# cat /etc/logstash/conf.d/log.conf 
input {
    redis {
      host => "192.168.80.150"
      port => "36379"
      db => 1
      password => "123456"
      data_type => "list"
      key => "k8s-linux39-myapp"
    }
}

output {
   if [fields][type] == "k8s-tomcat-catalina" {
    elasticsearch {
      hosts => ["192.168.80.190:9200"]
      index => "k8s-linux39-tomcat-myapp-catalina-outlog-%{+YYYY.MM.dd}"
    }      
   }
}

5. 查看

使用head cerebro kibana等工具查看

kubernetes-applyation-elk-tomcat-2


参考链接

八、实战案例之基于ELK实现容器日志收集与展示 - yuanbangchen - 博客园 (cnblogs.com)