• k8s 部署filebeat sidecar模式之nginx测试


    k8s中日志的收集方式。一般有两种方式:

    一:sidecar模式,就是一个pod中部署两个容器,一个跑应用,一个采集日志,用emptdir的共享目录形式。

          缺点:一个应用一个收集日志的容器,后期的话资源消耗是个问题。

    二:节点模式,一个节点跑一个agent来采集标准输出和标准错误输出的日志,然后发送给后端。(标准日志:容器内输出到/dev/std...,或tail -f ,默认会存储在节点的/var/lib/docker/containers/...路径下,kubectl logs 能看到的日志就是标准日志。集群系统的日志一般在/var/log/containers/下。)详情网上查阅资料,这个只是简单的一个说法,并不严谨。

    先尝试第一个模式: sidecar模式

    一:创建filebeat的dockerfile,这里我用了centos,做好后镜像大约300+M,先尝试看看问题,后期换个基础镜像。

    1. FROM centos:latest
    2. WORKDIR /usr/local
    3. ADD filebeat-7.5.0-linux-x86_64.tar.gz .
    4. RUN ln -s filebeat-7.5.0-linux-x86_64 filebeat \
    5. && cd filebeat \
    6. && mkdir config \
    7. && chmod +x filebeat \
    8. && cp filebeat.yml config/
    9. ENTRYPOINT ["/usr/local/filebeat/filebeat","-c","/usr/local/filebeat/config/filebeat.yml"]

    所需要的 filebeat 配置文件如下:

    1. filebeat.idle_timeout: 2s
    2. filebeat.name: filebeat-shiper
    3. filebeat.spool_zie: 50000
    4. filebeat.inputs: # 从这里开始定义每个日志的路径、类型、收集方式等信息
    5. - type: log # 指定收集的类型为 log
    6. paths:
    7. - /var/log/nginx/access.log # 设置 access.log 的路径
    8. fields: # 设置一个 fields,用于标记这个日志
    9. type: access-log # 为 fields 设置一个关键字 type,值为 access-log
    10. enabled: true
    11. backoff: 1s
    12. backoff_factor: 2
    13. close_inactive: 1h
    14. encoding: plain
    15. harvester_buffer_size: 262144
    16. max_backoff: 10s
    17. max_bytes: 10485760
    18. scan_frequency: 10s
    19. tail_lines: true
    20. - type: log
    21. paths:
    22. - /var/log/nginx/error.log # 设置 error.log 的路径
    23. fields: # 设置一个 fields,用于标记这个日志
    24. type: error-log # 为 fields 设置一个关键字 type,值为 error-log
    25. enabled: true
    26. backoff: 1s
    27. backoff_factor: 2
    28. close_inactive: 1h
    29. encoding: plain
    30. harvester_buffer_size: 262144
    31. max_backoff: 10s
    32. max_bytes: 10485760
    33. scan_frequency: 10s
    34. tail_lines: true
    35. - type: log
    36. paths:
    37. - /var/log/nginx/blacklist.log # 设置 blacklist.log 的路径
    38. fields: # 设置一个 fields,用于标记这个日志
    39. type: blacklist-log # 为 fields 设置一个关键字 type,值为 blacklist-log
    40. enabled: true
    41. backoff: 1s
    42. backoff_factor: 2
    43. close_inactive: 1h
    44. encoding: plain
    45. harvester_buffer_size: 262144
    46. max_backoff: 10s
    47. max_bytes: 10485760
    48. scan_frequency: 10s
    49. tail_lines: true
    50. output.elasticsearch:
    51. workers: 4
    52. bulk_max_size: 8192
    53. hosts: # 设置 elastic 的地址
    54. - 10.16.12.206:30187
    55. - 10.16.12.207:30187
    56. - 10.16.12.208:30187
    57. - 10.16.13.214:30187
    58. - 10.16.13.215:30187
    59. index: web-nginx-%{[fields.type]}-%{+yyyy.MM.dd} # 设置索引名称,后面引用的 fields.type 变量。此处的配置应该可以省略(不符合下面创建索引条件的日志,会使用该索引,后续会测试是否是这样)
    60. indices: # 使用 indices 代表要创建多个索引
    61. - index: web-nginx-access-log-%{+yyyy.MM.dd} # 设置 access.log 日志的索引,注意索引前面的 web-nginx 要与setup.template.pattern 的配置相匹配
    62. when.equals: # 设置创建索引的条件:当 fields.type 的值等于 access-log 时才生效
    63. fields.type: access-log
    64. - index: web-nginx-error-log-%{+yyyy.MM.dd}
    65. when.equals:
    66. fields.type: error-log
    67. - index: web-nginx-blacklist-log-%{+yyyy.MM.dd}
    68. when.equals:
    69. fields.type: blacklist-log
    70. processors:
    71. - drop_fields:
    72. fields:
    73. - agent.ephemeral_id
    74. - agent.hostname
    75. - agent.id
    76. - agent.type
    77. - agent.version
    78. - ecs.version
    79. - input.type
    80. - log.offset
    81. - version
    82. - decode_json_fields:
    83. fields:
    84. - message
    85. max_depth: 1
    86. overwrite_keys: true
    87. setup.ilm.enabled: false # 如果要创建多个索引,需要将此项设置为 false
    88. setup.template.name: web-nginx-log # 设置模板的名称
    89. setup.template.pattern: web-nginx-* # 设置模板的匹配方式,上面索引的前缀要和这里保持一致
    90. setup.template.overwrite: true
    91. setup.template.enabled: true

    直接构建镜像,并推送到私有仓库

    docker build -t 10.1.1.1:6000/centos-filebeat:0.6 . 

    docker push 10.1.1.1:6000/centos-filebeat:0.6

    可以docker run运行看一下是否正常

    二:创建一个deploymen资源,包含两个容器

    1. [root@k8s-master ~/software]# cat nginx-filebeat-sidecar.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: nginx-fb
    6. namespace: sidecar
    7. spec:
    8. replicas: 1
    9. selector:
    10. matchLabels:
    11. app: nginx-fb
    12. template:
    13. metadata:
    14. namespace: sidecar
    15. labels:
    16. app: nginx-fb
    17. spec:
    18. containers:
    19. - image: nginx:alpine
    20. name: nginx
    21. ports:
    22. - containerPort: 80
    23. volumeMounts:
    24. - name: applog
    25. mountPath: /var/log/nginx
    26. - image: 10.1.1.1:6000/centos-filebeat:0.6
    27. name: filebeat
    28. volumeMounts:
    29. - name: applog
    30. mountPath: /log
    31. - name: filebeat-config
    32. mountPath: /usr/local/filebeat/config/
    33. volumes:
    34. - name: applog
    35. emptyDir: {}
    36. - name: filebeat-config
    37. configMap:
    38. name: filebeat-config

    三:创建好yaml总的namespace和configmap

    namespace,metadata里只填写name就可以

    1. [root@k8s-master ~/software]# kubectl get namespaces sidecar -o yaml
    2. apiVersion: v1
    3. kind: Namespace
    4. metadata:
    5. creationTimestamp: "2022-06-10T09:38:02Z"
    6. name: sidecar
    7. resourceVersion: "669711"
    8. selfLink: /api/v1/namespaces/sidecar
    9. uid: 5b4d0ecc-ff6a-4b62-a41f-a9924efa4e0a
    10. spec:
    11. finalizers:
    12. - kubernetes
    13. status:
    14. phase: Active

    configmap:以命令行的方式创建的,看一下filebeat的配置文件,配置文件有些问题,并不标准,下期更新一下

    kubectl create configmap filebeat-config --from-file=filebeat.yml --namespace=sidecar       #configmap名字要和上面deployment资源中引用的configmap名字相同,均标了红色。

    1. [root@k8s-master ~/software]# cat filebeat.yml
    2. filebeat.inputs:
    3. - type: log
    4. enabled: true
    5. paths:
    6. - /log/access.log
    7. json.keys_under_root: true
    8. json.overwrite_keys: true
    9. tags: ["access"]
    10. - type: log
    11. enabled: true
    12. paths:
    13. - /log/error.log
    14. tags: ["error"]
    15. output.elasticsearch:
    16. hosts: ["10.1.1.1:9200"]
    17. indices:
    18. - index: "nginx_access-%{[beat.version]}-%{+yyyy.MM}"
    19. when.contains:
    20. tags: "access"
    21. - index: "nginx_error-%{[beat.version]}-%{+yyyy.MM}"
    22. when.contains:
    23. tags: "error"
    24. setup.template.name: "nginx"
    25. setup.template.pattern: "nginx_*"
    26. setup.template.enabled: false
    27. setup.template.overwrite: true

    四:创建service资源,让nginx可以被外部访问

    1. [root@k8s-master ~/software]# cat service-nginx.yaml
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: service-nginx
    6. namespace: sidecar
    7. spec:
    8. type: NodePort
    9. ports:
    10. - port: 80
    11. protocol: TCP
    12. targetPort: 80
    13. nodePort: 30080
    14. selector:
    15. app: nginx-fb

    五:3和4 直接启动 kubectl creat -f 

    nginx 在浏览器中可以正常访问 http://10.1.1.1:30080

    ES还并没有部署在k8s中,在虚拟机中,从filebeat的配置文件可以看出来,可以正常看到两类日志,没有问题。

  • 相关阅读:
    基于matlab实现的多普勒脉冲雷达回波仿真
    机器学习:在SAS中运行随机森林
    多线程详解
    私有云也想要cdn加速服务怎么办?
    字节跳动面经——实习算法岗
    前端必须知道的调试工具
    ASP.NET MVC多表示例题-酒店管理
    嵌入式工程师常见面试题2-MCU_STM32
    【MySQL】高性能高可用表设计实战-表设计篇(MySQL专栏启动)
    FTP服务配置和使用
  • 原文地址:https://blog.csdn.net/weixin_45623111/article/details/126029656