以 Serverless 的方式实现 Kubernetes 日志告警

当我们将容器的日志收集到消息服务器之后,我们该如何处理这些日志?部署一个专用的日志处理工作负载可能会耗费多余的成本,而当日志体量骤增、骤降时亦难以评估日志处理工作负载的待机数量。本文提供了一种基于 Serverless 的日志处理思路,可以在降低该任务链路成本的同时提高其灵活性。我们的大体设计是使用 Kafka 服务器作为日志的接收器,之后以输入 Kafka 服务器的日志作为事件,驱动 Serverless 工作负载对日志进行处理。据此的大致步骤为: 搭建 Kafka 服务器作为 Kubernet
摘要由CSDN通过智能技术生成

当我们将容器的日志收集到消息服务器之后,我们该如何处理这些日志?部署一个专用的日志处理工作负载可能会耗费多余的成本,而当日志体量骤增、骤降时亦难以评估日志处理工作负载的待机数量。本文提供了一种基于 Serverless 的日志处理思路,可以在降低该任务链路成本的同时提高其灵活性。

我们的大体设计是使用 Kafka 服务器作为日志的接收器,之后以输入 Kafka 服务器的日志作为事件,驱动 Serverless 工作负载对日志进行处理。据此的大致步骤为:

  1. 搭建 Kafka 服务器作为 Kubernetes 集群的日志接收器

  2. 部署 OpenFunction 为日志处理工作负载提供 Serverless 能力

  3. 编写日志处理函数,抓取特定的日志生成告警消息

  4. 配置 <b>Notification Manager[1]</b> 将告警发送至 Slack

file

在这个场景中,我们会利用到 <b>OpenFunction[2]</b> 带来的 Serverless 能力。

OpenFunction[3] 是 KubeSphere 社区开源的一个 FaaS(Serverless)项目,旨在让用户专注于他们的业务逻辑,而不必关心底层运行环境和基础设施。该项目当前具备以下关键能力:

  • 支持通过 dockerfile 或 buildpacks 方式构建 OCI 镜像
  • 支持使用 Knative Serving 或 OpenFunctionAsync ( KEDA + Dapr ) 作为 runtime 运行 Serverless 工作负载
  • 自带事件驱动框架

使用 Kafka 作为日志接收器

首先,我们为 KubeSphere 平台开启 <b>logging</b> 组件(可以参考 <b>启用可插拔组件[3]</b> 获取更多信息)。然后我们使用 <b>strimzi-kafka-operator[5]</b> 搭建一个最小化的 Kafka 服务器。

  1. 在 default 命名空间中安装 <b>strimzi-kafka-operator[6]</b> :

     helm repo add strimzi https://strimzi.io/charts/
     helm install kafka-operator -n default strimzi/strimzi-kafka-operator
    
  2. 运行以下命令在 default 命名空间中创建 Kafka 集群和 Kafka Topic,该命令所创建的 Kafka 和 Zookeeper 集群的存储类型为 <b>ephemeral</b>,使用 emptyDir 进行演示。

注意,我们此时创建了一个名为 “logs” 的 topic,后续会用到它

	cat <<EOF | kubectl apply -f -
	apiVersion: kafka.strimzi.io/v1beta2
	kind: Kafka
	metadata:
		name: kafka-logs-receiver
		namespace: default
	spec:
		kafka:
			version: 2.8.0
			replicas: 1
			listeners:
				- name: plain
					port: 9092
					type: internal
					tls: false
				- name: tls
					port: 9093
					type: internal
					tls: true
			config:
				offsets.topic.replication.factor: 1
				transaction.state.log.replication.factor: 1
				transaction.state.log.min.isr: 1
				log.message.format.version: '2.8'
				inter.broker.protocol.version: "2.8"
			storage:
				type: ephemeral
		zookeeper:
			replicas: 1
			storage:
				type: ephemeral
		entityOperator:
			topicOperator: {}
			userOperator: {}
	---
	apiVersion: kafka.strimzi.io/v1beta1
	kind: KafkaTopic
	metadata:
		name: logs
		namespace: default
		labels:
			strimzi.io/cluster: kafka-logs-receiver
	spec:
		partitions: 10
		replicas: 3
		config:
			retention.ms: 7200000
			segment.bytes: 1073741824
	EOF
  1. 运行以下命令查看 Pod 状态,并等待 Kafka 和 Zookeeper 运行并启动。

     $ kubectl get po
     NAME                                                   READY   STATUS        RESTARTS   AGE
     kafka-logs-receiver-entity-operator-568957ff84-nmtlw   3/3     Running       0          8m42s
     kafka-logs-receiver-kafka-0                            1/1     Running       0          9m13s
     kafka-logs-receiver-zookeeper-0                        1/1     Running       0          9m46s
     strimzi-cluster-operator-687fdd6f77-cwmgm     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值