K8S集群优化之修复ServiceEndpoint更新的延迟

简介: 几个月前,我在更新 Kubernetes 集群中的 Deployment 时发现了一个很奇怪的连接超时现象,在更新 Deployment 之后的 30 秒到两分钟左右,所有与以该 Deployment作为服务后端的 Service 的连接都会超时或失败。

几个月前,我在更新 Kubernetes 集群中的 Deployment 时发现了一个很奇怪的连接超时现象,在更新 Deployment 之后的 30 秒到两分钟左右,所有与以该 Deployment作为服务后端的 Service 的连接都会超时或失败。同时我还注意到其他应用在这段时间内也会出现莫名其妙的延迟现象。

一开始我怀疑是应用没有优雅删除导致的,但当我在更新 Deployment 的过程中(删除旧的 Pod,启动新的 Pod)通过 curl 来测试该应用的健康检查(liveness)和就绪检查(readiness)Endpoints 时,很快就排除了这个可能性。

我开始怀疑人生,开始怀疑我的职业选择,几个小时之后我忽然想起来 Service 并不是直接与 Deployment关联的,而是按照标签对一组提供相同功能的 Pods的抽象,并为它们提供一个统一的入口。更重要的是,Service 是由一组 Endpoint 组成的,只要Service中的一组Pod发生变更,Endpoint就会被更新。

想到这里,就可以继续排查问题了。下面在更新 Deployment的过程中通过 watch 命令来观察有问题的 Service 的 Endpoint。

$ watch kubectl describe endpoints [endpoint name]
然后我就发现了罪魁祸首,在旧 Pod被移除的 30 秒到几分钟左右的时间段内,这些被删除的Pod的 IP:Port 仍然出现在Endpoint 的就绪列表中,同时新启动的 Pod的IP:Port也没有被添加到 Endpoint中。终于发现了连接失败的根源,但是为什么会出现这种状况呢?仍然无解。

又经历了几天折腾之后,我又有了新点子,那就是调试负责更新Endpoint 的组件:kube-controller-manager,最后终于在kube-controller-manager 的日志输出中发现了如下可疑的信息:

I0412 22:59:59.914517 1 request.go:638] Throttling request took 2.489742918s, request: GET:https://10.3.0.1:443/api/v1/namespaces/[some namespace]/endpoints/[some endpoints]"
但还是感觉哪里不对劲,明明延迟了几分钟,为什么这里显示的只有两秒?

在阅读了kube-controller-manager的源码后,我发现了问题所在。Kube-controller-manager的主要职责是通过内部的众多 Controller将集群的当前状态调整到期望状态,其中 Endpoint Controller用于监控Pod 的生命周期事件并根据这些事件更新 Endpoint。

Endpoint Controller 内部运行了一组 workers来处理这些事件并更新Endpoint,如果有足够多的对 Endpoint发起的请求被阻塞,那么所有的 workers 都会忙于等待被阻塞的请求,这时候新事件只能被添加到队列中排队等待,如果该队列很长,就会花很长时间来更新 Endpoint。

为了解决这个问题,首先我通过调整kube-controller-manager 的 参数--concurrent-endpoints-syncs来增加Endpoint Controller的workers,但收效甚微。

再次仔细阅读源码后,我找到了两个可以可以扭转战局的参数:--kube-api-qps 和--kube-api-burst。kube-controller-manager可以通过这两个参数来限制任何 Controller(包括 Endpoint Controller)对 kube-apiserver发起的请求的速率。

这两个参数的默认值是20,但当集群中的主机数量非常多时,默认值显然不满足集群运行的工作负载。经过不断调试之后,我将参数 --kube-api-qps的值设置为 300,将 --kube-api-burst的值设置为 325,上面的日志信息便消失了,同时添加或移除Pod 时Endpoint也能够立即更新。

--kube-api-qps 和--kube-api-burst参数的值越大,kube-apiserver 和etcd 的负载就越高。在我的集群中,通过适当地增加一些负载来解决这个问题是很值得的。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
Kubernetes Ubuntu 应用服务中间件
在Ubuntu22.04 LTS上搭建Kubernetes集群
在Ubuntu22.04.4上安装Kubernetes v1.28.7,步骤超详细
325 1
在Ubuntu22.04 LTS上搭建Kubernetes集群
|
2月前
|
Kubernetes 安全 Docker
在 K8s 集群中创建 DERP 服务器
在 K8s 集群中创建 DERP 服务器
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【2月更文挑战第29天】 在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。然而,随着集群规模的扩大和业务复杂度的提升,有效的监控和日志管理变得至关重要。本文将探讨构建高效 Kubernetes 集群监控系统的策略,以及实施日志聚合和分析的最佳实践。通过引入如 Prometheus 和 Fluentd 等开源工具,我们旨在为运维专家提供一套完整的解决方案,以保障系统的稳定性和可靠性。
|
20天前
|
数据库 存储 监控
什么是 SAP HANA 内存数据库 的 Delta Storage
什么是 SAP HANA 内存数据库 的 Delta Storage
16 0
什么是 SAP HANA 内存数据库 的 Delta Storage
|
2天前
|
存储 运维 Kubernetes
Kubernetes 集群的持续性能优化实践
【4月更文挑战第22天】在动态且复杂的微服务架构中,确保 Kubernetes 集群的高性能运行是至关重要的。本文将深入探讨针对 Kubernetes 集群性能优化的策略与实践,从节点资源配置、网络优化到应用部署模式等多个维度展开,旨在为运维工程师提供一套系统的性能调优方法论。通过实际案例分析与经验总结,读者可以掌握持续优化 Kubernetes 集群性能的有效手段,以适应不断变化的业务需求和技术挑战。
13 4
|
9天前
|
Kubernetes 搜索推荐 Docker
使用 kubeadm 部署 Kubernetes 集群(二)k8s环境安装
使用 kubeadm 部署 Kubernetes 集群(二)k8s环境安装
48 17
|
22天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
16 0
|
23天前
|
Kubernetes 安全 网络安全
搭建k8s集群kubeadm搭建Kubernetes二进制搭建Kubernetes集群
搭建k8s集群kubeadm搭建Kubernetes二进制搭建Kubernetes集群
104 0
|
29天前
|
Kubernetes Cloud Native Docker
【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0
Kubernetes 是一个开源平台,用于管理容器化工作负载和服务,提供声明式配置和自动化。源自 Google 的大规模运维经验,它拥有广泛的生态支持。本文档详细介绍了 Kubernetes 集群的搭建过程,包括服务器配置、Docker 和 Kubernetes 组件的安装,以及 Master 和 Node 的部署。此外,还提到了使用 Calico 作为 CNI 网络插件,并提供了集群功能的测试步骤。
218 0
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践
【2月更文挑战第31天】 在微服务架构日益普及的今天,容器编排工具如Kubernetes已成为部署、管理和扩展容器化应用的关键平台。然而,随着集群规模的扩大和业务复杂性的增加,如何有效监控集群状态、及时响应系统异常,以及管理海量日志信息成为了运维人员面临的重要挑战。本文将深入探讨 Kubernetes 集群监控的最佳实践和日志管理的高效策略,旨在为运维团队提供一套系统的解决思路和操作指南。
27 0