概述
当我们将容器的日志收集到消息服务器之后,我们该如何处理这些日志?部署一个专用的日志处理工作负载可能会耗费多余的成本,而当日志体量骤增、骤降时亦难以评估日志处理工作负notification铃声载的待机数量。本文提notification manager for adobe供了wordpress怎么看别人的文章一种基于 Serverless 的日志处理思路,可以在降低该任务链路成本的同时提wordpress怎么看别人的文章高其灵活性。
我们的大体设kubesphere ip变了计是使用 Kafka 服务器作为日志的接收器,之后以输入 Kafgithub是干什么的ka 服务器的日志作为事github件,驱动 Serverless 工作负载对日志进行处理。据此的大致步骤为:
- 搭建 Kafka 服务器作为 Kugithub打不开bernetes 集群的日志kafka和redis区别接收器
- 部署 Opkubesphere安装部署enF青云kubesphereunction 为日志处理工作负载提供 Serverless 能力
- 编写kubesphere安装部署日志处理函数,抓取特定的日志生成告警消息
- 配置 Notification Manager 将告警发送至 Slack
在这个场景中,我们会利用到 OpenFunction 带来的 Serverless 能力。
使用 Kafka 作为日志接收器
首先,我们为 KubeSphere 平台开启 logging 组件(可以参考 启用可插拔组件 获取更多信息)。然后我们使用 strimzi-kafka-operator 搭建一个最小化的 Kafwordpress主题ka 服务器。
-
在 defaulgithub中文社区t 命名wordpress狮子歌歌斯文败类空间中安装 strimzi-kafwordpress建站多少钱ka-operator :
helm repo add strimzi https://strimzi.io/charts/ helm install kafka-operator -n default strimzi/strimzi-kafka-operator
-
运行以下命令在 defaulgithubt 命名空间中创建 Kafka 集群和 KafkaWordPress Topic,该命令所创建的 Kafka 和 Zookeeper 集群的存储类型为 ephemeral,使用 emptwordpress下载yDir 进行演示。
cat <<EOF | kugithub打不开bectl apply -fpush notification - apiVersion: kwordpress建站多少钱afka.strimzi.io/v1beta2 kind: Kafka metadata:notification manager for name: kanotifictionchannelfka-logs-receiver namespace: default spec: kanotification是什么文件夹fka: version: 2.8.0 replicas: 1 listeners: - name: plain port: 9092 type: internal tls: false - name: tls pornotification+managert: 9093 type: internal tls: true config: offsets.tokafka部署pic.replication.factor: 1 transaction.state.log.replication.factor: 1 transaction.state.log.min.isr: 1 log.message.formkafka集群at.verkafka集群sion: '2.8' inter.broker.protocol.version: "2.8" storage: tygithub中文社区pe: ephem青云kubesphereeral zookeeper: rkubesphere开发者社区eplicas: 1 storage: tynotification centerpe: 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: 1073741wordpress建站多少钱824 EOF
-
运行以下命令查看 Pod 状态,并等待 Kafka 和 Zookeeper 运行并启动。
$ kubectl get po Nkubesphere安装部署AME READY STATUS RESTARTS AGwordpress下载E kafka-logs-receiver-entity-operator-568957ff84-nmtlw 3/3 Rungithub下载nwordpress狮子歌歌ing 0 8m42s kafka-logs-receiver-kafka-0 1/1 Running 0 9m13s kafka-logswordpress狮子歌歌-receiver-zookeeper-0 1kafka和redis区别/1 Running 0 9kafka部署m46s strimgithub中文社区zi-cluster-operator-687fdd6f77-cwmgm 1/1 Running 0 11m
运行以下命令查看 Kafka 集群的元数据:
# 启动一个工具 pod $wordpress狮子歌歌斯文败类 kubectl run utils --image=arunvelsriram/utils -i --tty --rm # 查看 Kafka 集群的元数notification center据 $ kafkacat -L -b kafka-logs-receiver-kafka-brokers:notification是什么文件夹9092
我们将这个 Kafka 服务器添加为日志接收器。
-
以 admin 身份登录 KubeSphere 的 Web 控制台。点击左上角的平台管理,然后选择集群管理。
-
在集群管理页面,选择集群设置下的日志收集。
-
点击添加wordpress建站多少钱日志接收器并选择 Kafka。输入 Kafka 代理地址和端口信息,然后点击确定继kubesphere安装部署续。
-
运行以下命令验证 Kafka 集群kubesphere安装部署是否能从 Fluent Bit 接收日志:
# 启动一个工具 pod $ kubepush notificationctnotifictionchannell run utils --imaggithube=arunvelsriram/utils -i --ttygithub下载 --rm # 检查 logs topic 中的日志情况 $ kafkacat -C -b kafka-logs-receivwordpress是啥东西er-kafka-0.kafka-logs-receiver-kafka-brokers.default.svc:9092 -t logskubesphere官网
部署 OpenFunction
按照概述中的设计,我们需要先部署 OpenFunction。OpenFunction 项目引用了很多第三方的项目,如 Knativkafka部署e、Tekton、ShipWright、Dapr、KEDA 等,手动安装较为繁琐,推荐使用 Prerequisites 文档 中的方法,一键部署 OpenFunctiogithub中文社区n 的依赖组件wordpress怎么看别人的文章。
sh hack/dekafka部署ploy.sh --with-shipwright --with-openFuncAsyncnotification center --poor-network
部署 OpenFunction:
kuwordpress下载bectl apply -f httkafka消费的三种模式ps://github.com/Opkafka教程enFunction/OpenFunction/releases/download/v0.3.0/bundlegithub直播平台永久回家.yaml
编写github中文官网网页日志处理函数
我们以 创建并部署 WordPreswordpress怎么看别人的文章s 为例,搭建一个 WordPress 应用作为日志的生产者。该应用的工作负载所在的命名空间为 “demo-project”,Pod 名称为 “wordpress-v1-f54f697c5-hdn2z”。
当请求结果为 404 时,我们收到的日志内容如下:
{"@timestamp":162985github下载6477.226758,"log":"*.*.*.* - - [25/Aug/2021:01:54:36 +0000] \"wordpress是啥东西GET /notfound HTTP/1.1\" 404 49923 \"-\" \"curl/7.58.0\"\n","time":"2021-08-25T01:54:37.226757612Z","kubernetes":{"pod_name":"wordpress-v1-f54f697c5-hdn2z","namespace_name":"demo-project","container_name":"container-nrdsp1","docker_id":"bb7b48e2883be0c05b22c04b1d1573729dd06223ae0b1676e33a4fac655958a5","container_image":"wordpress:4.8-kafka消费的三种模式apstrimziache"}}
我们的需求是:当一个请求结果为 404 时,发送一个告警通知给接收器(可以根据 配置 Slack 通知 配置一个 Slack 告警接收器),并记录命名空间、Pod 名称、请求路径、请求方法等信息。按照这个需求,我们编写一个简单的处理函数:
package logshankafkadler
import (
"encoding/json"
"fmt"
"log"
"regexp"
"time"
ofctx "github.com/OpenFunction/functions-frakafka部署mewnotification+managerork-go/openfunction-context"
alert "github.com/prometheus/alertmanager/templakafka集群te"
)
const (
HTTPCodeNotFound = "404"
Namespace = "demo-projeckafka和redis区别t"
PodName = "wordpress-v1-[A-Za-z0-9]{9}-[A-Za-z0-9]{5}"
AlertNakubesphere官网me =kafka教程 "404 Request"
Severity = "warning"
)
/kafka面试题/ LogsHandler ctx 参数提供了用户函数在集群语境中的上下文句柄,如 ctx.SendTo 用于将数据kubesphere架构发送至指定的目的地
// LogsHandler in 参数用于将输入源中的数据(如有)以 bytegithub打不开s 的方式传递给函数
func LogsHandler(ctx *ofctx.OpenFunctionConnotification manager fortext, in []byte) int {
content := string(in)
// 这里我们设置了三个正则表达式,分别用于匹配 HTkubesphere ip变了TP 返回码、资源命名空间、资源 Ponotificationsd 名称
matkubesphere教程chHTTPCode, _ := regexp.Matckafka教程hString(fmt.Sprintf(" %s ", HTTPCodeNotFowordpress官网入口und), content)
matchNamespace, _ :github怎么下载文件= regexp.MatchString(fmt.Sprintf("namespace_name\":\"%s", Namespkafka消费的三种模式ace), content)
matchPodName := regexp.MustCompile(fmt.Sprintf(`(%s)`, PodName)).FindStringSubmatch(content)
if matchHTTPCode && matchNamespace && matchPodName != nil {
log.Prgithub官网intf("Match log - Content: %s"kubesphere怎么读, content)
// 如果上述三个正则表达式同时命中,那么我们需要提取日志内容中的一些kafka教程信息,用于填充至告警信息中
// 这些信息为:404 请strimzi求的请求方式(HTTP Method)、请求路径(HTTP Path)以及 Pod 名称
match := regexp.MustCompile(strimzi`([A-Z]+) (/\S*) HTTP`).FindStrin青云kubespheregSubmatch(content)
if match ==wordpress下载 nil {
return 500
}
path := match[len(match)-1]
method := magithub开放私库tch[len(match)-2]
podName := matchPodName[len(matchPodName)-1]
// 收集到关键信息后,我们使用 altermanager 的 Data 结构体组装告警信息
notify := &alert.Data{
Recegithub开放私库iver: "notificatiokafkan_manager",
Status: "firing",
Alerts: alert.Alerts{},
GroupLabels: alert.KV{"alertnakubesphere开发者社区me": AlertName, "namespace": Namespace},
CommonLabels: alwordpress官网入口ert.KV{"alertname": AlertName, "namespace": Namespace, "severity": Skafka是干什么的everity},
CommonAngithub中文官网网页notations: alert.KV{},
ExternalURL: "",
}
alt := alert.Anotifictionchannellert{
Status: "firing",
Labels: alert.KV{
"alertname": Akafka和redis区别lertName,
"namespace": Namespace,
"sgithub打不开everity": Severity,
"pod": podName,
"path": path,
"method": method,
},
Annotations: alert.KV{},
StartsAt: time.Now(),
EndsAt: time.Time{},
GenerstrimziatorURLnotification center: "",
Fingerprint: "",
}github打不开
notify.Alerts = appendgithub是干什么的(notify.Alerts, alt)
notifyBytes, _ := jsonwordpress狮子歌歌斯文败类.Marshal(notify)
// 使用 ctnotifictionchannelx.SendTo 将内容发送给名为 "notification-manager" 的输出端(你可以在之后的函数配置github开放私库 logs-handlergithub直播平台永久回家-function.yamgithub永久回家地址l 中找到它notification中文意思的定义)
if err := ctx.SendTo(notnotification manager forifyBytes, "notification-manager"); err != nil {
panic(err)
}
log.Printf("Send log to notification managkubesphere开发者社区er.")
}
return 200
}
我们将这个函数上传到代码仓库中,记录青云kubesphere代码仓库的地址以及代码github中文社区在仓库中的目录路径,在下面的创建函数步骤中我们将使用到这两个值。
创建函数
接下来我们将使用 OpenFunction 构建上述的函数。首先设置一个用于访问镜像仓库的秘钥文notifictionchannel件 push-secret(在wordpress建站教程入门使用代码构建出 OCI 镜像后,OpenFunction 会将该镜像上传到用户的镜像仓库中,用于后续的负载启动):
REGISTRY_SERVER=https://index.docker.io/v1/ REGISTRY_USER=<your username> REGISTRY_PASSWORD=<your password>
kubectkafka消费的三种模式l ckubespherereate secret dogithub中文官网网页cker-registry push-secret \
--docker-server=$REGISTRY_SERVER \
--docker-username=$REGISTRY_USER \
--docker-password=$REGISTRY_PASSWORD
应用函数 lognotification铃声s-handler-wordpress建站多少钱functikafka教程on.yaml:notification center
apiVersion: corwordpress狮子歌歌e.openfunction.io/v1alpha1
kind: Function
metadata:wordpress主题
name: logs-handler
spec:
version: "v1.0.0"
# 这里定义了构建后的镜像的上传路径
image: openfunctiondekubespherev/logskafka部署-async-handler:v1
imageCredentials:
name: push-secret
build:
builder: openfunctiondev/go115-builder:v0.2.0
env:
FUNCwordpress_NAME: "LogsHandwordpressler"
# 这里定义了源wordpress主题代码的路径
# url 为上面提到的代码仓库地址
# sogithub是干什么的urceSugithub中文官网网页bPath 为代码在仓库中的目录路径
srcRepo:
url: "https://github.com/OpenFunction/samples.git"
sourceSubPath: "funcnotification铃声tiokubespherens/OpenFuncAsync/logs-handler-function/"
serving:
# OpenFuncAsync 是 OpenFunction 通过 KEDA+Dkubesphere架构apr 实现的一种由事件驱动的异步函数运行时
runtime: "OpenFuncAsync"
openFuncAsync:
# 此处定义了函数的输入(kafka-receiver)和输出(notification-makafkanager)WordPress,与下面wordpress怎么看别人的文章 components 中的定义对应关联
dapr:
inputs:
- name: kafka-receiver
type: bindings
outputs:
- nwordpress狮子歌歌ame: notification-manager
type: bindings
params:
operation: "post"
type: "bindings"
annotations:
dapr.io/log-level: "debug"
# 这里完成了notification manager for上述输入端和输出端的具体定义(即 Dapr Components)
components:
- name: kafka-receiver
type: bindings.kafka
versiowordpress狮子歌歌n: v1
metagithub打不开data:
- name: brokers
value: "kafka-logs-receiver-kafka-brokers:9092"
- name: authRequired
value: "false"
- name: publishTwordpress怎么看别人的文章opic
value: "logs"
- name: topics
value: "kubesphere ip变了logs"
- name: consumerGroup
value: "logs-handler"
# 此处为 KubeSphere 的 notification-kubesphere教程manager 地址
- name: notification-github打不开manager
type: bindings.http
version: v1
metadata:
- name: url
value: http://notification-mkafka面试题anager-svc.kubesphere-monitoring-system.svc.cluster.local:1wordpress怎么看别人的文章9093/api/v2/alerts
keda:
scwordpress是啥东西aledObject:
pollingInterval: 15
minReplicaCount: 0
maxReplicaCount: 10
cooldgithub永久回家地址ownPeriod: 30
# 这里定义了函数的触发器wordpress官网入口,即 Kafka 服务器的 “logs” topic
# 同时定义了消息堆积阈值(此处为 10),即当消息堆积量超过 10,logs-handler 实例个数就会自动扩展
triggers:
- type: kafka
mnotification中文意思etadata:
topic: lokafka是干什么的gs
bootstrapServers: kafka-logs-receiver-kafka-brokers.default.svc.cluster.local:9092
consumerGroup: logs-handler
lagThreshold: "10"push notification
结果演示
我们先关闭 Kawordpress建站教程入门fka 日志接收器:在日志收集页面,点击进入 Kafka 日志接收器详情页面,然后点击更多操作并选择更改状态,将其设置为关闭。
停用后一段时间,我们可以观察到 logs-handler 函数实例已经收缩到 0 了。
再将 Kafka 日志接收器激活,wordpress怎么看别人的文章logs-handler 随之启动。
~# kubectl get po --watch
NAME READYWordPress STATUS RESTARTS AGE
kafka-logs-receivernotifications-entity-operator-568957ff84-tdrrx 3/3 Runningkubesphere官网 0 7m27s
kafka-logs-recewordpress狮子歌歌斯文败类iver-kafka-0 1/1 Running 0 7m48s
kafkwordpress狮子歌歌斯文败类a-logs-receiver-zookgithub中文社区eeper-0 1/1 Running 0 8m12s
logs-handlewordpress建站多少钱r-serving-kpngc-v100-zcj4q-5f4kubesphere教程6996f8c-b9d6f 2/2 Terminating 0 34s
strimzi-cluster-operator-687fdd6f77-kc8cv 1/1 Running 0 10m
logs-handler-serviwordpress建站多少钱ng-kpngc-v1wordpress主题00-zcj4q-5f46996f8c-b9d6f 2/2 Terminating 0 36s
lnotificationsogs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-b9d6f 0/2 Termkubesphere架构inating 0 37s
logs-handlewordpress建站教程入门r-serving-kpngc-v100-zcj4q-5github直播平台永久回家f46996f8c-b9d6f 0/2 Terminatwordpress是啥东西ing 0 38s
logs-handlekubesphere开发者社区r-sergithub怎么下载文件ving-kpngc-v100-zcj4q-5f46996f8c-b9d6f 0/2 Terminating 0 38s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-9kj2c 0/2 Pendingithub直播平台永久回家g 0 0s
lokubesphere开发者社区gs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-9kj2c 0/2 Pending 0 0s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-9kj2c 0/2 ContainerCreating 0 0s
logs-hkafka部署andler-serving-kpngc-v100-zcj4q-5f46996fwordpress狮子歌歌斯文败类8c-9knotification铃声j2c 0/2 ContainerCreating 0 2s
logs-handler-serving-kpngc-v100-zcj4q-5f46996fwordpress下载8c-9kj2c 1/2 Running 0 4s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-9kubesphere ip变了kj2c 2/2 Running 0 11s
接着我们向 WordPresswordpress下载 应用一个不存在的路径发起请求:
curl http://<wp-svc-address>/notfounotification manager for adobend
可以看到 Slack 中已经收到了这条消息(与之kubesphere对比的是,当我们正常访问该 WordPress 站点时, Slack 中并不会收到告警消息):
进一步探索
-
同步函数的解决方案
除了直接由 Kafka 服务器驱动函数运作(异步方式),Opgithub怎么下载文件enFunction 还支持使用自带的事件框架对接 Kafka 服务器,之后以 Sink 的方式驱动 Knative 函数运作。可以参考 OpenFunction Samples 中的案例。
在该方案中,同步函数的处理速度较之notifictionchannel异步函数有所notification+manager降低,当然我们同样可以借助 KEDA 来触发 Knative Serving 的 concurrency 机制,但总体而言缺乏异步函数的便捷性。(后wordpress建站多少钱续的阶段中我们会优化 OpenFunction 的事件框架来解决同步函数kafka消费的三种模式这方面的缺陷)
由此可见,不同类型的 Serverless 函数有wordpress是啥东西其擅长的任务场景,notification center如一个有序的控制流函数就需要由kafka是什么同步函数而非异步函数来处理。
综述
Serverless 带来了我们所期望的对业务场景快速拆解重构的能力。
如本案例所示,OpenFunction 不但以 Serverless 的方式提升了日志处理、告警通知链路的灵活度,还通过函数框架将通常对接 Kafka 时复杂的配置步骤简化为语义明确的代码逻辑。同时,我们也在不断演进 OpenFunctiokafka部署n,将在之后版本中实现由自身的 Serverless 能力驱动自身的组件运作。
发表评论