如何使用 K8s 两大利器"审计"和"事件"帮你摆脱运维困境?
概述
下面几个问题,相信广大 K8s 用户在日常集群运维中都曾经遇到过:
- 集群中的某个应用被删除了,谁干的?
- Apiserver 的负载突然变高,大量访问失败,集群中到底发生了什么?
- 集群节点 NotReady,是什么原因导致的?
- 集群的节点发生了自动扩容,是什么触发的?什么时间触发的?
以前,排查这些问题,对客户来说并不容易。生产环境中的 Kubernetes 集群通常是一个相当复杂的系统,底层是各种异构的主机、网络、存储等云基础设施,上层承载着大量的应用负载,中间运行着各种原生(例如:Scheduler、Kubelet)和第三方(例如:各种 Operator)的组件,负责对基础设施和应用进行管理和调度; 此外不同角色的人员频繁地在集群上进行部署应用、添加节点等各种操作。在集群运行的过程中,为了对集群中发生的状况能够尽可能的了如指掌,我们通常会从多个维度对集群进行观测。
日志,作为实现软件可观测性的三大支柱之一,为了解系统运行状况,排查系统故障提供了关键的线索,在运维管理中起着至关重要的作用。Kubernetes 提供了两种原生的日志形式——审计(Audit)和事件(Event),它们分别记录了对于集群资源的访问以及集群中发生的事件信息。从腾讯云容器团队长期运维 K8s 集群的经验来看,审计和事件并不是可有可无的东西,善用它们可以极大的提高集群的可观测性,为运维带来巨大的便利。下面让我们先来简单认识一下它们。
什么是 Kubernetes 审计?
Kubernetes 审计日志是 Kube-apiserver 产生的可配置策略的结构化日志,记录了对 Apiserver 的访问事件。审计日志提供 Metrics 之外的另一种集群观测维度,通过查看、分析审计日志,可以追溯对集群状态的变更;了解集群的运行状况;排查异常;发现集群潜在的安全、性能风险等等。
审计来源
在 Kubernetes 中,所有对集群状态的查询和修改都是通过向 Apiserver 发送请求,对 Apiserver 的请求来源可以分为4类
- 控制面组件,例如 Scheduler,各种 Controller,Apiserver 自身
- 节点上的各种 Agent,例如 Kubelet、Kube-proxy 等
- 集群的其它服务,例如 Coredns、Ingress-controller、各种第三方的 Operator 等
- 外部用户,例如运维人员通过 Kubectl
审计中都记录了些什么?
每一条审计日志都是一个 JSON 格式的结构化记录,包括元数据(metadata)、请求内容(requestObject)和响应内容(responseObject)3个部分。其中元数据一定会存在,请求和响应内容是否存在取决于审计级别。元数据包含了请求的上下文信息,例如谁发起的请求,从哪里发起的,访问的 URI 等等;
审计有什么用?
Apiserver 做为 Kubernetes 集群唯一的资源查询、变更入口,审计日志可以说记录了所有对于集群访问的流水, 通过它可以从宏观和微观了解整个集群的运行状况,比如:
- 资源被删掉了,什么时候删掉的,被“谁”删掉的?
- 服务出现问题,什么时候做过版本变更?
- Apiserver 的响应延时变长,或者出现大量 5XX 响应 Status Code,Apiserver 负载变高,是什么导致的?
- Apiserver 返回 401/403 请求,究竟是证书过期,非法访问,还是 RBAC 配置错误等。
- Apiserver 收到大量来自外网 IP 对敏感资源的访问请求,这种请求是否合理,是否存在安全风险;
什么是Kubernetes事件?
事件(Event)是 Kubernetes 中众多资源对象中的一员,通常用来记录集群内发生的状态变更,大到集群节点异常,小到 Pod 启动、调度成功等等。我们常用的kubectl describe
命令就可以查看相关资源的事件信息。
事件中记录了什么?
- 级别(Type): 目前仅有“Normal”和“Warning”,但是如果需要,可以使用自定义类型。
- 资源类型/对象(Involved Object):事件所涉及的对象,例如 Pod,Deployment,Node 等。
- 事件源(Source):报告此事件的组件;如 Scheduler、Kubelet 等。
- 内容(Reason):当前发生事件的简短描述,一般为枚举值,主要在程序内部使用。
- 详细描述(Message):当前发生事件的详细描述信息。
- 出现次数(Count):事件发生的次数。
事件有什么用?
集群内已经翻江倒海,集群外却风平浪静,这可能是我们日常集群运维中常常遇到的情况,集群内的状况如果无法透过事件来感知,很可能会错过最佳的问题处理时间,待问题扩大,影响到业务时才发现往往已经为时已晚;除了早早发现问题,Event 也是排查问题的最佳帮手,由于 Event 记录了全面的集群状态变更信息,所以大部分的集群问题都可通过 Event 来排查。总结一下 Event 在集群中扮演两大重要角色:
- “吹哨人”:当集群发生异常情况时,用户可通过事件第一时间感知;
- “目击者”:集群中的大小事件都会通过 Event 记录,如果集群中发生意外情况,如:节点状态异常,Pod 重启,都可以通过事件查找发生的时间点及原因;
TKE 如何发掘审计/事件的价值
传统的通过输入查询语句检索日志的方式来使用审计和事件,固然可以提供很高的灵活性,但也有着较高的使用门槛,不仅要求使用者对于日志的数据结构非常了解,还要熟悉 Lucene、SQL 语法。这往往导致使用效率偏低,也无法充分发掘数据的价值。
腾讯云容器服务 TKE 联合腾讯云日志服务CLS,打造出针对 Kubernetes 审计/事件采集、存储、检索、分析的一站式产品级服务, 不仅提供了一键开启/关闭功能,免去一切繁琐的配置;而且容器团队还从长期运维海量集群的经验中,总结出对于 Kubernetes 审计/事件的最佳使用实践,通过可视化的图表,以多个维度对审计日志和集群事件进行呈现,使用者只需了解 K8s 的基本概念,就能很“直觉”地在 TKE 控制台上进行各种检索和分析操作,足以涵盖绝大多数常见集群运维场景, 让无论是发现问题还是定位问题都事半功倍,提升运维效率,真正将审计和事件数据的价值最大化 。
如何使用 TKE 审计/事件服务去排查问题?
场景示例:
下面我们看几个现实中的典型场景
示例1: 排查一个工作负载消失的问题
在审计检索
页面中,单击【K8s 对象操作概览】标签,指定操作类型和资源对象
查询结果如下图所示:
由图可见,是 10001****7138
这个帐号,对应用「nginx」进行了删除。可根据帐号ID在【访问管理】>【用户列表】中找到关于此账号的详细信息。
示例2: 排查一个节点被封锁的问题
在审计检索
页面中,单击【节点操作概览】标签,填写被封锁的节点名
查询结果如下图所示:
由图可见,是10001****7138
这个帐号在2020-1-30T06:22:18
时对172.16.18.13
这台节点进行了封锁操作。
示例3: 排查 Apiserver 响应变慢的问题
在审计检索
的【聚合检索】标签页中,提供了从用户、操作类型、返回状态码等多个维度对于 Apiserver 访问聚合趋势图。
由图可见,用户tke-kube-state-metrics
的访问量远高于其他用户,并且在“操作类型分布趋势”图中可以看出大多数都是 list 操作,在“状态码分布趋势”图中可以看出,状态
码大多数为 403,结合业务日志可知,由于 RBAC 鉴权问题导致tke-kube-state-metrics
组件不停的请求Apiserver重试,导致 Apiserver 访问剧增。日志如下所示:
E1130 06:19:37.368981 1 reflector.go:156] pkg/mod/k8s.io/client-go@v0.0.0-20191109102209-3c0d1af94be5/tools/cache/reflector.go:108: Failed to list *v1.VolumeAttachment: volumeattachments.storage.k8s.io is forbidden: User "system:serviceaccount:kube-system:tke-kube-state-metrics" cannot list resource "volumeattachments" in API group "storage.k8s.io" at the cluster scope
示例4:排查节点异常的问题
一台 Node 节点出现异常,在事件检索
页面,点击【事件总览】,在过滤项中输入异常节点名称
查询结果显示,有一条节点磁盘空间不足
的事件记录查询结果如下图:
进一步查看异常事件趋势
可以发现,2020-11-25
号开始,节点172.16.18.13
由于磁盘空间不足导致节点异常,此后 kubelet 开始尝试驱逐节点上的 pod 以回收节点磁盘空间;
示例5: 查找触发节点扩容的原因
开启了节点池「弹性伸缩」的集群,CA(cluster-autoscler)组件会根据负载状况自动对集群中节点数量进行增减。如果集群中的节点发生了自动扩(缩)容,用户可通过事件检索对整个扩(缩)容过程进行回溯。
在事件检索
页面,点击【全局检索】,输入以下检索命令:
event.source.component : "cluster-autoscaler"
在左侧隐藏字段中选择event.reason
、event.message
、event.involvedObject.name
、event.involvedObject.name
进行显示,将查询结果按照日志时间
倒序排列,结果如下图所示:
通过上图的事件流水,可以看到节点扩容操作在2020-11-25 20:35:45
左右,分别由三个 nginx Pod(nginx-5dbf784b68-tq8rd、nginx-5dbf784b68-fpvbx、nginx-5dbf784b68-v9jv5) 触发,最终扩增了3个节点,后续的扩容由于达到节点池的最大节点数没有再次触发。
总结
本文介绍了在 Kubernetes 中两个经常被忽略的元素--「审计日志」和「集群事件」,并讨论了它们在赋能集群运维和提升系统可观测性方面的价值。腾讯云容器团队在长期运维海量 Kubernetes 集群经验总结的基础上,在 TKE 中发布了基于审计和事件的产品服务,帮助用户能够快速高效解决日常集群运维中遇到的问题,将用户从繁杂的集群问题中解放出来。
最后我们从实战角度出发,通过几个经典问题来演示通过 TKE 审计/事件服务来定位排查问题。由于篇幅有限,我们的演示只是产品功能的冰山一角,更多的功能需要用户去探索使用,最后欢迎用户体验 。(腾讯云日志服务 CLS 对于 TKE 产生的所有审计/事件数据提供免费服务至 2021年6月1日。)
【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!
如何使用 K8s 两大利器"审计"和"事件"帮你摆脱运维困境?的更多相关文章
- 264分析两大利器:264VISA和Elecard StreamEye Tools
学了264有将近3个月有余,好多时候都在学习老毕的书和反复看JM86的代码,最近才找到264分析两大利器:264VISA和Elecard StreamEye Tools.不由得感叹,恨不逢同时. 简单 ...
- Spring Security和 JWT两大利器来打造一个简易的权限系统。
写在前面 关于 Spring Security Web系统的认证和权限模块也算是一个系统的基础设施了,几乎任何的互联网服务都会涉及到这方面的要求.在Java EE领域,成熟的安全框架解决方案一般有 A ...
- 告别set和get,两大利器轻松搞定model转换
场景一:一般我们遇到需要新建model,常规做法就是创建一个类,老老实实的定义好model中的所有属性,一般来说属性对应的set方法和get方法都是少不了的,有时候还需要toString甚至equal ...
- Linux运维人员共用root帐户权限审计(转至马哥Linux运维)
一.应用场景 在中小型企业,公司不同运维人员基本都是以root 账户进行服务器的登陆管理,缺少了账户权限审计制度.不出问题还好, 出了问题,就很难找出源头.这里介绍下,如何利用编译bash 使不同的客 ...
- multi-node和generic-pool两大利器
1.multi-node node只能单进程,单cpu工作,而multi-node则可以让node在多进程下共享内存的工作,实现机制是依靠child_process的sendmsg做到的.想要了解具体 ...
- 转: H264码流分析 --264分析两大利器:264VISA和Elecard StreamEye Tools
转码: http://www.360doc.com/content/13/0225/19/21412_267854467.shtml ESEYE视频工具全称是什么: Elecard StreamEye ...
- .Net 两大利器Newtonsoft.NET和Dapper
你可以使用ado.net返回的DataTable让Newtonsoft.NET来序列化成Json. 当然你可以使用Dapper返回的List让Newtonsoft.NET来序列化成JSON. 参考资料 ...
- 中国IT史上两大严重事故对我们的警醒及预防措施
20190121 一,历史回顾:20150528携程运维大事故 2015年5月28日上午11点开始,携程旅行网官方网站突然显示404错误页,App也无法使用,业务彻底中断. 据称是因为乌云网公布了携程 ...
- 关于k8s这项大动作,预示着边缘计算迎来“开源”发展的新周期……
在文章<最近在边缘计算领域,发生了一件足以载入物联网史册的大事…>我曾经提到Kubernetes(简称K8s)将从超大规模云计算环境,被带入到物联网边缘计算场景中. 事情有了新进展,从本周 ...
随机推荐
- 【译】理解Rust中的闭包
原文标题:Understanding Closures in Rust 原文链接:https://medium.com/swlh/understanding-closures-in-rust-21f2 ...
- tcp 接收被动关闭 fin
void tcp_rcv_established(struct sock *sk, struct sk_buff *skb, const struct tcphdr *th, unsigned int ...
- UNP——第二章,常见协议概述
1.为什么要了解协议 程序员与协议合作,完成应用. 了解协议是为了了解协议完成了什么,提供了什么服务,自己还应该做什么. 2.从协议的角度,套接字是什么 套接字是协议的接口, IP套接字,代表可使用I ...
- 一:JavaWeb
1.javaWeb技术体系 2.HTMl 超文本标记语言 (超文本的意思就是除了可以包含文字之外,还可以包含图片链接音乐视频等...) 2.1 HTML网页的组成 (结构:HTML 表现:CSS 行 ...
- Adaboost算法的一个简单实现——基于《统计学习方法(李航)》第八章
最近阅读了李航的<统计学习方法(第二版)>,对AdaBoost算法进行了学习. 在第八章的8.1.3小节中,举了一个具体的算法计算实例.美中不足的是书上只给出了数值解,这里用代码将它实现一 ...
- EF Core 二 、 入门 EF Core
入门EF Core 我们将开始真正的EF之旅了,这里使用SqlServer数据,然后DbFirst: 为嘛使用SqlServer,目前公司的整体业务全部在SqlSever,所以很多产品业务都是依托于这 ...
- GreenDao增删改查
3.GreenDao增删改查 (1)插入 常用API //这是最简单的插入语句,新增一行数据,返回值为行号 public long insert(T entity) //传递一个数组,新增多行数据 p ...
- 吉他软件Guitar Pro入门
Guitar Pro是一款优秀的吉他学习软件,初学者可以依靠其学习理论知识,也可以通过和弦添加.曲谱导出等功能来提升弹奏能力.今天,小编就给大家简略地介绍下吉他软件Guitar Pro. 乐谱编辑功能 ...
- Camtasia中对给录制的视频添加视觉效果
视频创作和后期剪辑对很多人来说是一件很头痛的事,对着屏幕一段一段.一帧一帧的进行调整会让人十分的心烦,有时花费了大量时间剪出来的视频质量却不高,让人有一种想砸键盘的冲动. 这种问题,除非是原视频素材质 ...
- 在家看电影音效太差?Boom 3D帮你轻松升级
新片上映后,很多人都会选择去电影院观看,一是为了第一时间看到电影,还有一个原因就是电影院的音效往往可以让人身临其境,更好地感受电影的氛围.那如果在家刷片我们该怎么办呢? 我们可以使用Boom 3D这款 ...