首页 > 其他分享 >k8s滚动更新也翻车

k8s滚动更新也翻车

时间:2024-09-29 17:35:41浏览次数:1  
标签:副本 滚动 Kubernetes 更新 翻车 服务 Pod k8s

滚动更新也翻车:为什么 Kubernetes 看似无缝的更新也会影响服务

原创 eshou 原生时光    2024年09月29日 08:45 湖南 听全文

在 Kubernetes 中,滚动更新被视为一种无缝升级服务的理想方式。

然而,实际操作中,即便是看似完美的滚动更新,也可能暗藏影响服务可用性的风险,在我们的生产环境中也碰到了这种实际问题,我们的开发人者反馈说在发布版本的过程中有请求失败的情况。

为什么会这样?本节将探讨滚动更新的工作原理,揭示其中潜在的问题,并提供解决方案,帮助你在 Kubernetes 中实现真正无缝的服务升级。

图片


01


滚动更新原理图片首先,让我们简要回顾一下 Kubernetes 的滚动更新机制。滚动更新允许你逐步替换旧版本的 Pod,以实现应用的无缝升级,这个过程通常包括以下步骤:
  • 创建一个新的 Pod 以运行新的应用版本

  • 等待新的 Pod 变为就绪状态

  • 终止一个旧的 Pod

  • 重复上述步骤,直到所有旧的 Pod 都被替换为新的版本

看起来,这个过程应该是无缝的,对吧?但事实并非总是如此。

 

02

潜在的问题图片
  1. 旧的副本很快销毁:当 Kubernetes 终止一个 Pod 时,它会发送一个 TERM 信号,应用程序需要在接收到这个信号后,完成当前处理的请求并拒绝新的请求。然而,如果应用程序没有正确处理这个信号,Pod 可能会立即退出,导致未完成的请求被中断
  2. 新副本启动太慢:在 Kubernetes 中进行滚动更新时,新副本启动太慢可能会导致新连接被调度到尚未完全启动的新副本上,从而影响服务的可用性
  3. 资源竞争:在滚动更新过程中,新的 Pod 和旧的 Pod 会同时运行一段时间,这可能会导致资源竞争。如果集群资源不足,可能会导致新的 Pod 无法成功启动,或者旧的 Pod 无法正常终止,从而影响服务的可用性

03

 哪些解决方案

图片

  • 合理设置 terminationGracePeriodSeconds 和 preStop 钩子:通过配置 terminationGracePeriodSeconds 和 preStop 钩子,可以确保旧 Pod 在终止前有足够的时间完成清理工作,并确保新 Pod 准备就绪

spec:  terminationGracePeriodSeconds: 60  containers:  - name: example-container    lifecycle:      preStop:        exec:          command: ["/bin/sh", "-c", "sleep 30"]
  • 使用 Readiness Probe:Readiness  Probe 用于检测 Pod 是否已经准备好接收流量。通过配置 Readiness Probe,可以确保只有在 Pod 完全准备好后,才会接收流量,从而避免服务中断
readinessProbe:  httpGet:    path: /health    port: 80  initialDelaySeconds: 5  periodSeconds: 10
  • 资源规划:在进行滚动更新前,确保集群有足够的资源来同时运行新旧两个版本的 Pod,确保资源充足
04结语

虽然 Kubernetes 提供了强大的滚动更新机制,但在实际操作中,仍然需要考虑各种潜在问题,以确保服务的高可用性通过优化应用程序启动时间、正确配置 Readiness Probe、合理规划资源、以及使用 preStop 钩子,可以有效减少新副本启动太慢导致的新连接被调度到未完全启动副本上的问题。这些措施不仅能够提高服务的可用性和稳定性,还能确保在滚动更新过程中实现平滑过渡,为用户提供更可靠的服务体验。往期精彩回顾



你是否正确使用了 VPA?一文带你全面了解如何充分发挥其优势

KEDA:解锁 Kubernetes 自动扩缩的无限可能

从容应对突发流量:HPA 如何为你的应用保驾护航

Kyverno:让 Kubernetes 集群合规性和一致性触手可及

阅读 6   ​

标签:副本,滚动,Kubernetes,更新,翻车,服务,Pod,k8s
From: https://www.cnblogs.com/cheyunhua/p/18440459

相关文章

  • 【风光不确定】基于多时间尺度滚动优化算法的主动配电网研究【IEEE33节点】(Matlab代码
    目录......
  • Karmada新版本发布,支持联邦应用跨集群滚动升级
    本文分享自华为云社区《Karmadav1.11版本发布!新增应用跨集群滚动升级能力》,作者:云容器大未来。Karmada是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容Kubernetes原生API的能力,Karmada可以平滑迁移单集群工作负载,并且仍可保持与K......
  • k8s离线部署v1.28.0版本(基于docker容器)
    1.环境配置主机名配置磁盘大小操作系统ip地址k8s-master2c4g50gcentos7.6192.168.100.194k8s-node12c4g50gcentos7.6192.168.100.195k8s-node22c4g50gcentos7.6192.168.100.196yum2c4g50gcentos7.6192.168.100.2012.必要环境准备1)关......
  • sidecar机制在k8s中的使用场景
    在Kubernetes中,Sidecar模式可以用于多种场景,除了日志收集外,以下是一些常见的应用场景:1.代理和负载均衡Sidecar可以充当服务代理,处理入站和出站的流量,进行负载均衡和请求路由。例如,使用Envoy或Linkerd作为Sidecar,可以实现服务间的负载均衡、熔断和重试机制。2.监控和......
  • 在K8S中使用Argo CD做持续部署
    什么是ArgoCDArgoCDisadeclarative,GitOpscontinuousdeliverytoolforKubernetes.ArgoCD是一个基于Kubernetes的声明式的GitOps工具。在说ArgoCD之前,我们先来了解一下什么是GitOps。什么是GitOpsGitOps是以Git为基础,使用CI/CD来更新运行在云原生环境的应用,它秉......
  • k8s常用取证命令
    显示和查找资源列出所有namespace中的所有service$kubectlgetservices列出所有namespace中的所有pod$kubectlgetpods--all-namespaces列出所有pod并显示详细信息$kubectlgetpods-owide列出指定deployment$kubectlgetdeploymentmy-dep列出该nam......
  • k8s安装并迁移jumpserver
    一、环境二、安装依赖服务以下操作按需操作1.安装Helmwgethttps://get.helm.sh/helm-v3.12.1-linux-amd64.tar.gztarxfhelm-v3.12.1-linux-amd64.tar.gzmvlinux-amd64/helm/usr/local/bin/helmversionhelmrepoaddjumpserverhttps://jumpserver.github.io/helm-char......
  • 262.行程与用户(如何计算每日/3日滚动/5日滚动订单取消率
    1.题目你需要编写一个SQL解决方案,计算2013-10-01至2013-10-03期间,非禁止用户的取消率。非禁止用户是指banned字段为'No'的用户。取消率的计算需要满足以下条件:乘客和司机都必须未被禁止,即他们的banned字段值均为'No'。取消率的计算公式为:取消率 (Cancellation......
  • 大模型训练:K8s 环境中数千节点存储最佳实践
    今天这篇博客来自全栈工程师朱唯唯,她在前不久举办的KubeCon中国大会上进行了该主题分享。Kubernetes已经成为事实的应用编排标准,越来越多的应用在不断的向云原生靠拢。与此同时,人工智能技术的迅速发展,尤其是大型语言模型(LLM)的推进,导致企业需要处理的数据量急剧增加,例如,Llama......
  • 作为一名测试工程师如何学习Kubernetes(k8s)技能
    前言Kubernetes(K8s)作为云原生时代的关键技术之一,对于运维工程师、开发工程师以及测试工程师来说,都是一门需要掌握的重要技术。作为一名软件测试工程师,学习Kubernetes是一个有助于提升自动化测试、容器化测试以及云原生应用测试能力的重要过程。以下是一个系统性的学习路径......