从日志入手,保障 Kubernetes 稳定性

作者 | 悟鹏、沉醉

来源 | 阿里巴巴云原生

头图 | 下载于视觉中国

不论对于软件的用户还是开发者,日志都是很重要的信息源。日志可以用来表征软件的运行状态,在软件运行不符合预期时提供丰富的信息,也可以用在开发阶段调试软件,方便定位问题。

软件的生命周期涉及到开发运行两个阶段,日志的生成是在软件的开发阶段,日志的使用集中在软件的运行阶段。

在开发阶段规范化日志,有助于运行阶段通过标准化方法分析日志、配置日志监控和告警。

在运行阶段通过标准化方法使用日志,有助于低成本把握程序的运行态行为,及时感知异常,促进开发阶段的迭代效率。

在软件的生命周期中,运行阶段时长占比会远大于开发阶段,即对日志的使用时长会远大于开发阶段写日志逻辑的时长。在开发阶段应用良好的日志规范,会对软件生命周期的正常运行和快速迭代带来很大帮助:

复杂度分析

程序中的元素可以抽象为两部分:自身逻辑,依赖。两类元素之间的交互为:自身逻辑闭环,自身逻辑与依赖交互。

从长期角度来看,交互环节出问题的概率会比自身逻辑出问题的概率高,因此要重点关注交互环节的日志逻辑。

同时,对日志的管理需要意识到 谁会使用这些日志,通常有 4 类角色:

  • 用户

  • 维护者

  • 安全人员

  • 审计人员

用户从黑盒角度使用软件,通过日志了解软件当前的运行状态,关注重点是软件正常的状态。

维护者从白盒角度使用软件,开发角色通过日志调试软件,SRE 角色通过日志及时感知软件的异常状态,并通过日志上下文分析异常原因。

安全人员通过分析日志,了解恶意登录、异常删除等风险。

审计人员通过审计日志、应用日志,确认业务、架构的合规性。

根据上述不同的使用场景,我们可以梳理出几类日志类别,进一步增强开发和运行阶段对日志的理解:

类别

语义

应用日志

应用白盒层面的信息,用来理解应用内部状态变化

审计日志

应用黑盒层面的信息,用来理解应用服务状态

开发阶段

1. 最佳实践

理解了日志使用者关注的重点后,开发阶段写日志时,推荐使用如下最佳实践:

  • 使用 structured logs

    • 不使用 format strings

  • 使用 info 和 error 表征日志级别

    • info 又可细化为多个级别:0~10,信息的重要性依次降低 (也可以参考《Kubernetes: sig-instrumentation/logging.md》)

      • 0:用户想要看到的信息

      • 1:维护者关注的白盒行为信息

      • 10:维护者调试用的信息

  • 使用具有过滤器能力的 log lib,通过 logger 自动过滤敏感信息

    • 参见《KEP: Kubernetes system components logs sanitization》

  • 日志通过 stdout/stderr 输出,关闭不必要的文本日志

    • 避免额外的磁盘占用、IO 消耗、日志清理任务的维护等

对于 golang,可以考虑使用klog 作为 logger 实现。

2. FAQ

1)为什么使用 structured logs?

structured logs 是一种结构化的日志格式,结构如下,其中 msg 表征通用的事件,多对的 k=v 用来具化事件:

msg k=v k=v ... k=v

示例:

"Pod status updated" pod="kube-system/kubedns" status="ready"

对于开发阶段,structured logs 通过固化的结构和字段语义,协助开发者思考程序逻辑状态,有助于进一步控制程序复杂度和理解程序逻辑。

对于运行阶段,structured logs 中的 k 天然具备索引的属性,便于进行查询和分析。也可以考虑将 msg 规范化,增加事件语义,通过限制 msg 语义来增强 msg 的作用。

2)为什么不使用 debug/warning/critical/fatal?

通过减少日志类型,降低使用和维护负担。

debug 可以融入到 info 级别。

warning/critical 对于用户和维护者都是模糊的词,对于要采取的行动通常不具备指导意义。warning/critical 和 error 类似,表征程序运行过程中出现了预期外的现象,此时程序要么自动处理,要么交由外部人工介入判断。若由程序自动处理,那么用户和维护者感知到这类现象即可,info 可以满足。若需要交由外部人工介入,那么 error 就可以满足。对于问题的严重性,可放在运行阶段,通过异常具体的信息来表征,如 ServiceUnavailable、Unauthorized 等。

fatal 是将 error 和 panic 两类逻辑封装了起来,在开发过程中可能会带来执行逻辑上的不清晰,如决定是否 panic 的逻辑需要放在最顶层逻辑中,若在顶层逻辑之下调用 fatal,可能会带来资源泄露、程序运行复杂度增加等问题。

3)为什么不使用 format strings?

format strings 是形如如下的结构:

klog.V(4).Infof("Got a Retry-After %ds response for attempt %d to %v", seconds, retries, url)

这种结构将通用事件具体内容耦合在一起,不利于开发阶段降低理解程序逻辑的成本,也不便于使用阶段通过标准化的方式进行查询、分析,增加日志的使用成本。

一种改善方式:

klog.V(4).InfoS("got a retry-after response when requesting url", "attempt", retries, "after seconds", seconds, "url", url)

4)为什么要使用具有过滤器能力的 log lib?

开发过程中,可能会由于疏忽而将敏感信息输出到日志中,如密码、token 等信息。为了避免敏感信息泄露,需要加强 code review,同时也可以考虑在 logger 中配置过滤器,自动进行敏感信息的过滤,参见《KEP: Kubernetes system components logs sanitization》。

对于 golang,可以考虑使用klog 作为 logger 实现,并配合Kubernetes/component-base: sanitization 进行使用。

运行阶段

1. 最佳实践

运行阶段是对日志的使用,包括如下 4 个阶段:

  • 采集

  • 查询

  • 分析

  • 告警

由于日志服务对程序的运行以及后续的运营极为重要,建议采用托管型的日志产品来满足运行阶段对日志的使用需求,如阿里云的 SLS 产品。

若在多个 region 部署集群,且集群的组件相同,在使用日志产品时,需要确保每个 region 中日志项目名称规则的一致性。以阿里云 SLS 产品为例,若需要分别收集多个 region 的日志,则 project、logstore 的名称需要在多个 region 中保持相同的规则,目的是便于通过统一的方法对不同集群的日志做查询和分析。

通常情况下,日志产品会提供上述 4 个阶段的服务,具体的使用方法可以参见对应日志产品的文档,下述针对告警做重点分析。

告警

告警要满足如下目标:

  • 覆盖面全

  • 关键告警及时感知

基于开发阶段的日志规范,可对 error 级别的告警做统一告警,将告警信息统一到低优先级的通知渠道,如表征普通告警的钉钉群。

若要及时感知到关键告警,需要从如下 2 个方面入手:

  • 定义「关键告警」特征

  • 分级告警,与相应的通知渠道结合

定义「关键告警」的特征是个长期、持续完善的过程,有 通用关键告警 和 业务关键告警。

通用关键告警 与业务耦合度小,如机器级别的关键告警 (宕机、内存压力大、load 过高等)、托管服务的关键告警 (master 组件 panic/OOM、master 组件内存压力大等),这部分告警配置可以作为基础服务,作为集群交付的一部分。

业务关键告警 与业务耦合度大,需要与业务长期维护,重点关注「业务交互环节」的告警。

通知渠道通常会有如下几类:

  • IM 群 (如钉钉群等)

  • 短信

  • 电话

  • webhook

这些通知渠道对人触达的及时性不同,电话触达性最好,短信其次,然后是 IM 群。webhook 本质上是条通道,可以对接不同的 IM 群或短信、电话渠道。

推荐如下三种告警级别:

告警级别

语义

通知渠道

一级

立即处理

一级告警 IM 群、短信、电话

二级

需要重点关注,但不用立即处理

二级告警 IM 群、短信

三级

通用异常,用来尽可能覆盖异常、帮助进行告警溯源

三级告警 IM 群

配置告警是个长期、不断迭代的过程,为了有助于告警有效性的迭代,配置每条告警时,可以考虑使用如下表格,规范化每条告警的配置,并深入思考告警配置的有效性:

关键问题

分析

备注

集群级别?



组件级别?



异常信息源?



精确异常 特征?



模糊异常 特征?



爆炸半径?



告警级别?



已覆盖的范围 (集群/组件)?



2. FAQ

如何预先配置未模拟出的异常?

业务依赖的 OpenAPI/SDK/Lib 等通常都会有错误码列表,如阿里云:API 错误中心、Lib 中的 errors 文件等。可以基于该已知信息,枚举依赖的 OpenAPI / SDK 中对业务有明显负面影响的状态码做分级告警,如 ServiceUnavailable / Forbbiden / Unauthorized 等。

参考链接:

  • klog

  • logr

  • blog: Lets talk about logging

  • 阿里云 SLS 产品官网

  • 阿里云:API 错误中心

  • Kubernetes: sig-instrumentation/logging.md

  • KEP: Kubernetes system components logs sanitization

  • Kubernetes/enhancements: Kubernetes system components logs sanitization #1753

  • Kubernetes: component-base


CSDN协同行业大佬
打造13长热门知识图谱及IT成长路线
助力千万IT人成长,快速实现职场进阶!
更多精彩推荐
☞经典永不过时!重温设计模式☞PassMark 更新排行,苹果 M1 杀疯了☞干货!Redis集群工作原理解析
点分享点收藏点点赞点在看

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

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

相关文章

抖音实战~我关注的博主列表、关注、取关

文章目录一、关注模块1. 关注流程图2. 关注流程简述二、前端关注相关2.1. 查询我关注博主列表2.2. 取消关注2.2. 关注我2.4. 上滑分页粉丝列表2.5. 状态刷新三、后端关注相关3.1. 查询我关注的博主列表3.2. 取关3.3. 关注一、关注模块 1. 关注流程图 暂未上,敬请期…

灵魂拷问,上 Kubernetes 有什么业务价值?

上 Kubernetes 有什么业务价值? 今天要演讲的主题是跟应用管理或者说是云原生应用交付是相关的。首先我们想要先回答这么一个问题:为什么我们要基于 Kubernetes 去构建一个应用管理平台? 上图是一个本质的问题,我们在落地 K8s 经…

近7万新冠域名一半是钓鱼网站?以色列老牌安全厂商Check Point推出全端保护新战略

编辑 | 宋 慧 出品 | CSDN云计算 头图 | 付费下载于视觉中国 疫情肆虐的2020注定会被长久铭记。在这一年中,人们的工作、生活方式发生了巨变。在以色列老牌安全厂商Check Point全球进行的调查中显示,87%的工作人口采用了居家办公模式,74%的企…

掌门教育微服务体系Solar第3弹:Nacos企业级落地下篇

前言 在高速发展的时候,公司规模越来越大,老师人数越来越多,这时候公司不能铺太多人去做运营与服务,必须提高每个人效,这就需要技术驱动。因此掌门教育转变成一家技术驱动型的公司,如果被迫成为一家靠资金驱…

jdk 1.8 安装

步骤 B:配置 JAVA_HOME 系统变量区域,点击【新建】,在弹出的窗口中,分别输入变量名和值 变量名:JAVA_HOME 变量值:你的安装路径 JAVA_HOMEpath %JAVA_HOME%\bin步骤 C:配置 Path Path环境变量…

【漫画】最近,老王又双叒get了CDN的新技能—可编程化敏捷开发

原文链接 本文为阿里云原创内容,未经允许不得转载。

抖音实战~点赞数量弹框

组件 在components下面新建ge-popup.vue <template><view><view class"mask"></view><!--绑定微信--><view class"wxbox"><view class"weixin"><image src"../static/dz.jpg"></…

阿里张磊:如何构建以应用为中心的“Kubernetes”?(内含 QA 整理)

如何构建“以应用为中心”的 Kubernetes&#xff1f; 构建这么一个以用户为中心的 Kubernetes&#xff0c;需要做几个层级的事情。 应用层驱动 首先来看最核心的部分&#xff0c;上图中蓝色部分&#xff0c;也就是 Kubernetes。可以在 Kubernetes 之上定义一组 CRD 和 Contro…

Trie 树是什么样的数据结构?有哪些应用场景?

作者 | 神奕来源 | 前端应届生头图 | 下载于视觉中国出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;在计算机科学中&#xff0c;trie&#xff0c;又称前缀树或字典树&#xff0c;是一种有序树&#xff0c;用于保存关联数组&#xff0c;其中的键通常是字符串…

iOS Abort问题系统性解决方案

一、背景 崩溃(Crash)&#xff0c;即闪退&#xff0c;多指移动设备&#xff08;如iOS、Android设备&#xff09;在打开/使用应用程序的过程中&#xff0c;突然出现意外退出/中断的情况。如果App线上版本频繁发生崩溃&#xff0c;会极大地影响用户体验&#xff0c;甚至导致用户…

uniapp 处理过去时间对比现在时间的时间差 如刚刚、几分钟前,几小时前,几个月前

文章目录1. 返回的报文2. 时间格式化方法3. 使用1. 返回的报文 格式化时间&#xff1a;createTime [{"id": "62c11d3435b7c4007a8e650e","fromUserId": "21100598TZ9XG6RP","fromNickname": "小美女","fro…

云原生全景图之五:应用程序定义和开发层

作者 | Catherine Paganini、Jason Morgan来源 | K8sMeetup头图 | 下载于视觉中国前文介绍了如何将所有应用程序组件作为整体来编排和管理&#xff08;编排和管理层&#xff09;。本文将介绍云原生全景图的最上层&#xff1a;应用程序定义和开发层。现在我们来到了云原生全景图…

Flink 1.11 SQL 十余项革新大揭秘,哪些演变在便捷你的使用体验?

简介&#xff1a; SQL 作为 Flink 中公认的核心模块之一&#xff0c;对推动 Flink 流批一体功能的完善至关重要。在 1.11 中&#xff0c;Flink SQL 也进行了大量的增强与完善&#xff0c;开发大功能 10 余项&#xff0c;不仅扩大了应用场景&#xff0c;还简化了流程&#xff0c…

uniapp 小于1000 按原数字显示 超过1000 数字换算成10w+ 1.3k+ 显示

文章目录1. 公共方法2. 使用1. 公共方法 methods: {// 数字换算graceNumber(number) {if (number 0) {return "0";} else if (number > 999 && number < 9999) {return (number / 1000).toFixed(1) k;} else if (number > 9999 && numbe…

我们为什么要做 SoloPi

SoloPi现状 去年&#xff08;2019年&#xff09;7月份&#xff0c;蚂蚁集团正式对外开源了客户端自动化测试工具 SoloPi &#xff0c;其主要包括三大模块&#xff1a;录制回放&#xff08;用于功能测试&#xff09;、性能工具&#xff08;用于性能测试&#xff09;以及一机多控…

华为发布2020年年报:收入8914亿元,华为云增速最高达168%

今天&#xff0c;华为发布了2020年度报告。2020年&#xff0c;华为实现销售收入8914亿元人民币&#xff0c;同比增长3.8%&#xff1b;净利润646亿元人民币&#xff0c;同比增长3.2%。其中&#xff0c;企业业务收入同比增长23%至1003亿元人民币。华为轮值董事长胡厚崑在年报发布…

从单体到混乱的微服务,阿里云托管式服务网格是如何诞生的?

作者 | 王夕宁 阿里巴巴高级技术专家 参与阿里巴巴云原生文末留言互动&#xff0c;即有机会获得赠书福利&#xff01; 在服务网格技术使用之前&#xff0c;为了更快更灵活地进行业务创新, 我们常常会把现有应用进行现代化改造, 把单体应用程序分拆为分布式的微服务架构。通常…

MongoDB数据日期显示相差8小时 原因和解决方案

文章目录一、透过现象看本质1. 背景调研2. 原因分析3. 影响评估二、解决方案2.1. 客户端显示问题2.2. 查询数据不正确2.3. 效果验证一、透过现象看本质 1. 背景调研 最近因为项目需要使用到了MongoDB&#xff0c;使用Navicat Premium 15 客户端可视化工具查询数据&#xff0c…

Kubernetes 和 Docker,到底什么关系?

来源 | 无敌码农责编 | 寇雪芹头图 | 下载于视觉中国作为一名容器时代的程序员相信你已经或多或少接触过Docker&#xff0c;但同时你也会发现Docker虽然流行了多年&#xff0c;但之前却很少有公司直接将线上应用通过Docker容器进行大规模地部署。但最近三年&#xff0c;你会发现…

SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(优雅上下线)

前言 上篇我们讲的是发布回滚过程&#xff0c;尤其是在 Kubernetes 的回滚过程中&#xff0c;原生有提供 Rollout 到上一个版本的能力&#xff0c;能保证我们在发布过程中遇到问题时快速回退的能力。然而在每一次上线的过程中&#xff0c;我们最难处理的就是正在运行中的流量&…