前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >K8s 服务异常排障过程全解密

K8s 服务异常排障过程全解密

原创
作者头像
iginkgo18
发布于 2023-06-02 16:03:41
发布于 2023-06-02 16:03:41
7460
举报
文章被收录于专栏:devops_k8sdevops_k8s

1 简介

Kubernetes(K8s)是一个用于大规模运行分布式应用和服务的开源容器编排平台。K8s 让应用发布更加快速安全,让应用部署也更加灵活,但在带来这些便利性的同时,也给应用排障增加了 K8s 平台层面的复杂度,本篇文章将以常见的服务异常入手,来详细拆解 K8s 服务访问方式,以及如何利用现有的可观测体系来对 k8s 平台和应用服务进行快速排障。

2 服务的访问方式

开启 K8s 服务异常排障过程前,须对 K8s 服务的访问路径有一个全面的了解,下面我们先介绍目前常用的 K8s 服务访问方式(不同云原生平台实现方式可能基于部署方案、性能优化等情况会存在一些差异,但是如要运维 K8s 服务,则需要在一开始就对访问方式有一个了解)。

2.1 方式一: 集群内客户端通过 Cluster IP访问集群内服务

从访问逻辑拓扑来分析,集群内客户端 POD 访问的是集群内服务的 svc_name,然后在 svc 层进行 DNAT,将请求转发到对应的后端 POD。这个过程对应的访问实现拓扑则要复杂不少:

  • step 1: client_pod 根据 DNS 配置,请求 DNS 服务器解析 svc_name,DNS 服务器会返回 svc_name 对应的 ClusterIP
  • step 2: client_pod 请求 ClusterIP,Node 根据 kube-proxy 配置的 IPVS/IPTABLES 完成 DNAT
  • step 3: 根据 DNAT 的结果,Node 将请求转发给对应的 server_pod,server_pod 可能与 client_pod 在同一个 Node,也可能在不同 Node,此差异主要体现在网络转发层面

2.2 方式二: 集群外通过 NodePort 访问集群内服务

相比方式一,访问逻辑拓扑上 client 访问的区别是从 svc_name 替换为 nodeip:port。访问实现拓扑主要过程如下:

  • step 1: client 直接请求 svc 对外暴露的 nodeip:port,如果是 LoadBalance 类型的服务,在此之前还会访问 LB(因为并不是 K8s 服务的中的特别能力,所以此处并无特别说明),请求转发到对应的 Node 上,Node 也会根据kube-proxy 配置的 IPVS/IPTABLES 完成 DNAT
  • step 2: 与方式一的 step 3 一致

2.3 方式三: 集群外通过 ingress 访问集群内服务

方式三相比前两种方式,引入了 Ingress 的概念,因此复杂度增加了非常多。访问逻辑拓扑中外部 client 可以直接请求 url 而不是 ip 了,请求 url 会先到达 Ingress,由 Ingress 完成反向代理,转发给后端的 svc,svc 再完成 DNAT 转发给后端 POD。访问实现拓扑会根据 ingress-controller 部署形式不同而有差异,ingress-controller hostnetwork 部署下文简称部署模式一,ingress-controller hostnetwork 部署下文简称部署模式二

  • step 1:外部 client 请求 DNS 服务器解析 url 的域名,DNS 服务会返回 ingress-controller 服务所在的 IP (如果前面有挂 LB,则访问的是 LB 的 IP,否则返回的是 ingress-controller 服务的 nodeip:port)
  • step 2:此时部署模式一,则需要按方式二访问 ingress-controller(为避免画图过于复杂,未画出 ingress_controller_pod 分布在不同 Node 场景);部署模式二,请求到达 Node 后,则直接转给 ingress_controller_pod
  • step 3:此为部署模式一特有的步骤,参考方式二
  • step 4/5/6:请求经过 ingress_controller_pod 后,已经确定需要转发的后端 svc,则按方式一进行转发即可(为避免画图过于复杂,未画出 server_pod 分布在同 Node 场景)

3 服务异常的排障思路

了解服务的访问方式后,在遇到服务异常时,基于一套整体的排障思路来开展工作,更能事半功倍,接下来详细聊聊如何进行排障。

3.1 step1: 确定 Node/Pod 是否异常

首先我们可以通过 Prometheus 提供的 Dashboard 来检查部署的实例的基础状态,通过直接查看应用的 CPU/内存/带宽等指标,确认目前部署实例的负载都在正常范围内。

Node
Node
Pod
Pod

3.2 step2: 确定后端服务是否异常

然后我们可以通过 DeepFlow 提供的 Dashboard 查看后端服务的黄金指标:请求、异常、时延,以快速判断目前的服务是否在正常运行。

后端服务
后端服务

3.3 step3: 确定 DNS 是否异常

从前面服务的访问方式一节可知,仅方式一/方式三的访问过程经过 DNS 服务,因此只有这两种场景才需要检查 DNS 服务是否异常,方式一和三都需要检查集群内的 DNS 服务是否异常,方式三相比方式一还需要检查 client 访问的集群外的 DNS 服务是否异常。对于 CoreDNS 本身,我们可以使用 Prometheus 提供的 Dashboard 来进行排障,对于排查应用服务访问 DNS 异常,我们可以使用 DeepFlow 提供的 Dashboard 查看 DNS 服务的请求、异常、时延指标。

如 DNS 服务无异常,则可直接用 ClusterIP 访问服务,如果能正常访问,那可以确定是 DNS 的问题,并且这个问题很大可能就是配置错误。

3.4 step4: 确定 SVC 是否异常

因为 SVC 的功能实际是 kube-proxy 同步配置到 IPVS/IPTABLES 来实现的,所以我们可以参考 step 1 的排查步骤,把 kube-proxy 视作应用 POD,通过 Prometheus 提供的 Dashboard 查看 kube-proxy 是否正常。

如果能确定应用服务运行正常,可以尝试直接访问后端 POD,如果能正常访问,则可以继续分析 SVC 问题,很大可能是 IPVS/IPTABLES 配置错误。

3.5 step5 确定 ingress 是否异常

服务访问方式中方式三的场景下,如果需要检查 Ingress 的状态,可以查看基于 ingress-controller 服务的状态/负载/请求日志等构建的 Dashboard。这一类 Dashboard 除了 Prometheus/DeepFlow 有提供之外,各个 API 网关的厂商也有提供,可以用 DeepFlow + 厂商提供的 Dashboard 结合进行分析,厂商会更关注网关本身的分析,DeepFlow 则更关注全链路分析,快速定位问题点。

3.6 step6: 追踪访问路径异常点

上述排障过程,都是独立的一个个点检查,如果都没问题,则可以去追踪报障的某一次访问路径是否有异常。如果能直接定位访问路径,确认问题点就会变得更简单。比如我们发现访问路径如果存在断路,则分析断路位置即可;如果追踪的是时延高的问题,则分析追踪到的每一段路径的时延即可。访问路径需要能覆盖从应用->系统->网络各个层面,目前提供这样全链路追踪能力的组件不多,可以使用 DeepFlow 等自动化的分布式追踪能力来进行排查。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊k8s服务发现的优缺点
这里有张spring cloud与kubernetes的对比,如果将微服务部署到kubernetes上面,二者有不少功能是重复的,可否精简。 这里主要是讲述一下如果不使用独立的服务发现,而是使用k8s的服务发现的优缺点
code4it
2024/03/27
2440
聊聊k8s服务发现的优缺点
二进制安装k8s集群(1)-开篇
本篇文章是一个系列,介绍如何用binary的方式手动安装k8s集群,目的是来更好的理解学习k8s。以学习和理解为目的,所以这里的每个组件都是一步一步手动来安装,以便有实践和理解。对于生产环境,如果host在自己的data center里,那么请专业的infrastructure架构师和devops团队来搭建生产级别的集群。如果是在公有云(AWS/GCP/Azure/阿里云/腾讯云)上搭建生产环境,请仔细阅读相关文档,不清楚的问题及时提交工单。
TA码字
2020/04/01
1.1K0
聊聊k8s服务发现的优缺点
这里有张spring cloud与kubernetes的对比,如果将微服务部署到kubernetes上面,二者有不少功能是重复的,可否精简。 这里主要是讲述一下如果不使用独立的服务发现,而是使用k8s的服务发现的优缺点
code4it
2024/03/26
1900
【K8S 系列】k8s 学习一,Kubernetes 基本介绍及核心组件
kubernetes github:https://github.com/kubernetes/kubernetes
阿兵云原生
2023/02/16
4840
K8s的Service详解
● 在kubernetes中,Pod是应用程序的载体,我们可以通过Pod的IP来访问应用程序,但是Pod的IP地址不是固定的,这就意味着不方便直接采用Pod的IP对服务进行访问。
大忽悠爱学习
2022/09/28
1.3K0
K8s的Service详解
一文读懂k8s service工作原理
Kubernetes Service是Kubernetes的核心组件之一,它负责在集群中为应用程序提供稳定的服务发现和负载均衡功能。
通信行业搬砖工
2023/09/06
6860
一文读懂k8s service工作原理
K8S原来如此简单(四)Service+Ingress
上一篇我们通过deployment实现了pod的横向扩展,但是仍然不能负载,也不能对外提供服务,现在我们来看看如何通过k8s实现负载与外网访问
Chester Chen
2022/08/18
4610
K8S原来如此简单(四)Service+Ingress
k8s必学必会知识梳理
对外暴露了Kubernetes API。它是的 Kubernetes 核心控制层。它被设计为水平扩展,即通过部署更多实例来横向扩展。API Server 负责和 etcd 交互(其他组件不会直接操作 etcd,只有 API Server 这么做),是整个 kubernetes 集群的数据中心,所有的交互都是以 API Server 为核心的。API Server 提供了以下的功能:
我的小碗汤
2019/07/30
2K0
K8s网络模型
k8s网络模型设计基础原则:每个Pod都拥有一个独立的 IP地址,而且 假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中 。 所以不管它们是否运行在同 一 个 Node (宿主机)中,都要求它们可以直接通过对方的 IP 进行访问。设计这个原则的原因 是,用户不需要额外考虑如何建立 Pod 之间的连接,也不需要考虑将容器端口映射到主机端口等问题。
加多
2019/04/18
3.6K2
K8s网络模型
你知道K8S暴露服务的方式有哪些吗?
Kubernetes支持多种将外部流量引入集群的方法。ClusterIP、NodePort和Ingress是三种广泛使用的资源,它们都在路由流量中发挥作用。每一个都允许您使用一组独特的功能和折衷方案来公开服务。
KevinYan
2021/09/24
2.5K0
k8s实践(12)--K8s service服务详解
Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结束。 通过 ReplicationController 能够动态地创建和销毁 Pod(例如,需要进行扩缩容,或者执行)。 每个 滚动升级 Pod 都会获取它自己的 IP 地址,即使这些 IP 地址不总是稳定可依赖的。 这会导致一个问题:在 Kubernetes 集群中,如果一组 Pod(称为 backend)为其它 Pod (称为 frontend)提供服务,那么那些 frontend 该如何发现,并连接到这组 Pod 中的哪些 backend 呢?
黄规速
2022/04/14
8.9K0
k8s实践(12)--K8s service服务详解
k8s实践(1)--k8s集群入门介绍和基础原理
1、简单了解集群的工作原理和基础概念,名词解释。 2、安装etcd集群:etcd分布式键值存储系统,用于保持集群状态,比如Pod、Service等对象信息。 3、安装k8s集群,简单了解集群的如何工作。 4、搭建集群网络:基础网络搞好,后面才能顺利部署各种资源。 5、学习k8s的安全、Secrets,ssl认证。如果安全认证没有搞好,创建pod和service都会报各种错误。 6、然后我们深入学习pod和service。 7、深入学习集群工作原理分析,从基础到深度,才能学的扎实。 8、有了pod和service,就需要知道如果发现,学习coreDNS 9、开始部署一些有状态的服务 10、案例实践
黄规速
2022/04/14
1.5K0
k8s实践(1)--k8s集群入门介绍和基础原理
《Kubernetes》,你需要掌握的 Service 和 Ingress
k8s 我们已经从 NameSpace、Pod、PodController到Volumn都介绍过了,相信看完的小伙伴们也会很有收获的~那么今天我们继续来到k8s的课堂,这节我们将要来说下 k8S 搭建完服务后如何访问!
潜行前行
2021/06/25
1.3K0
《Kubernetes》,你需要掌握的 Service 和 Ingress
k8s之HTTP请求负载分发
对于基于HTTP的服务来说,不同的URL地址经常对应不同的后端服务或者虚拟服务器,通常的做法是在应用前添加一个反向代理服务器Nginx,进行请求的负载转发,在Spring Cloud这个微服务框架中,使用zuul网关实现此功能。
Liusy
2020/11/11
8780
k8s之HTTP请求负载分发
如何为服务网格选择入口网关?
在启用了Istio服务网格的Kubernetes集群中,缺省情况下只能在集群内部访问网格中的服务,要如何才能从外部网络访问这些服务呢? Kubernetes和Istio提供了NodePort,LoadBalancer,Kubernetes Ingress,Istio Gateway等多种外部流量入口的方式,面对这么多种方式,我们在产品部署中应该如何选择?
赵化冰
2022/08/01
1.4K0
如何为服务网格选择入口网关?
k8s loadbalancer与ingress实践
k8s可以通过三种方式将集群内服务暴露到外网,分别是NodePort、LoadBalancer、Ingress,其中NodePort作为基础通信形式我们在《k8s网络模型与集群通信》中进行了介绍,这里我们主要关注LoadBalancer和Ingress
你大哥
2022/01/10
1.7K0
k8s loadbalancer与ingress实践
6-Kubernetes入门基础之服务发现Service介绍
描述: K8s中的Service实际上是微服务框架中的微服务,Service定义了一个服务的访问入口,可以通过该入口访问其背后一组的有Pod副本组成的集群实例;
全栈工程师修炼指南
2022/09/29
2.8K0
6-Kubernetes入门基础之服务发现Service介绍
最详细的 K8S 学习笔记总结(2021最新版)!建议收藏
虽然 Docker 已经很强大了,但是在实际使用上还是有诸多不便,比如集群管理、资源调度、文件管理等等。那么在这样一个百花齐放的容器时代涌现出了很多解决方案,比如 Mesos、Swarm、Kubernetes 等等,其中谷歌开源的 Kubernetes 是作为老大哥的存在。
民工哥
2021/04/18
9.4K2
k8s 知识总结
K8S(Kubernetes缩写)是容器编排引擎,用于实现自动化运维管理容器。 核心功能:
willsonchen
2024/01/22
4430
k8s-service
Kubernetes Service定义了这样一种抽象:一个Pod的逻辑分组,一种可以访问它们的策略-通常称为微服务。这一组Pod能够被Service访问到,通常是通过Label selector
eadela
2019/12/11
8850
相关推荐
聊聊k8s服务发现的优缺点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文