K8S - Emptydir - 取代ELK 使用fluentd 构建logging saidcar

news2024/11/25 20:27:16

由于k8s 的无状态service 通常部署在多个POD中, 实现多实例面向高并发。
但是k8s 本身并没有提供集中查询多个pod的日志的功能

其中1个常见方案就是ELK.
本文的方案是 利用fluentd sidecar 和 emptydir 把多个pod的日志导向到bigquery的table中。



Emptydir 的简介

在这里插入图片描述

Kubernetes中的EmptyDir是一种用于容器之间共享临时存储的空目录卷类型。EmptyDir卷在Pod内的容器之间共享,并且在Pod被删除时,其中的数据也会被删除。

以下是EmptyDir卷的一些关键特点:

临时存储:EmptyDir卷用于临时存储数据。当Pod被删除时,EmptyDir中的数据也会被删除。
容器共享:EmptyDir卷可以在同一个Pod中的多个容器之间共享数据。这对于需要在容器之间共享数据的场景非常有用。
空目录:EmptyDir卷开始为空,可以被一个或多个容器用来写入和读取数据。
生命周期:EmptyDir的生命周期与Pod的生命周期相同。当Pod被删除时,EmptyDir中的数据也会被清除。

所以Emptydir 就是用于1个pod 内多个容器数据交流的。
什么场景下1个pod 内会有两个容器,而且他们之间需要用文件来交流数据。
最著名的usecase 就是日志收集sidecar

下面我就会利用fluentd构建1个日志sidecar 作为例子:

至于fluentd的介绍请参考:
fluentd 简介,日志收集并导入BigQuery



准备fluentd 的镜像

由于fluentd 官方镜像并没有包含bigquery 插件, 所以我们需要自己打包1个包含该插件的惊险



准备dockerfile

Dockerfile

# 使用 Fluentd 官方的镜像作为基础镜像
FROM fluentd:latest
USER root
RUN mkdir -p /app/logs/
RUN mkdir /app/gcp-key/

# 安装 fluent-plugin-bigquery 插件
RUN gem install fluent-plugin-bigquery

# 复制 Fluentd 配置文件到镜像中
COPY fluent.conf /fluentd/etc/fluent.conf

COPY fluentd-ingress-jason-hsbc.json /app/gcp-key/fluentd-ingress-jason-hsbc.json

# 定义 CMD 指令用于启动 Fluentd 并指定配置文件
CMD ["fluentd", "-c", "/fluentd/etc/fluent.conf"]



放置 bigquery 使用的service account key

其中 fluentd-ingress-jason-hsbc.json 是1个service account帐号的 json key, 被用于访问Biqquery table.

问题的是fluentd-ingress-jason-hsbc.json 放在哪里, 这种敏感信息放在github 肯定是不合适的
这里的解决方案是放在google cloud 的secret manager

在这里插入图片描述


创建1个cloudbuild job trigger来构建这个docker 镜像

我的fluentd 镜像项目在
https://github.com/nvd11/fluentd-home

有了这个trigger 之后, 一旦代码有任何更新, clouldbuild 会自动帮我打包1个新的镜像

terraform 代码:

resource "google_cloudbuild_trigger" "fluentd-bq-gar-trigger" {
  name = "fluentd-bq-gar-trigger" # could not contains underscore

  location = var.region_id

  # when use github then should use trigger_template
  github {
    name = "fluentd-home"
    owner = "nvd11"
    push {
      branch = "main"
      invert_regex = false # means trigger on branch
    }
  }

  filename = "cloudbuild-gar.yaml"
  # projects/jason-hsbc/serviceAccounts/terraform@jason-hsbc.iam.gserviceaccount.com
  service_account = data.google_service_account.cloudbuild_sa.id 
}



为fluentd 镜像构建编写cloudbuild yaml

cloudbuld-gar.yaml

# just to update the docker image to GAR with the pom.xml version

steps:
  - id: prepare service acccount json key file
    name: ubuntu # https://hub.docker.com/_/maven
    entrypoint: bash
    args:
      - '-c'
      - |
        ls -l
        echo $$FLUENTD_INGRESS_JASON_HSBC_KEY > fluentd-ingress-jason-hsbc.json
        ls -l
        cat ./fluentd-ingress-jason-hsbc.json
    secretEnv:
      - 'FLUENTD_INGRESS_JASON_HSBC_KEY'

  - id: build and push docker image
    name: 'gcr.io/cloud-builders/docker'
    entrypoint: bash
    args:
      - '-c'
      - |
        set -x
        echo "Building docker image with tag: $_APP_TAG"
        docker build -t $_GAR_BASE/$PROJECT_ID/$_DOCKER_REPO_NAME/${_APP_NAME}:${_APP_TAG} .
        docker push $_GAR_BASE/$PROJECT_ID/$_DOCKER_REPO_NAME/${_APP_NAME}:${_APP_TAG}


logsBucket: gs://jason-hsbc_cloudbuild/logs/
options: # https://cloud.google.com/cloud-build/docs/build-config#options
  logging: GCS_ONLY # or CLOUD_LOGGING_ONLY https://cloud.google.com/cloud-build/docs/build-config#logging

availableSecrets:
  secretManager:
    - versionName: projects/$PROJECT_ID/secrets/fluentd-ingress-jason-hsbc-key/versions/latest
      env: 'FLUENTD_INGRESS_JASON_HSBC_KEY'

substitutions:
  _DOCKER_REPO_NAME: my-docker-repo
  _APP_NAME: fluentd-bigquery
  _APP_TAG: latest
  _GAR_BASE: europe-west2-docker.pkg.dev

构建镜像

在这里插入图片描述

镜像构建成功

gateman@MoreFine-S500:~/keys$ gcloud artifacts docker images list europe-west2-docker.pkg.dev/jason-hsbc/my-docker-repo --include-tags | grep fluentd
europe-west2-docker.pkg.dev/jason-hsbc/my-docker-repo/fluentd-bigquery  sha256:49818bf8f82ef611caadcf5162fbd61a5a3bb34487acd741a9c3c035c54b2fac  latest          2024-09-08T23:27:25  2024-09-08T23:27:25  36254422





准备fluentd 配置并放入k8s的config map

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-fluentd-cloud-order
data:
  fluent.conf: |
    <source>
        @type tail
        path /app/logs/app.log
        pos_file /app/logs/app.log.pos
        tag app.logs 
        format none
    </source>

    <match **>
      @type bigquery_insert
      
      <buffer>
        flush_mode immediate
      </buffer>
      
      #auth_method compute_engine
      auth_method json_key
      json_key /app/gcp-key/fluentd-ingress-jason-hsbc.json
      # private_key_passphrase notasecret # default

      project jason-hsbc
      dataset LOGS
      auto_create_table true
      table cloud-order-logs

      <inject>
        time_key timestamp
        # time_type unixtime_millis # out of range
        time_type string
        time_format %Y-%m-%d %H:%M:%S.%L
      </inject>

      schema [
        {
          "name": "timestamp",
          "type": "TIMESTAMP"
        },
        {
          "name": "project_id",
          "type": "STRING"
        },
         {
          "name": "dataset",
          "type": "STRING"
        },
         {
          "name": "table",
          "type": "STRING"
        },
        {
          "name": "worker",
          "type": "STRING"
        },
         {
          "name": "ppid",
          "type": "STRING"
        },
        {
          "name": "inserted_rows",
          "type": "STRING"
        },
        {
          "name": "message",
          "type": "STRING"
        }
      ]
    </match>

注意这个配置会把日志写入 LOGS.cloud-order-logs 这个Bigquery table





准备cloud-order service 的deployment.yaml

deployment-cloud-order-fluentd-sidecar.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels: # label of this deployment
    app: cloud-order # custom defined
    author: nvd11
  name: deployment-cloud-order # name of this deployment
  namespace: default
spec:
  replicas: 3            # desired replica count, Please note that the replica Pods in a Deployment are typically distributed across multiple nodes.
  revisionHistoryLimit: 10 # The number of old ReplicaSets to retain to allow rollback
  selector: # label of the Pod that the Deployment is managing,, it's mandatory, without it , we will get this error 
            # error: error validating data: ValidationError(Deployment.spec.selector): missing required field "matchLabels" in io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector ..
    matchLabels:
      app: cloud-order
  strategy: # Strategy of upodate
    type: RollingUpdate # RollingUpdate or Recreate
    rollingUpdate:
      maxSurge: 25% # The maximum number of Pods that can be created over the desired number of Pods during the update
      maxUnavailable: 25% # The maximum number of Pods that can be unavailable during the update
  template: # Pod template
    metadata:
      labels:
        app: cloud-order # label of the Pod that the Deployment is managing. must match the selector, otherwise, will get the error Invalid value: map[string]string{"app":"bq-api-xxx"}: `selector` does not match template `labels`
    spec: # specification of the Pod
      containers:
      - image: europe-west2-docker.pkg.dev/jason-hsbc/my-docker-repo/cloud-order:1.1.0 # image of the container
        imagePullPolicy: Always
        name: container-cloud-order
        command: ["bash"]
        args: 
          - "-c"
          - |
            java -jar -Dserver.port=8080 app.jar --spring.profiles.active=$APP_ENVIRONMENT --logging.file.name=/app/logs/app.log
        env: # set env varaibles
        - name: APP_ENVIRONMENT # name of the environment variable
          value: prod # value of the environment variable
        volumeMounts: # write log here
          - name: volume-log
            mountPath: /app/logs/
            readOnly: false # read only is set to false
        ports:
        - containerPort: 8080
          name: cloud-order

      - image: europe-west2-docker.pkg.dev/jason-hsbc/my-docker-repo/fluentd-bigquery:latest # image of the container
        imagePullPolicy: Always
        name: container-fluentd
        command: ["sh"]
        args: 
          - "-c"
          - |
            fluentd -c /app/config/fluentd.conf
        volumeMounts: # read log from here
          - name: volume-log
            mountPath: /app/logs/
            readOnly: false # read only is set to false
          - name: config-volume
            mountPath: /app/config
            readOnly: false # read only is set to false
      volumes:
        - name: volume-log
          emptyDir: {}
        - name: config-volume
          configMap:
            name: configmap-fluentd-cloud-order # name of the config map
            items:
              - key: fluent.conf # key of the config map item
                path: fluentd.conf # name of the file, it will only contain the content of the key
                                                                       
            
      restartPolicy: Always # Restart policy for all containers within the Pod
      terminationGracePeriodSeconds: 10 # The period of time in seconds given to the Pod to terminate gracefully

注意的是
里面定义了两个容器
1个是主容器springboot service cloud-order
另1个是容器 fluentd (镜像来自于本文第1步的构建)
而且我们定义了1个emptydir 的volume, 分别map在两个containers 中

而且sidecar 容器还map了另1个configmap的卷以读取 fluentd.conf 配置

测试

容器启动后

可以用如下命令分别查看pod 两个容器的日志
kubectl logs deployment-cloud-order-54cd5db8f-7rdmq -c 容器名字

如果日志没问题, 就直接查看bigquery 的table

gateman@MoreFine-S500:emptydir$ bq query --nouse_legacy_sql 'SELECT `timestamp`,  message FROM `jason-hsbc`.LOGS.`cloud-order-logs` ORDER BY timestamp desc'
WARNING: This command is using service account impersonation. All API calls will be executed as [terraform@jason-hsbc.iam.gserviceaccount.com].
+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|      timestamp      |                                                                                                                                                  message                                                                                                                                                   |
+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 2024-09-08 19:33:14 | 2024-09-08T19:33:13.058Z  WARN 1 --- [main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning                             |
| 2024-09-08 19:33:14 | 2024-09-08T19:33:13.395Z  INFO 1 --- [main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 4 endpoint(s) beneath base path '/actuator'                                                                                                                                                                |
| 2024-09-08 19:33:14 | 2024-09-08T19:33:13.459Z  INFO 1 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''                                                                                                                                                         |
| 2024-09-08 19:33:14 | 2024-09-08T19:33:13.460Z  INFO 1 --- [main] u.j.c.RefreshScopeRefreshedEventListener : Refreshing cached encryptable property sources on ServletWebServerInitializedEvent                                                                                                                                  |
| 2024-09-08 19:33:14 | 2024-09-08T19:33:13.461Z  INFO 1 --- [main] CachingDelegateEncryptablePropertySource : Property Source commandLineArgs refreshed                                                                                                                                                                           |
| 2024-09-08 19:33:14 | 2024-09-08T19:33:13.461Z  INFO 1 --- [main] CachingDelegateEncryptablePropertySource : Property Source systemProperties refreshed                                                                                                                                                                          |
| 2024-09-08 19:33:14 | 2024-09-08T19:33:13.461Z  INFO 1 --- [main] CachingDelegateEncryptablePropertySource : Property Source systemEnvironment refreshed                                                                                                                                                                         |
...

测试通过!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2117990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32F407ZGT6单片机HAL库——DAC输出

一、输出直流电压 1.cubemax的配置&#xff08;通道1&#xff09; 2.直流电压大小计算 3.主函数加入初始化的程序 float DAC_voltage1.5;HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DAC_voltage*4095/3.3);//HAL_DAC_Start(&hdac,DAC_CHANNEL_1); 二、…

深度解析价值流:推动业务架构创新与效益提升的核心指南

数字化转型下的价值流管理与架构 在当今的数字化转型背景下&#xff0c;如何有效创造并交付价值&#xff0c;成为企业竞争力提升的关键课题。作为企业架构的重要组成部分&#xff0c;价值流的概念为业务决策者和技术人员提供了全面的工具&#xff0c;帮助优化业务能力&#xf…

java,php,go,nodejs,Python开发web项目优缺点对比

Java 优点:java 是一门广泛应用于企业级开发的语言,丰富且庞大的开发框架和库。有较高的性能和可伸缩性。生态系统庞大且成熟,拥有大量的开源框架和工具,可以加速开发过程。 内置对多线程的支持,适合处理高并发的 Web 项目。 缺点:相比其他语言,Java 的语法相对冗长繁琐…

Linux-Shell编程【看这一篇就够了!!!】

目录 前言 什么是Shell编程 Shell脚本的执行方式 脚本格式要求 运行一个Shell 一个Shell例子 Shell的变量 shell变量的定义 设置环境变量 简单示范 位置参数变量 预定义变量 基本语法 运算符 应用案例 条件判断 单流程判断 常用判断条件 应用案例 多流程判…

Type-C 接口 取电 PD快充协议取电电压5V、9V、15V、20V

随着Type-C接口的普及&#xff0c;快充技术融入进了各种电子设备中&#xff0c;然而快充技术里快充协议是必不可少的&#xff0c;目前市面上已经出现多种快充协议&#xff0c;最常见的便是Type-C PD协议&#xff0c;下面来以起了解以下PD协议。 PD协议的工作原理主要是基于电压…

【OpenCV】灰度化和二值化处理图像

文章目录 1. 图像灰度化处理对比2. 代码示例3. 二值化处理 1. 图像灰度化处理对比 2. 代码示例 #include <opencv2/opencv.hpp> using namespace cv;int main() {Mat currentImage imread("path_to_image.jpg"); // 读取彩色图像Mat grayImage;// 将彩色图像…

负债不再是障碍?银行信贷“白名单“揭秘

谈及银行信贷产品&#xff0c;常闻有言称存在无需考量负债与查询记录之奇品&#xff0c;此等说法十有八九为中介诱人上钩之辞。轻信之下&#xff0c;恐将步入连环陷阱。除非个人资质出类拔萃&#xff0c;如就职于国央企或事业单位&#xff0c;工龄逾年&#xff0c;五险一金完备…

计算机毕业设计选题推荐-土地承包管理系统-Java/Python项目实战(亮点:数据可视化分析、账号锁定、智能推荐)

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Address localhost:1099 is already in use:tomcat频繁重启端口占用问题

错误提示 Unable to open debugger port (127.0.0.1:58198): java.net.SocketException "Socket closed" Address localhost:1099 is already in use 端口被占用 报错原因 由于短时间内频繁运行tomcat服务器。 为了避免出现这一错误。可以点击刷新uodate resourc…

寻找客户资源的软件

如果你正在寻找能够帮助你高效寻找客户资源的软件&#xff0c;以下几款工具可以为你提供支持&#xff1a; 1. 微拓客APP 微拓客APP是一款专为企业和销售人员设计的智能拓客工具。它通过最新的全国工商数据&#xff0c;帮助你精准搜索目标客户&#xff0c;特别适合需要快速找到…

软件开发人员从0到1实现物联网项目:项目架构的思考

文章目录 前言单体应用足矣摒弃传统的微信对接后期的维护投入上真正的“云”&#xff1a;云托管0服务器免运维免费的CDN和DDoS防护 技术架构小结 前言 因为种种原因&#xff0c;《软件开发人员从0到1实现物联网项目》这个项目的进度停滞了将近一个月。 鉴于该项目的前期开发和…

优化销售流程,领先市场趋势!企元数智赠送小程序合规分销系统!

在当今竞争激烈的商业环境中&#xff0c;企业要保持竞争力并领先市场趋势&#xff0c;关键在于不断优化销售流程和采用最新的营销工具。为满这一迫切需求&#xff0c;企元数智&#xff08;假设为一家虚构公司&#xff09;推出了一项创新举措&#xff1a;赠送小程序合规分销系统…

景联文科技:专业数据标注公司,推动AI技术革新

数据标注作为AI技术发展的重要支撑&#xff0c;对于训练高质量的机器学习模型以及推动应用领域的创新具有不可替代的作用。 景联文科技作为专业的数据标注公司&#xff0c;致力于提供专业的数据标注服务&#xff0c;帮助客户解决AI链条中的数据处理难题&#xff0c;共同推动人工…

沃尔玛活跃卖家一年内增长50%,突破15万!沃尔玛新店铺如何快速出单?

随着美国电商市场竞争日益激烈&#xff0c;沃尔玛正在迅速崛起成为亚马逊的强劲对手。据最新财报显示&#xff0c;2024年第二季度&#xff0c;沃尔玛的全球广告收入增长了26%&#xff0c;其中专注于美国市场的Walmart Connect更是取得30%的增长&#xff0c;这一成绩已经超越了其…

Java笔试面试题AI答之单元测试JUnit(4)

文章目录 19. 简述JUnit org.junit.TestSuite类的作用 &#xff1f;1. 组织测试类2. 简化测试执行3. 灵活配置测试环境4. 嵌套测试套件注意事项 20. 在JUnit中Test注释的作用和用法 &#xff1f;作用用法 21. 简述Junit 基础注解&#xff08;BeforeClass、Before、Test、After、…

Java--集合进阶 Collection,迭代器,lambda表达式

集合体系结构 Collection&#xff1a;单列集合 LIst系列集合&#xff1a;添加的元素是有序、可重复、有索引 Set系列集合&#xff1a;添加的元素是无序、不重复、无索引 Collection集合常用方法 | 方法名 | 说明 || :---…

双设备同时快充不再是梦:揭秘一拖二快充线PD芯片的奥秘

一拖二快充线PD芯片&#xff1a;充电新纪元&#xff0c;让生活更“电”力十足&#xff01; 在这个快节奏的时代&#xff0c;手机、平板、耳机……我们的数字小伙伴们几乎从不离身&#xff0c;但它们的电量却总爱跟我们玩“躲猫猫”。每当夜幕降临&#xff0c;充电线就成了连接我…

【每日刷题】Day114

【每日刷题】Day114 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 166. 珠宝的最高价值 - 力扣&#xff08;LeetCode&#xff09; 2. 931. 下降路径最小和 - 力扣…

关于转行网络安全的一些建议

在当前就业形势下&#xff0c;不少朋友面临转行的困境。网络安全作为一个热门领域&#xff0c;自然也吸引了许多人的目光。本文将就转行网络安全这一话题&#xff0c;提供一些切实可行的建议。 网络安全行业概况 网络安全涵盖了从基础的脚本编写到高级的漏洞研究等多个层面。该…

【数学分析笔记】第3章第2节 连续函数(2)

3. 函数极限与连续函数 3.2 连续函数 【例3,2,4】证明 f ( x ) a x ( a > 0 , a ≠ 1 ) f(x)a^{x}(a>0,a\ne 1) f(x)ax(a>0,a1)在 ( − ∞ , ∞ ) (-\infty,\infty) (−∞,∞)上连续。 【证】 ∀ x 0 ∈ ( − ∞ , ∞ ) \forall x_{0}\in(-\infty,\infty) ∀x0…